Wireguard port forward zweite public ip

  • sorry verstehe den ersten Absatz nicht recht, werde nachher aber noch versuchen das was sicherer zu bei bekommen.


    Habe gelesen das die erste iptable gerne genommen wird wenn es einfach sein soll für eine Grundsicherung.


    iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


    Dann kann es doch eigentlich nur an der letzten Regel liegen.


    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o etho -j MASQUERADE

  • Ich hatte ja in meinem letzten Beitrag schon beschrieben, die Regel macht ein Masquerading für die Pakete vom Server über VPN in dein Heimnetz. Damit funktioniert das Split-Routing, weil du nicht den kompletten Internetverkehr über den VPN Tunnel leitest.


    Ohne diese Regel werden die Pakete vom Server mit ihrer öffentlichen Absender-IP weitergeleitet (Hast du ja im tcpdump gesehen). Damit werden sie entweder sofort von den Allowed IPs kassiert und kommen gar nicht am Ziel an, oder dein Heimnetz kann nicht richtig drauf antworten. Denn wenn die Absenderadresse der Pakete in deinem Heimnetz noch eine öffentliche IP ist, dann will dein Heimnetz die Antwort über die Default-Route schicken, und das ist nicht der VPN Tunnel. Beim ursprünglichen Absender käme die Antwort von einer anderen Quell-IP an, als er ursprünglich mal als Ziel-IP benutzt hat. Das Antwortpaket wird verworfen, da der Absender die Antwort nicht seiner Frage zuordnen kann.


    Mit der Regel ersetzt der Server die originale öffentliche Absender-IP durch die VPN Transportnetz-IP. Das geht durch den Tunnel, und dein Heimnetz weiß, wohin mit der Antwort. Man könnte die generische Masquerade Regel durch spezifischere SNAT Regeln ersetzen, aber ob es was bringt? Viel nicht. Was aber wieder gilt: Die Masquerade Regel darf nur 1x existieren!


    Vielleicht noch zur Anschauung:

    https://www.tech-island.com/kb/linux/reference/unterschied-zwischen-masquerade-snat-und-dnat


    Zur Anschauung noch mal ein kompletter Regelsatz für einen Port mit SNAT anstatt generischem MASQUERADE:

    Code
    iptables -t nat -A PREROUTING -i eth0 -d ÖFFENTLICHE_IP -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.21:8080
    iptables -A FORWARD -i eth0 -p tcp --dport 8080 -d 192.168.1.21 -j ACCEPT
    iptables -t nat -A POSTROUTING -o VPN -d 192.168.1.22 -p tcp --dport 8080 -j SNAT --to-source 10.0.0.1

    Zunächst wird die Zieladresse auf die Adresse im Heimnetz umgeschrieben. Dann wird das Forwarding für diese Zieladresse und den Zielport erlaubt. Zuletzt wird die Quelladresse für die Zieladresse und den Zielport umgeschrieben.


    Die spezifischen Regeln haben den Vorteil, dass sie nur exakt in dem Moment greifen, wenn ein Paket für die Portweiterleitung bearbeitet wird. Die generische MASQUERADE Regel greift immer, und es kann ja durchaus Anwendungsfälle auf dem VPN abseits der Portweiterleitung geben, für die das nicht erwünscht ist.

  • Genau, möchte natürlich nur einzelne Ports öffnen und nicht alle anfragen auf der öffentlichen IP weiterleiten.


    und bei dem Masquerade nimmt der die öffentliche IP mit Port 8080 und leitetet die Anfrage über Wireguard mit der IP 10.0.0.1 weiter mit einem zufälligen Port und in dem Paket ist dann der richtige Port enthalten damit der Wireguard Client weiß wohin das Paket dann muss. Somit kann man dann zweimal den Port 8080 von beiden öffentlichen IPs nutzen.


    Wenn man dann snat nutzen möchte im POSTROUTING dann muss man das dann für jede interne IP machen und braucht dann kein Masquerade mehr? So würde ich den Beitrag verstehen..

  • Wenn man dann snat nutzen möchte im POSTROUTING dann muss man das dann für jede interne IP machen und braucht dann kein Masquerade mehr?

    Man muss es für jede Kombination aus Port, Protokoll (tcp, udp) und interner IP machen. Natürlich kann man eine Multi-Port Regel machen, wenn man möchte, dann ist es nur ein iptables Eintrag, das ist auch ein wenig performanter (weniger Einträge, die iptables durchsuchen muss).

  • können die anderen regeln so bleiben oder muss man dann alles verändern.


    Vielleicht klappt das ja besser und laut dem verlinkten Beitrag ist es ja auch perfomanter.


    Hast du vielleicht eine Beispiel Regel.

  • Multiport Regeln kannst du eigentlich immer einsetzen, wenn Portnummern vorkommen (bei DNAT natürlich nur, wenn Quell- und Zielport identisch sind). Also anstatt

    Code
    iptables -A FORWARD -i eth0 -p tcp --dport 8080 -d 192.168.1.21 -j ACCEPT

    kannst du

    Code
    iptables -A FORWARD -i eth0 -p tcp -m multiport --dports 8080,8081,8082 -d 192.168.1.21 -j ACCEPT

    benutzen.


    Alle anderen Regeln kannst du synonym anlegen. Im Grunde brauchst du für jede Zieladresse und jedes Protokoll (tcp, udp) dann einen Eintrag, der alle nötigen Ports beinhaltet. Das natürlich jeweils für die drei PREROUTING, FORWARD, POSTROUTING Regeln oben aus dem Beispiel.


    Dann braucht es für ein komplettes Setup vermutlich noch die ESTABLISHED,RELATED Regel. Generell muss das ganze Setup dann abgerundet werden mit einem Regelset, dass den Server an sich schützt. Also alles bis auf VPN zu oder so.

  • Also diese regeln funktionieren auch


    PostUp = iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

    PostUp = iptables -t nat -A PREROUTING -i eth0 -d xxx.xxx.xxx.12 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.21:8080

    PostUp = iptables -A FORWARD -i eth0 -p tcp --dport 8080 -d 192.168.1.21 -j ACCEPT

    PostUp = iptables -t nat -A POSTROUTING -o wg11 -d 192.168.1.21 -p tcp --dport 8080 -j SNAT --to-source 10.0.0.1


    PostUp = iptables -t nat -A PREROUTING -i eth0 -d xxx.xxx.xxx.12 -p udp --dport 8080 -j DNAT --to-destination 192.168.1.21:8080

    PostUp = iptables -A FORWARD -i eth0 -p udp --dport 8080 -d 192.168.1.21 -j ACCEPT

    PostUp = iptables -t nat -A POSTROUTING -o wg11 -d 192.168.1.21 -p udp --dport 8080 -j SNAT --to-source 10.0.0.1


    PostUp = iptables -t nat -A PREROUTING -i eth0 -d xxx.xxx.95 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.22:8080

    PostUp = iptables -A FORWARD -i eth0 -p tcp --dport 8080 -d 192.168.1.22 -j ACCEPT

    PostUp = iptables -t nat -A POSTROUTING -o wg11 -d 192.168.1.22 -p tcp --dport 8080 -j SNAT --to-source 10.0.0.1


    PostUp = iptables -t nat -A PREROUTING -i eth0 -d xxx.xxx.95 -p udp --dport 8080 -j DNAT --to-destination 192.168.1.22:8080

    PostUp = iptables -A FORWARD -i eth0 -p udp --dport 8080 -d 192.168.1.22 -j ACCEPT

    PostUp = iptables -t nat -A POSTROUTING -o wg11 -d 192.168.1.22 -p udp --dport 8080 -j SNAT --to-source 10.0.0.1




    und zum abrunden sollte es doch reichen mit einer drop regel alle Ports die nicht benötigt werden zu sperren.

    glaub man kann das doch negieren und somit alles dicht machen außer z.b. 8080 + Wireguard selbst.

    dann kann man ja sogar den ssh Port dicht machen wenn man alles direkt über Wireguard macht.

    wenn man dann wirklich mal ssh braucht kann man ja per Netcup SCP über die Bildausgabe das manuell wieder aktivieren.

  • und zum abrunden sollte es doch reichen mit einer drop regel alle Ports die nicht benötigt werden zu sperren.

    Genau. Man kann auch die Default Policy auf DROP stellen.


    glaub man kann das doch negieren und somit alles dicht machen außer z.b. 8080 + Wireguard selbst.

    Du musst unterscheiden zwischen INPUT und FORWARD. Für INPUT brauchst du den Wireguard Port, aber keine 8080 Regel. Für FORWARD brauchst du die Regeln für dein Heimnetz (8080 z.B.), aber keinen Wireguard Port.


    dann kann man ja sogar den ssh Port dicht machen wenn man alles direkt über Wireguard macht.

    Ein Fallback ist nie weg. Allerdings würde ich den SSH Port auf irgendwas Ungewöhnliches verlegen, in dem möglichst wenig "22" vorkommt. Das SCP bleibt natürlich als Fallback, ist aber auch echt unkomfortabel.

  • Genau. Man kann auch die Default Policy auf DROP stellen.


    Du musst unterscheiden zwischen INPUT und FORWARD. Für INPUT brauchst du den Wireguard Port, aber keine 8080 Regel. Für FORWARD brauchst du die Regeln für dein Heimnetz (8080 z.B.), aber keinen Wireguard Port.

    meine global alles zu blockieren außer die Ports die auch erreichbar sein sollen.


    Und der ssh port wurde geändert, und stimmt natürlich das, dass über ssh viel einfacher zu bedienen ist.

  • meine global alles zu blockieren außer die Ports die auch erreichbar sein sollen.

    Genau das meine ich auch. Abe rman muss sich überlegen, welche Ports man wo braucht. Bei Linux wird strikt unterschieden zwischen INPUT und FORWARD. INPUT braucht man für alles, was direkt auf dem Server verarbeitet wird. FORWARD braucht man dann, wenn der Server was weiterleitet. Wenn Port 8080 als Weiterleitung übers VPN ins Heimnetz dienen soll, kann er beim INPUT zugemacht werden, denn der Port ist auf der externen IP weg und wird lokal auf dem Server garantiert (bzw. hoffentlich) nicht mehr benutzt. Und nur weil man einen Port für FORWARD benutzt, muss er nicht auch bei INPUT geöffnet werden.

  • also braucht es noch eine input drop Regel für port 8080 für jede Portfreigabe.


    Dann werden sozusagen alle anfragen dieses Ports nicht mehr auf dem Server "verarbeitet" sondern direkt weitergeleitet.


    Oder direkt eine input drop Regel für alles und dann SSH freigeben.

  • so, hab grade mal folgende Regeln eingestellt


    SSH erlauben

    iptables -A INPUT -i eth0 -p tcp --dport zzzzz -m state --state NEW,ESTABLISHED -j ACCEPT

    iptables -A OUTPUT -o eth0 -p tcp --sport zzzzz -m state --state ESTABLISHED -j ACCEPT


    ---

    Ping von außen nach innen erlauben.

    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

    iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT


    ---

    Ausgehend dns erlauben

    iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT

    iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT


    ---

    Wireguard freigeben

    iptables -A INPUT -i eth0 -p udp --dport xxx -j ACCEPT

    iptables -A OUTPUT -o eth0 -p udp --dport yyy -j ACCEPT



    dann habe ich noch per Default alles andere an In und Output gesperrt

    iptables -P INPUT DROP

    iptables -P OUTPUT DROP




    Sobald ich diese Regel auch noch ausführe klappt der Wireguard Tunnel nicht mehr, obwohl der Forward selbst ja freigegeben ist.

    iptables -P FORWARD DROP



    Und wenn ich jetzt eine Domain anpinge klappt das, aber wenn es eine IP ist ist nicht.

    Ist ja nicht kritisch, alles relevante funktioniert. Auch Systemupdates usw.