Here's the config, I refrained from stripping anything since there might be side effects, so it's a bit complex, I hope I cut out all sensitive information. The config (sort of) grew historically, so all comments on the config are appreciated, also beyond WG.
The router has two public IPs and provides remote access to a small (< 20) group of people in the context of amateur radio; the working principle is quite simple: It accepts incoming WG connections from DFN and routes all traffic via bridge-LST. SSTP and L2TP dialin is configured but only used as a fallback if WG does not work. Port-knocking is only needed for SSTP and L2TP. I realised that a few WG peers are in /24 rather than /32, but I guess this is not of significance.
# apr/01/2022 20:57:57 by RouterOS 7.1.5
# software id = MZRN-97EY
#
# model = RB450Gx4
/interface bridge
add name=bridge-LST
/interface ethernet
set [ find default-name=ether1 ] name=DFN
/interface wireguard
add listen-port=XXXX mtu=1420 name=wireguard1
/interface list
add name=LAN
add name=WAN
/interface wireless security-profiles
set [ find default=yes ] supplicant-identity=MikroTik
/ip pool
add comment="PPP Dialin Local" name=Dialin-IPs-Local ranges=\
10.AAA.BBB.1-10.AAA.BBB.150
add comment="PPP Dialin remote" name=DialinIPs-Remote ranges=\
10.AAA.BBB.151-10.AAA.BBB.250
/port
set 0 name=serial0
/ppp profile
add change-tcp-mss=yes local-address=Dialin-IPs-Local name=Dialin-ITSEC \
on-down=Telegram-notify-hangup on-up=Telegram-notify-dialin \
remote-address=DialinIPs-Remote use-encryption=required use-mpls=yes
set *FFFFFFFE use-encryption=required
/routing table
add fib name=viaDFN
/system logging action
add name=TelegramNotify target=memory
/interface bridge port
add bridge=bridge-LST ingress-filtering=no interface=ether2
add bridge=bridge-LST ingress-filtering=no interface=ether3
add bridge=bridge-LST ingress-filtering=no interface=ether4
add bridge=bridge-LST ingress-filtering=no interface=ether5
/ip neighbor discovery-settings
set discover-interface-list=!WAN
/ipv6 settings
set disable-ipv6=yes
/interface l2tp-server server
set authentication=mschap2 default-profile=Dialin-ITSEC enabled=yes \
use-ipsec=required
/interface list member
add interface=bridge-LST list=LAN
add interface=ether2 list=LAN
add interface=ether3 list=LAN
add interface=ether4 list=LAN
add interface=ether5 list=LAN
add interface=wireguard1 list=LAN
add interface=DFN list=WAN
/interface sstp-server server
set authentication=mschap2 enabled=yes tls-version=only-1.2
/interface wireguard peers
add allowed-address=10.100.100.2/32 interface=\
wireguard1 public-key=" ...uVqYmPyVR9eboiMBiU="
add allowed-address=10.100.100.3/32 interface=wireguard1 \
public-key="...pWg24k+tTtCFypq1ryVnw="
add allowed-address=10.100.100.4/32 interface=wireguard1 \
persistent-keepalive=1m public-key=\
"...Rab5Q3Qh4DgSDBg0="
add allowed-address=10.100.100.5/32 interface=\
wireguard1 public-key="...JfLZyWEj9boA9Yz36Az4="
(peers 6-28 deleted)
add allowed-address=10.100.100.29/24 interface=wireguard1 \
persistent-keepalive=1m public-key=\
"...bKeowbNGQsuPvK5s8kpGqlE="
/ip address
add address=DDD.EEE.FFF.114/27 interface=DFN network=DDD.EEE.FFF.96
add address=10.100.100.1/24 interface=wireguard1 network=10.100.100.0
/ip dhcp-client
add interface=bridge-LST
/ip dns
set allow-remote-requests=yes
/ip firewall address-list
add address=0.0.0.0/8 comment=RFC6890 list=not_in_internet
add address=172.16.0.0/12 comment=RFC6890 list=not_in_internet
add address=192.168.0.0/16 comment=RFC6890 list=not_in_internet
add address=10.0.0.0/8 comment=RFC6890 list=not_in_internet
add address=169.254.0.0/16 comment=RFC6890 list=not_in_internet
add address=127.0.0.0/8 comment=RFC6890 list=not_in_internet
add address=224.0.0.0/4 comment=Multicast list=not_in_internet
add address=198.18.0.0/15 comment=RFC6890 list=not_in_internet
add address=192.0.0.0/24 comment=RFC6890 list=not_in_internet
add address=192.0.2.0/24 comment=RFC6890 list=not_in_internet
add address=198.51.100.0/24 comment=RFC6890 list=not_in_internet
add address=203.0.113.0/24 comment=RFC6890 list=not_in_internet
add address=100.64.0.0/10 comment=RFC6890 list=not_in_internet
add address=240.0.0.0/4 comment=RFC6890 list=not_in_internet
add address=192.88.99.0/24 comment="6to4 relay Anycast [RFC 3068]" list=\
not_in_internet
add address=AAA.BBB.11.0/24 comment="ITSEC subnet" list=allowed_to_router
add address=10.AAA.232.0/24 comment=wireguard disabled=yes list=\
allowed_to_router
add address=10.AAA.BBB.0/24 comment="PPP (L2TP and SSTP) addresses" list=\
allowed_to_router
add address=10.100.100.0/24 comment=wireguard list=allowed_to_router
add address=10.100.101.0/24 comment=wireguard list=allowed_to_router
/ip firewall filter
add action=fasttrack-connection chain=input comment=\
"fasttrack establised and related" connection-state=established,related \
hw-offload=yes
add action=accept chain=input comment="Accept establised and related" \
connection-state=established,related
add action=accept chain=forward comment=TESTESTEST connection-state=related \
disabled=yes
add action=add-src-to-address-list address-list=Port-Knock1 \
address-list-timeout=1s chain=input comment=\
"********** Port Knocking - Knock1" dst-port=12345 protocol=tcp
add action=add-src-to-address-list address-list=Port-Knock2 \
address-list-timeout=1s chain=input comment=Knock2 dst-port=12346 \
protocol=tcp src-address-list=Port-Knock1
add action=add-src-to-address-list address-list=Port-Knock-Safe \
address-list-timeout=1h23m chain=input comment="Add to Safe" dst-port=\
12347 log-prefix="Port-Knock IP white listed: " protocol=tcp \
src-address-list=Port-Knock2
add action=drop chain=input comment="drop if stored" dst-port=12347 \
log-prefix="LOGALERT " protocol=tcp src-address-list=\
Port-Knock-Safe_permanent
add action=add-src-to-address-list address-list=Port-Knock-Safe_permanent \
address-list-timeout=none-static chain=input comment="store permanently" \
dst-port=12347 log=yes log-prefix="LOGALERT " protocol=tcp \
src-address-list=Port-Knock2
add action=add-src-to-address-list address-list=Port-Knock1 \
address-list-timeout=8s chain=input comment=\
"********** Port Knocking - Knock (long clearance)" dst-port=12348 \
protocol=tcp
add action=add-src-to-address-list address-list=Port-Knock2 \
address-list-timeout=8s chain=input comment=Knock2 dst-port=12349 \
protocol=tcp src-address-list=Port-Knock1
add action=add-src-to-address-list address-list=Port-Knock3 \
address-list-timeout=8s chain=input comment=Knock3 dst-port=12350 \
protocol=tcp src-address-list=Port-Knock2
add action=add-src-to-address-list address-list=Port-Knock-Safe \
address-list-timeout=8h chain=input comment="Add to Safe" dst-port=12351 \
log-prefix="Port-Knock IP white listed: " protocol=tcp src-address-list=\
Port-Knock3
add action=drop chain=input comment="drop if already stored" dst-port=12351 \
log-prefix="LOGALERT " protocol=tcp src-address-list=\
Port-Knock-Safe_permanent
add action=add-src-to-address-list address-list=Port-Knock-Safe_permanent \
address-list-timeout=none-static chain=input comment=\
"Add to permanent storage" dst-port=12351 log=yes log-prefix="LOGALERT " \
protocol=tcp src-address-list=Port-Knock3
add action=accept chain=input comment=\
"PING Accept icmp from DFN from Port Knock Safe addresses" \
connection-state="" disabled=yes in-interface=DFN log=yes log-prefix=\
"DFN icmp:" protocol=icmp src-address-list=Port-Knock-Safe
add action=accept chain=input comment=\
"DFN: Accept SSTP from port-knock Safe addresses" dst-port=443 \
in-interface=DFN protocol=tcp src-address-list=Port-Knock-Safe
add action=accept chain=input comment=\
"DFN: Accept L2TP from port-knock Safe addresses" dst-port=1701,500,4500 \
in-interface=DFN protocol=udp src-address-list=Port-Knock-Safe src-port=\
""
add action=accept chain=input in-interface=DFN protocol=ipsec-ah \
src-address-list=Port-Knock-Safe
add action=accept chain=input comment="DFN: accept Wireguard incoming" \
dst-port=XXXX in-interface=DFN log=yes log-prefix="WG1 in" protocol=udp
add action=accept chain=input comment="DFN: accept icmp" in-interface=DFN \
protocol=icmp
add action=drop chain=input comment="DFN: drop all else" in-interface=DFN
add action=accept chain=input dst-port=8291,80,22,23,443 in-interface=\
bridge-LST protocol=tcp
add action=accept chain=input comment=\
"Accept intput from known IPs (Lst and VPN IPs) " log-prefix=XXX \
src-address-list=allowed_to_router
add action=drop chain=input comment=CATCHALL log-prefix="C i:"
add action=fasttrack-connection chain=forward comment="***********************\
****************************** FORWARD: FastTrack" connection-state=\
established,related hw-offload=yes
add action=accept chain=forward comment="Established, Related" \
connection-state=established,related
add action=drop chain=forward comment="Drop invalid" connection-state=invalid \
disabled=yes log=yes log-prefix=invalid
add action=drop chain=forward comment=\
"Drop arriving packets that are not dst-NAT`ted" connection-nat-state=\
!dstnat connection-state=new in-interface=DFN log=yes log-prefix=!NAT
add action=jump chain=forward comment="jump to ICMP filters" jump-target=icmp \
protocol=icmp
add action=accept chain=forward comment=\
"Accept allowed addresses (inclding VPN IPs)" src-address-list=\
allowed_to_router
add action=drop chain=forward comment=CATCHALL log=yes log-prefix="C fw: "
add action=accept chain=icmp comment=\
"********************************************* ICMP chain: echo reply" \
icmp-options=0:0 protocol=icmp
add action=accept chain=icmp comment="net unreachable" icmp-options=3:0 \
protocol=icmp
add action=accept chain=icmp comment="host unreachable" icmp-options=3:1 \
protocol=icmp
add action=accept chain=icmp comment=\
"host unreachable fragmentation required" icmp-options=3:4 protocol=icmp
add action=accept chain=icmp comment="allow echo request" icmp-options=8:0 \
protocol=icmp
add action=accept chain=icmp comment="allow time exceed" icmp-options=11:0 \
protocol=icmp
add action=accept chain=icmp comment="allow parameter bad" icmp-options=12:0 \
protocol=icmp
add action=drop chain=icmp comment="deny all other types"
/ip firewall nat
add action=masquerade chain=srcnat disabled=yes log=yes log-prefix="mDFN: " \
out-interface=DFN
add action=masquerade chain=srcnat log-prefix="masq WG: " out-interface=\
bridge-LST
/ip route
add dst-address=0.0.0.0/0 gateway=DDD.EEE.FFF.118 routing-table=viaDFN
/ipv6 firewall address-list
add address=fe80::/16 list=allowed
/ppp secret
add name=jp profile=Dialin-ITSEC
add name=hAP-ITSEC profile=Dialin-ITSEC
/routing rule
add action=lookup-only-in-table disabled=no src-address=DDD.EEE.FFF.114/32 \
table=viaDFN
/system clock
set time-zone-name=Europe/Berlin
/system identity
set name=ITSEC-Wireguard
/system logging
add action=TelegramNotify topics=error
add action=TelegramNotify topics=critical
add action=TelegramNotify topics=account
/system ntp client
set enabled=yes
/system ntp client servers
add address=pool.ntp.org
/system package update
set channel=development
/system routerboard settings
set cpu-frequency=auto
/system scheduler
add name=Telegram on-event=Report-Boot-To-Telegram policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
start-time=startup
add interval=2m name=ReportLogsToTelegram on-event=TelegramLogParser policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
start-time=startup
add comment="jun/05/2021 18:00:01" interval=5m name=ScanLogEntriesAndNotify \
on-event="/system script run ScanLogEntriesAndNotify" policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
start-date=may/29/2020 start-time=00:00:00
/system script
add dont-require-permissions=no name=Report-Boot-To-Telegram owner=admin \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
source=":delay 61s\r\
\n\r\
\n/tool fetch url=\"https://api.telegram.org/botX:Y/sendMessage\\\?chat_id=Z&text=BOOTED \$[/\
system identity get name] \$[/system clock get time] \$[/system clock get \
date] UPTIME \$[/system resource get uptime] \" keep-result=no"
add dont-require-permissions=no name=ScanLogEntriesAndNotify owner=admin \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
source="#:log info (\"Test: Starting logmon\");\r\
\n# BEGIN SETUP\r\
\n:local scheduleName \"ScanLogEntriesAndNotify\"\r\
\n:local emailAddress \"email@example.com\"\r\
\n:local startBuf [:toarray [/log find message~\"LOGALERT\"]]\r\
\n#:local removeThese {\"telnet\";\"whatever string you want\"}\r\
\n:local removeThese {\"ipfw.drop.WAN\"}\r\
\n# END SETUP\r\
\n\r\
\n# warn if schedule does not exist\r\
\n:if ([:len [/system scheduler find name=\"\$scheduleName\"]] = 0) do={\r\
\n /log warning \"[LOGMON] ERROR: Schedule does not exist. Create schedul\
e and edit script to match name\"\r\
\n}\r\
\n\r\
\n# get last time\r\
\n:local lastTime [/system scheduler get [find name=\"\$scheduleName\"] co\
mment]\r\
\n# for checking time of each log entry\r\
\n:local currentTime\r\
\n# log message\r\
\n:local message\r\
\n \r\
\n# final output\r\
\n:local output\r\
\n\r\
\n:local keepOutput false\r\
\n# if lastTime is empty, set keepOutput to true\r\
\n:if ([:len \$lastTime] = 0) do={\r\
\n :set keepOutput true\r\
\n}\r\
\n\r\
\n\r\
\n:local counter 0\r\
\n# loop through all log entries that have been found\r\
\n:foreach i in=\$startBuf do={\r\
\n \r\
\n# loop through all removeThese array items\r\
\n :local keepLog true\r\
\n :foreach j in=\$removeThese do={\r\
\n# if this log entry contains any of them, it will be ignored\r\
\n :if ([/log get \$i message] ~ \"\$j\") do={\r\
\n :set keepLog false\r\
\n }\r\
\n }\r\
\n :if (\$keepLog = true) do={\r\
\n \r\
\n :set message [/log get \$i message]\r\
\n\r\
\n# LOG DATE\r\
\n# depending on log date/time, the format may be different. 3 known for\
mats\r\
\n# format of jan/01/2002 00:00:00 which shows up at unknown date/time. \
Using as default\r\
\n :set currentTime [ /log get \$i time ]\r\
\n# format of 00:00:00 which shows up on current day's logs\r\
\n :if ([:len \$currentTime] = 8 ) do={\r\
\n :set currentTime ([:pick [/system clock get date] 0 11].\" \".\$cur\
rentTime)\r\
\n } else={\r\
\n# format of jan/01 00:00:00 which shows up on previous day's logs\r\
\n :if ([:len \$currentTime] = 15 ) do={\r\
\n :set currentTime ([:pick \$currentTime 0 6].\"/\".[:pick [/syste\
m clock get date] 7 11].\" \".[:pick \$currentTime 7 15])\r\
\n }\r\
\n }\r\
\n \r\
\n# if keepOutput is true, add this log entry to output\r\
\n :if (\$keepOutput = true) do={\r\
\n :set output (\$output.\$currentTime.\" \".\$message.\"\\r\\n\")\r\
\n }\r\
\n# if currentTime = lastTime, set keepOutput so any further logs found \
will be added to output\r\
\n# reset output in the case we have multiple identical date/time entrie\
s in a row as the last matching logs\r\
\n# otherwise, it would stop at the first found matching log, thus all f\
ollowing logs would be output\r\
\n :if (\$currentTime = \$lastTime) do={\r\
\n :set keepOutput true\r\
\n :set output \"\"\r\
\n }\r\
\n }\r\
\n\r\
\n# if this is last log entry\r\
\n :if (\$counter = ([:len \$startBuf]-1)) do={\r\
\n# If keepOutput is still false after loop, this means lastTime has a v\
alue, but a matching currentTime was never found.\r\
\n# This can happen if 1) The router was rebooted and matching logs stor\
ed in memory were wiped, or 2) An item is added\r\
\n# to the removeThese array that then ignores the last log that determi\
ned the lastTime variable.\r\
\n# This resets the comment to nothing. The next run will be like the fi\
rst time, and you will get all matching logs\r\
\n :if (\$keepOutput = false) do={\r\
\n# if previous log was found, this will be our new lastTime entry \
\_ \r\
\n :if ([:len \$message] > 0) do={\r\
\n :set output (\$output.\$currentTime.\" \".\$message.\"\\r\\n\")\
\r\
\n }\r\
\n }\r\
\n }\r\
\n :set counter (\$counter + 1)\r\
\n}\r\
\n\r\
\n# If we have output, save new date/time, and send email\r\
\nif ([:len \$output] > 0) do={\r\
\n /system scheduler set [find name=\"\$scheduleName\"] comment=\$current\
Time\r\
\n# /tool e-mail send to=\"\$emailAddress\" subject=\"MikroTik alert \$cu\
rrentTime\" body=\"\$output\" \r\
\n /tool fetch \"https://api.telegram.org/botX:Y/sendMessage\?chat_id=Z&text=\$[/system iden\
tity get name] \$output\" \r\
\n #/log info \"[LOGMON] New login entry found in logs, send email\"\r\
\n}\r\
\n"
add dont-require-permissions=no name=Telegram-notify-dialin \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
source=":local callerId \$\"caller-id\"\r\
\n\r\
\n/log warning message=\"VPN Dialin at \$[/system clock get date] \$[/syst\
em clock get time] caller: \$callerId \"\r\
\n/tool fetch url=\"https://api.telegram.org/Y/sendMessage\\\?chat_id=Z&text=ITSEC Wireg\
uard: VPN Dialin at \$[/system clock get date] \$[/system clock get time] \
caller: \$callerId \" keep-result=no "
add dont-require-permissions=no name=Telegram-notify-hangup \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
source=":local callerId \$\"caller-id\"\r\
\n/log warning message=\"VPN hangup at \$[/system clock get date] \$[/syst\
em clock get time] peer: \$callerId \"\r\
\n/tool fetch url=\"https://api.telegram.org/Y/sendMessage\\\?chat_id=Z&text=ITSEC Wireg\
uard: VPN hangup at \$[/system clock get date] \$[/system clock get time] \
peer: \$callerId \" keep-result=no "
add dont-require-permissions=no name=TelegramLogParser owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\
global currentBuf [ :toarray [ /log find buffer=TelegramNotify ] ] ;\r\
\n:global currentLineCount [ :len \$currentBuf ] ;\r\
\n:global lastLineCount ;\r\
\n\r\
\n:global message \"\";\r\
\n\r\
\n:if ( \$lastLineCount < \$currentLineCount ) do={ \r\
\n\t:set lastLineCount \$currentLineCount ; \r\
\n\t:set message [/log get [ :pick \$currentBuf (\$currentLineCount-1) ] m\
essage];\r\
\n /tool fetch url=\"https://api.telegram.org/X:Y/sendMessage\\\?chat_id=-Z&\
text=\$[/system identity get name] \$[/system clock get date] \$[/system c\
lock get time] \$message \" keep-result=no \r\
\n } \r\
\n"
/tool bandwidth-server
set enabled=no
/tool graphing interface
add
/tool graphing resource
add
/tool mac-server
set allowed-interface-list=LAN
/tool mac-server mac-winbox
set allowed-interface-list=LAN
/tool romon
set enabled=yes
/tool romon port
add disabled=no forbid=yes interface=DFN