Extrem hohe Pings bei internem Gameserver

Hi,
ich hab da ein kleines Problem und da fiel mir irgendwann ein, dass hier ja auch Mikrotik Profis sind.

Mein Setup: Ne Fritzbox als Modem (Ich weiß nicht optimal aber es sollte funktionieren) die keinerlei Verbindung aufbaut. Dahinter dann nen Mikrotik C53UiG+5HPaxD2HPaxD der sich per PPPOE mit dem DSL der Telekom verbindet.
Internet ist auch stabil und funktioniert soweit alles.

Ich hab intern auf nem Unraid auch den ein oder andern Gameserver laufen für mich und meine Freunde und da fangen die Probleme an. Connectet man von außen also außerhalb des Lans alles super aber wenn ich von internem LAN connecte habe ich Pingzeiten jenseits des Todes (das höchste was ich mal sah war was mit 300000 )

Ich hab im Mikrotik Forum auch schon nen Thread und das ein oder andere gefunden aber die richtige Lösung war leider noch nicht dabei. Mikrotik Forenthread

Ich bin allerdings wirklich kein Mikrotik Profi oder Netzwerkprofi daher bin ich sehr schnell ratlos was das sein könnte.

Ich vermute ihr braucht auch noch die config, das wäre aktuell diese hier

# 2025-03-26 15:20:00 by RouterOS 7.18.2
# software id = KEEF-Y536
#
# model = C53UiG+5HPaxD2HPaxD
# serial number = HGX0A9Z41FA
/interface bridge
add admin-mac=F4:1E:57:2A:33:61 auto-mac=no comment=defconf name=bridge
/interface ethernet
set [ find default-name=ether1 ] advertise=\
    1G-baseT-half,1G-baseT-full,2.5G-baseT rx-flow-control=auto \
    tx-flow-control=auto
set [ find default-name=ether5 ] advertise=1G-baseT-half,1G-baseT-full
/interface wifi
set [ find default-name=wifi1 ] channel.skip-dfs-channels=10min-cac \
    configuration.country=Germany .mode=ap .ssid=Dingsbums disabled=no \
    security.authentication-types=wpa2-psk,wpa3-psk .ft=yes .ft-over-ds=yes
set [ find default-name=wifi2 ] channel.skip-dfs-channels=10min-cac \
    configuration.country=Germany .mode=ap .ssid=Dingsbums disabled=no \
    security.authentication-types=wpa2-psk,wpa3-psk .ft=yes .ft-over-ds=yes
/interface pppoe-client
add add-default-route=yes allow=pap,chap,mschap2 disabled=no interface=ether1 \
    max-mru=1500 max-mtu=1500 name=telekom user=\
    #######################
/interface list
add comment=defconf name=WAN
add comment=defconf name=LAN
/ip pool
add name=default-dhcp ranges=192.168.2.10-192.168.2.254
/ip dhcp-server
add address-pool=default-dhcp interface=bridge lease-time=23h30m name=defconf
/disk settings
set auto-media-interface=bridge auto-media-sharing=yes auto-smb-sharing=yes
/interface bridge port
add bridge=bridge comment=defconf interface=ether2
add bridge=bridge comment=defconf interface=ether3
add bridge=bridge comment=defconf interface=ether4
add bridge=bridge comment=defconf interface=ether5
add bridge=bridge comment=defconf interface=wifi1
add bridge=bridge comment=defconf interface=wifi2
/ip neighbor discovery-settings
set discover-interface-list=LAN
/interface detect-internet
set detect-interface-list=WAN internet-interface-list=WAN lan-interface-list=\
    LAN wan-interface-list=WAN
/interface list member
add comment=defconf interface=bridge list=LAN
add interface=telekom list=WAN
add interface=ether1 list=WAN
/ip address
add address=192.168.2.1/24 comment=defconf interface=bridge network=\
    192.168.2.0
/ip cloud
set ddns-enabled=yes ddns-update-interval=5m
/ip dhcp-client
add comment=defconf disabled=yes interface=ether1
/ip dhcp-server lease
add address=192.168.2.141 client-id=1:b0:41:6f:e:98:51 mac-address=\
    B0:41:6F:0E:98:51 server=defconf
add address=192.168.2.43 client-id=1:52:54:0:93:36:c1 mac-address=\
    52:54:00:93:36:C1 server=defconf
add address=192.168.2.42 client-id=1:52:54:0:5b:1b:68 mac-address=\
    52:54:00:5B:1B:68 server=defconf
add address=192.168.2.40 client-id=1:52:54:0:79:24:fb mac-address=\
    52:54:00:79:24:FB server=defconf
add address=192.168.2.50 client-id=1:e4:5f:1:27:28:b2 mac-address=\
    E4:5F:01:27:28:B2 server=defconf
/ip dhcp-server network
add address=192.168.2.0/24 comment=defconf dns-server=192.168.2.1 gateway=\
    192.168.2.1
/ip dns
set allow-remote-requests=yes servers=8.8.8.8
/ip dns static
add address=192.168.2.1 comment=defconf name=router.lan type=A
/ip firewall address-list
add address=######################## comment=WAN-IP list=WAN-IP
add address=192.168.2.0/24 comment="Lan Subnet" list=LAN-subnet
/ip firewall filter
add action=accept chain=input comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=drop chain=input comment="defconf: drop invalid" connection-state=\
    invalid
add action=accept chain=input comment="defconf: accept ICMP" protocol=icmp
add action=accept chain=input in-interface=!telekom src-address=\
    192.168.2.0/24
add action=accept chain=input comment=\
    "defconf: accept to local loopback (for CAPsMAN)" dst-address=127.0.0.1
add action=drop chain=input comment="defconf: drop all not coming from LAN" \
    in-interface-list=!LAN
add action=accept chain=forward comment="defconf: accept in ipsec policy" \
    ipsec-policy=in,ipsec
add action=accept chain=forward comment="defconf: accept out ipsec policy" \
    ipsec-policy=out,ipsec
add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \
    connection-state=established,related disabled=yes hw-offload=yes
add action=accept chain=forward comment=\
    "defconf: accept established,related, untracked" connection-state=\
    established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" \
    connection-state=invalid
add action=drop chain=forward comment=\
    "defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \
    connection-state=new in-interface-list=WAN
/ip firewall mangle
add action=mark-connection chain=prerouting comment=\
    "Mark connections for hairpin NAT" dst-address-list=WAN-IP \
    new-connection-mark="Hairpin NAT" src-address-list=LAN-subnet
/ip firewall nat
add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark=\
    "Hairpin NAT"
add action=masquerade chain=srcnat comment="defconf: masquerade" \
    ipsec-policy=out,none out-interface-list=WAN
add action=dst-nat chain=dstnat dst-address-list=WAN-IP dst-port=80 protocol=\
    tcp to-addresses=192.168.2.43 to-ports=80
add action=dst-nat chain=dstnat dst-address-list=WAN-IP dst-port=443 \
    protocol=tcp to-addresses=192.168.2.43 to-ports=443
add action=dst-nat chain=dstnat dst-address-list=WAN-IP dst-port=25565-25620 \
    protocol=tcp to-addresses=192.168.2.141
add action=dst-nat chain=dstnat dst-address-list=WAN-IP dst-port=25565-25620 \
    protocol=udp to-addresses=192.168.2.141 to-ports=25565-25620
add action=dst-nat chain=dstnat dst-address-list=WAN-IP dst-port=27000-27050 \
    protocol=tcp to-addresses=192.168.2.141
add action=dst-nat chain=dstnat dst-address-list=WAN-IP dst-port=27000-27050 \
    protocol=udp to-addresses=192.168.2.141
add action=dst-nat chain=dstnat dst-address-list=WAN-IP dst-port=25621-25710 \
    log=yes log-prefix=gametcp protocol=tcp to-addresses=192.168.2.141
add action=dst-nat chain=dstnat dst-address-list=WAN-IP dst-port=25621-25710 \
    log=yes log-prefix=gameudp protocol=udp to-addresses=192.168.2.141
/ip service
set telnet address=192.168.2.0/24
set www disabled=yes
set ssh address=192.168.2.0/24
set api address=192.168.2.0/24
set winbox address=192.168.2.0/24
set api-ssl address=192.168.2.0/24
/ip upnp
set enabled=yes
/ip upnp interfaces
add interface=bridge type=internal
add interface=telekom type=external
/ipv6 address
add address=::1 from-pool=telekom.ipv6 interface=bridge
/ipv6 dhcp-client
add add-default-route=yes interface=telekom pool-name=telekom.ipv6 request=\
    prefix
/ipv6 dhcp-server
add address-pool=telekom.ipv6 interface=bridge name=server1 prefix-pool=\
    telekom.ipv6
/ipv6 firewall address-list
add address=::/128 comment="defconf: unspecified address" list=bad_ipv6
add address=::1/128 comment="defconf: lo" list=bad_ipv6
add address=fec0::/10 comment="defconf: site-local" list=bad_ipv6
add address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped" list=bad_ipv6
add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6
add address=100::/64 comment="defconf: discard only " list=bad_ipv6
add address=2001:db8::/32 comment="defconf: documentation" list=bad_ipv6
add address=2001:10::/28 comment="defconf: ORCHID" list=bad_ipv6
add address=3ffe::/16 comment="defconf: 6bone" list=bad_ipv6
/ipv6 firewall filter
add action=accept chain=input comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=drop chain=input comment="defconf: drop invalid" connection-state=\
    invalid
add action=accept chain=input comment="defconf: accept ICMPv6" protocol=\
    icmpv6
add action=accept chain=input comment="defconf: accept UDP traceroute" \
    dst-port=33434-33534 protocol=udp
add action=accept chain=input comment=\
    "defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=\
    udp src-address=fe80::/10
add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 \
    protocol=udp
add action=accept chain=input comment="defconf: accept ipsec AH" protocol=\
    ipsec-ah
add action=accept chain=input comment="defconf: accept ipsec ESP" protocol=\
    ipsec-esp
add action=accept chain=input comment=\
    "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
add action=drop chain=input comment=\
    "defconf: drop everything else not coming from LAN" in-interface-list=\
    !LAN
add action=fasttrack-connection chain=forward comment="defconf: fasttrack6" \
    connection-state=established,related
add action=accept chain=forward comment=\
    "defconf: accept established,related,untracked" connection-state=\
    established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" \
    connection-state=invalid
add action=drop chain=forward comment=\
    "defconf: drop packets with bad src ipv6" src-address-list=bad_ipv6
add action=drop chain=forward comment=\
    "defconf: drop packets with bad dst ipv6" dst-address-list=bad_ipv6
add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" \
    hop-limit=equal:1 protocol=icmpv6
add action=accept chain=forward comment="defconf: accept ICMPv6" protocol=\
    icmpv6
add action=accept chain=forward comment="defconf: accept HIP" protocol=139
add action=accept chain=forward comment="defconf: accept IKE" dst-port=\
    500,4500 protocol=udp
add action=accept chain=forward comment="defconf: accept ipsec AH" protocol=\
    ipsec-ah
add action=accept chain=forward comment="defconf: accept ipsec ESP" protocol=\
    ipsec-esp
add action=accept chain=forward comment=\
    "defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
add action=drop chain=forward comment=\
    "defconf: drop everything else not coming from LAN" in-interface-list=\
    !LAN
/ipv6 nd
set [ find default=yes ] hop-limit=64 interface=bridge
/system clock
set time-zone-name=Europe/Berlin
/system note
set show-at-login=no
/system routerboard mode-button
set enabled=yes on-event=dark-mode
/system routerboard wps-button
set enabled=yes on-event=wps-accept
/system scheduler
add interval=1d name=backup policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    start-date=2025-03-25 start-time=01:13:44
/system script
add comment=defconf dont-require-permissions=no name=dark-mode owner=*sys \
    policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    source="\r\
    \n   :if ([system leds settings get all-leds-off] = \"never\") do={\r\
    \n     /system leds settings set all-leds-off=immediate \r\
    \n   } else={\r\
    \n     /system leds settings set all-leds-off=never \r\
    \n   }\r\
    \n "
add comment=defconf dont-require-permissions=no name=wps-accept owner=*sys \
    policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    source="\r\
    \n   :foreach iface in=[/interface/wifi find where (configuration.mode=\"a\
    p\" && disabled=no)] do={\r\
    \n     /interface/wifi wps-push-button \$iface;}\r\
    \n "
/tool mac-server
set allowed-interface-list=LAN
/tool mac-server mac-winbox
set allowed-interface-list=LAN
/tool netwatch
add disabled=no down-script="" host=192.168.2.141 http-codes="" test-script=\
    "" type=simple up-script=""
/tool sniffer
set filter-ip-address=192.168.2.141/32

Ich hoffe hier ist noch der ein oder andere Profi der mir weiterhelfen kann :smiley:

Achja, ohne den Mikrotik mit der Fitzbox vorher lief das Problemlos und ich hatte diese Fehler nicht. Sie kamen erst mit dem Mikrotik Router.

P.S.: Falls es hilfreich ist, man kann sich auch im Discord treffen, ist vielleicht einfacher?

Moin,
Soweit ich die Config verstehe, versuchst du die Verbindungen im „mangle“ zu markieren und dann ein SRC-NAT zu machen auf die WAN-IP. Das klingt für mich nicht wirklich sinnvoll. Denn die Pakete verlassen ja den Router erst gar nicht.
Aber mir fehlen auch noch Infos. Wie connectest du von außen? Über DynDNS-Name, wenn ja, wie ist der umgesetzt? Versuchst du es intern auch über den DynDNS-Namen oder über die interne IP?

Naja das ist dieses Hairpin NAT, wieso auch immer brauchen die Mikrotik Router das damit überhaupt eine Verbindung innerhalb des Netzwerks funktioniert wenn das Ziel, die WAN-IP innerhalb des eigenen Netztes hinter nem NAT liegt.

Deaktiviere ich das kann ich weder internen Webserver noch sonst ein Service intern erreichen. Auch wenn ich die DNS direkt umschreibe… Wieso versteht kein Mensch aber wann immer das Ziel im internen Netz liegt gehts nur mit dem Hairpin NAT…zumindest wurd mir das gesagt und wenn ichs deaktiviere geht halt auch nix mehr :smiley:

Das ganze geht übers Steam Netzwerk, Steam connected dann auf die WAN IP auf den angegebenen Ports. Von extern funktionierts auch problemlos. Von intern halt nur mit nem high ping.Und ja theoretisch sollte mit den Regeln der ROuter kapieren dass es die interne Kiste ist aber ja… was soll ich sagen.

Ich bin halt leider kein Mikrotik Profi und wüsste nicht wie ichs sonst regeln soll.
Man findet immer nur das Hairpin NAT als Lösung.

Die WAN IP ist mittels dyndns immer die aktuelle öffentliche IP des Anschlusses /Routers

Ich glaub halt das is irgendein Loop oder sowas der einfach falsch konfiguriert ist

Eine Connection zum Server mit der internen IP funktioniert nicht da das Game übers Steamnetzwerk prüft ob der Server erreichbar ist.

Also MikroTik beschreibt das in ihrer Doku anders (und auch für mich logisch) als hier

Jup da gibts wohl tausend Wege das umzusetzen und je nachdem wo man schaut ist es immer ein anderer Weg, selbst in der Mikrotik Doku sind da unterschiedliche Angaben, je nachdem welche Doku man hat oder unter welchem Punkt man es gefunden hat.
Meins ist halt aus nem best practice aus dem Mikrotik Forum

Aber hey, wenn es anders geht, nur her damit… Es kann ja nicht schlimmer werden

Ich empfehle, wenn vorhanden, immer die offizielle Doku von denen…
Hab es gerade nach deren Doku getestet und das funktioniert…

Aber wenn es mit internem DNS anders zu regeln wäre, wäre das der bessere Weg, denn so müssen alle Pakete immer über den Router… (auch intern!)

Ohne Hairpin gehts eben nicht, das sagt auch die offizielle Doku da der Router halt die IP direkt mit der internen IP ersetzen würde und da der Client mit ner andern IP anfragt, werden die Packete verworfen.

  1. the server replies to the client’s request. However, the source IP address of the request is on the same subnet as the web server. The web server does not send the reply back to the router but sends it back directly to 10.0.0.2 with a source IP address in the reply of 10.0.0.3;
  2. The client receives the reply packet, but it discards it because it expects a packet back from 172.16.16.1, and not from 10.0.0.3;

In der Doku wird das dann mit ner Regel aufgelöst und maskiert

add action=masquerade chain=srcnat dst-address=10.0.0.3 out-interface=LAN protocol=tcp src-address=10.0.0.0/24

Das ist genau das was ich an der Stelle tue

Mit ner internen DNS Umschreibung hab ichs auch versucht aber das hat nicht funktioniert, wäre ja für mich das einfachste.

Nein tust du nicht. Du trackst eine Connection und versuchst die dann auf dem WAN mittels SRC-NAT rauszuschieben. Das WAN ist ja gar nicht betroffen. Woher kriegen die DST-NAT-Regeln immer ihre aktuelle Destination-IP?

Ok was tue ich… Ich setze einen Mark für alles was als Ziel die WAN IP hat und aus dem internen Netz kommt

/ip firewall mangle
add action=mark-connection chain=prerouting comment=\
    "Mark connections for hairpin NAT" dst-address-list=WAN-IP \
    new-connection-mark="Hairpin NAT" src-address-list=LAN-subnet

So verstehe ich genau die oben stehende Regel.
Greife ich also von intern auf das Ziel mit der WAN IP zu dann wird das auf dem Weg zurück wiederum maskiert damit bei mir im internen Netz auch die WAN IP ankommt und nicht die interne IP
Das mache ich mittels

/ip firewall nat
add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark=\
    "Hairpin NAT"

Hab ich hier irgendwo einen Denkfehler? Oder versteh ichs gerade einfach nicht?

Und doch das WAN ist ja betroffen. Die Server IP bezieht das game aus der Liste bei Steam und da steht eben die WAN IP drin und keine interne IP, was ja auch normal ist.

Wenn ich also zum Server connecte fragt das Game beim aufrufen der Serverliste die bei Steam gelisteten Server ab und bekommt da dann meinen Server mittels der WAN IP… wenn ich also darauf connecte, nutze ich aus dem Internen Netz die WAN IP

Du hast einen Denkfehler bzw. mehrere…
Du musst immer extrem aufpassen, wo du dich gerade im Packet-Flow in der MikroTik-Firewall befindest. Und was gerade die DEST und was die SRC ist…

Okay dann klär mich gern auf wo ich einen Denkfehler habe. Da ich, wie gesagt Mikrotik Anfänger bin, will ich auch kapieren wie es geht und vor allem kapieren wieso das mit ner dummen Fritte out of the Box einfach so funktioniert.

Also falls es einfacher ist als Romane zu schreiben, wir können uns auch gern bei Dennis im Discord treffen.

Die Fritte macht das halt einfach alles, ohne dass man es mitbekommt und sich drum kümmern muss…
Schau dir mal dieses Bild hier an: https://help.mikrotik.com/docs/download/attachments/3211299/Hairpin-NAT-setup.jpg?version=2&modificationDate=1572338092573&api=v2

Da siehst du, was passiert ohne die 2. Regel… Was du ja auch schon richtig gesagt hast. Es passiert ein Asynchrones Routing / NATing wie auch immer…

Moin, wie geht es?

Bla bla für 20 Zeichen?

Ok das Bild hab ich mir angesehen und wenn die grüne Linie die Anfrage ist und die Rote die Response dann ja wäre das wohl der Idealfall aber verwirft da der Client nicht die Packete weil die Antwort von ner andern IP kommt als der Client requestet hat und mitigiere ich nicht genau das mit meiner zweiten Regel?

Diese Limits sind schon Dings :smiley: Aber jetz kann ich wieder schreiben, wer weiß wie lange…

Ich hab jetzt auch mal verschiedene Dinge ausprobiert, in der WAN-IP Liste habe ich beide IPs rein, die vom server und die vom WAN und das Hairpin NAT komplett deaktiviert und die DNS umgeschrieben für die Webservices aber so richtig sauber funktioniert das auch nicht.
Der Ping ist unverändert hoch im Spiel… Hab auch zum neuen Testen noch mal die Fritte davor gehangen und damit geht es sofort ohne Probleme.

Hab auch IPv6 mal komplett deaktiviert um sicherzugehen dass es damit nicht zusammenhängt aber das brachte auch nichts. Dachte es lag vielleicht am v6 weil ich da noch nen Fehler in den Präfixen hatte.

Aber egal was ich tue, es will mit dem Mikrotik einfach nicht funktionieren und ich kapiere gerade absolut nicht warum.

Also im Serverbrowser vom Spiel sehe ich meine WAN IPv4 Adresse, er versucht also in jedem Fall auf meine Public IP zu connecten, ich muss also dem Router sagen, dass wenn eine Connection auf die WAN-IP kommt, er das intern direkt routen soll anstelle irgendwo raus ins Internet zu gehen um dann wieder zurück zu kommen was dann logischerweise in nem Delay endet oder in irgendeinem Loop vermutlich…
Ich bin also mit dem Hairpin NAT eigentlich auf dem richtigen Weg denn genau das soll das Hairpin NAT ja tun oder bin ich da schon auf dem Holzweg?

Ich kann doch auch nicht der einzige sein der son Router hat und nichts dahinter hostet was Public erreichbar sein soll und auch aus dem internen Netz funktionieren soll.

Ich weiß gerade die zweite Regel nicht mehr, aber die Anleitung von MikroTik in deren Doku funktioniert, die hab ich ja getestet… :slight_smile:
Wie genau kriegst du denn deine dynamische WAN-IP in diese Addressliste da rein?

Moin,

Das liegt am Alter das geht mir auch immer so :smiley:

/ip firewall nat
add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark=\
    "Hairpin NAT"

Bei der Lösung aus der Doku müsste ich für jede IP Port Kombi ne eigene Regel machen… da wird man ja bescheuert :smiley:

Mit

/ip firewall address-list
add address=HOSTNAME.DE comment=WAN-IP list=WAN-IP