OpenVPN Server auf vServer - über serverip:port bestimmten Dienst vom Client erreichbar machen

  • Hallo zusammen,


    ich habe mir einen vServer von Netcup gemietet und habe dort OpenVPN eingerichtet. Das VPN läuft soweit, wenn ich mich mit dem offiziellen Client einwähle und über wieistmeineip nach schaue, dann wird mir die IP des Servers angezeigt, so weit so gut.


    Da ich als Mitleser hier schon oft mitbekommen habe, dass hier freundlich und kompetent geholfen wird, wende ich mich an euch.

    Ich bin noch sehr viel am lernen und habe jetzt auch schon viel hin und her probiert, bekomme aber folgendes nicht hin:


    Ziel:

    Jetzt möchte ich, einen bestimmten Dienst (hier jetzt mal zum testen ein grafana Dashboard) über serverip:port erreichbar machen. Habe schon oft im Internet gelesen, dass es viele gemacht haben, aber bei mir funktioniert es irgendwie nicht.


    Für die Weiterleitung auf das Grafana Dashboard habe ich mich an diese Anleitung gehalten: linux - Port forwarding using OpenVPN client - Unix & Linux Stack Exchange. Da hat es wohl funktioniert und ist genau der Fall den ich auch habe.


    Folgenden Aufbau habe:

    Code
    vServer (OpenVPN Server, eth0: 89.58.X.X, tun0: 10.8.0.1)
      |
      V
    FritzBox (lokale IP: 192.168.1.1
      |
      V
    OpenVPN Client (192.168.1.91/ 10.8.0.2)


    Folgende Konfiguration hat der OpenVPN Server:

    Folgende der VPN Client:


    Mein iptables habe ich entsprechend folgend angepasst:

    Code
    sysctl net.ipv4.ip_forward=1
    
    iptables -t nat -I PREROUTING 1 -d 89.58.X.X -p tcp --dport 3000 -j DNAT --to-dest 192.168.1.91:3000
    
    iptables -t nat -I POSTROUTING 1 -d 192.168.1.91 -p tcp --dport 3000 -j SNAT --to-source 10.8.0.1
    
    iptables -I FORWARD 1 -d 192.168.1.91 -p tcp --dport 3000 -j ACCEPT


    Und sehen im Moment so aus:


    In der Fritzbox habe ich noch folgende Route angelegt:
    pasted-from-clipboard.png



    Kann mir da bitte jemand helfen, was mache ich falsch, bzw. was habe ich vergessen?

    VG

    • Hilfreichste Antwort

    Nur der Vollständigkeit halber:

    client-config-dir /etc/openvpn/ccd

    Sind da noch Client-spezifische Konfigurationen aktiv?


    iptables -t nat -I PREROUTING 1 -d 89.58.X.X -p tcp --dport 3000 -j DNAT --to-dest 192.168.1.91:3000

    Warum steht in der Regel hinter dem PREROUTING eine 1?


    Ich vermute, deine Einbeziehung der 192er Adresse aus deinem Heimnetz ist das Problem, denn die wird auf dem Server nicht maskiert. Eine MASQUERADE Regel gibt es nur für das 10er Netz.

    Generell hab ich nicht verstanden, warum du das 192er Netz in deinem Setup einbeziehst. Der Server läuft ja anscheinend direkt auf dem VPN Client, also kannst du auch die 10.8.0.2 als Ziel in deinen Regeln benutzen. Die SNAT Regel kannst du dann ganz sparen. Also mein Vorschlag für ein Regel-Set ist:

    Code
    sysctl net.ipv4.ip_forward=1
    
    iptables -t nat -I PREROUTING -d 89.58.X.X -p tcp --dport 3000 -j DNAT --to-dest 10.8.0.2:3000
    
    iptables -I FORWARD -d 10.8.0.2 -p tcp --dport 3000 -j ACCEPT


    Meines Erachtens brauchst du auch die statische Route in der Fritzbox nicht, da der VPN Client die Route ins VPN Netz schon kennt.


    Wenn später andere Geräte aus dem 192er Netz einbezogen werden sollen, dann muss man die Regeln überarbeiten. Ich würde da nicht mit SNAT arbeiten, sondern fürs VPN vollwertig routen, dann eine statische Route fürs VPN Netz in die Fritzbox und eine MASQUERADING Regel fürs 192er Netz auf den Server. So nutze ich es im Moment mit einer Wireguard Verbindung.

  • Das mit dem 192er hatte ich wohl falsch verstanden...


    Aber deine Lösung hat auf anhieb funktioniert! Top und vielen Dank für die schnelle Antwort - wieder was gelernt :)

  • c7h12

    Hat einen Beitrag als hilfreichste Antwort ausgewählt.
  • Jetzt war ich doch etwas zu schnell...

    Jetzt habe ich folgende Situation, ich komme zwar von außen auf das Grafana. Wenn ich mich aber auf dem Server bin, auf dem das grafana läuft, habe ich keine Verbindung zum Internet. Mache ich einen ping google.com kann der Host nicht gefunden werden.

    Ping nach 10.8.0.1 klappt, aber sonst nicht mehr.


    Was müsste ich da noch tun?

  • Für das was du willst, brauchst du nur eine Input Regel. Ich würde Wireguard empfehlen, da das flüssiger läuft und du kannst direkt die fritzbox damit verbinden.


    Dann kann dein ganzes Heimnetz die Dienste auf dem Server nutzen.

  • Für das was du willst, brauchst du nur eine Input Regel. Ich würde Wireguard empfehlen, da das flüssiger läuft und du kannst direkt die fritzbox damit verbinden.


    Dann kann dein ganzes Heimnetz die Dienste auf dem Server nutzen.

    Ja, Wireguard habe ich schon auf einem separaten vServer am laufen und das funktioniert auch genauso wie du es schreibst... Will im Moment halt meinen Horizont erweitern ;)

    Wenn du schreibst ich brauche eine INPUT Regel, wie sollte die aussehen? Also das INPUT von der Adresse 10.8.0.2:3000 erlaubt wird?

    Ist das aber nicht schon damit erlaubt?

    pasted-from-clipboard.png

  • Wenn ich mich aber auf dem Server bin, auf dem das grafana läuft, habe ich keine Verbindung zum Internet.

    Das liegt an dieser Einstellung in deiner Server.conf:

    Code
    push "redirect-gateway def1 bypass-dhcp"

    Du sagst dem VPN Client, er solle das Internet über die VPN Verbindung leiten soll. Er wird die Daten vermutlich mit seiner 192er Adresse absenden, und das führt dazu, dass der Internetzugang nicht funktioniert, weil auf dem Server die MASQUERADING Regel fehlt.


    Soll das Internet des Servers über den VPN Tunnel laufen? Ansonsten entferne die Option.


    Bei der Gelegenheit: Du pusht auch andere DNS Server zum Client. Ist das gewollt?

  • Es braucht eine INPUT Regel mit der öffentlichen IP des Servers und dem Port von openVPN bzw. Wireguard und intern kannst du doch alles erlauben mit einer weiteren Regel z.B. quelle <openVPN-Netz>, dest. <openVPN-Netz>, ports any ?

  • Also ich hätte gerne, dass die komplette Kommunikation über den VPN geht.

    Wie Route ich den Datenverkehr dann wieder zurück?

    Mir scheint so, als wenn die Ports Richtung draußen geblockt sind...

  • Warum um Himmels willen soll ein einzelner Server in deinem Heimnetz seinen Internetverkehr über das VPN abwickeln? Das macht für mich überhaupt keinen Sinn.


    Die Ports nach draußen sind nicht geblockt. Aber ausgehender Traffic vom Grafana-Server kommt beim OpenVPN Server mit Quell-Adresse 192.168.1.91 an. Das hat zwei Dinge zur folge:

    - Der VPN Server kennt den Rückweg nicht

    - Der VPN Server leitet die Pakete nicht ins Internet, weil private Adressen nicht ins öffentliche Netz geroutet werden dürfen.


    Es gibt bei dir ja schon eine MASQUERADE Regel für 10.8.0.0/24. Genau die brauchst du auch noch mal für 192.168.1.0/24. Dazu muss sichergestellt sein, dass es eine Subnetz Route für 192.168.1.0/24 gibt, mit Gateway 10.8.0.2.

  • Ich habe das so und das funktioniert einwandfrei :)



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

    iptables -A INPUT -m state --state NEW -m udp -p udp --dport <openVPN-Port> -j ACCEPT

    iptables -A INPUT -m state --state NEW -i wg0 -d 192.168.206.0/24 -j ACCEPT


    Das private IP-Netz muss natürlich an die gegebenheiten angepasst werden, ebenso den openVPN-Port.


    Die Policys wie folgt:


    INPUT Drop

    OUTPUT ACCEPT

    FORWARD DROP

  • iptables -A INPUT -m state --state NEW -m udp -p udp --dport <openVPN-Port> -j ACCEPT

    Die Regel erlaubt es, eine OpenVPN Verbindung aufzubauen.


    iptables -A INPUT -m state --state NEW -i wg0 -d 192.168.206.0/24 -j ACCEPT

    Die Regel erlaubt Datenverkehr mit den Zieladressen 192.168.206.0/24 auf dem wg0 Interface. Da es eine INPUT Regel ist, betrifft es nur den vServer selber und die Dienste, die darauf laufen. Auf andere Dienste oder Geräte hinter einem VPN Tunnel hat diese Regel keinen Einfluss, dafür würde es Forward Regeln brauchen.


    Wenn du die Regel hast, um Daten in einen VPN Tunnel zu leiten, dann bin ich mir nicht sicher, ob die überhaupt irgendwas tut. Schau doch mal nach mit iptables -Lv, wie oft die Regel verwendet wurde.

  • jo, das ist dann die Erklärung dazu.

    Die Dienste auf dem VPS oder Root können dann mit der privaten Adresse angesprochen werden.


    Im Fall vom Threadersteller wäre das die IP: 10.8.0.1.



    Vervollständigt könnte ein Regelwerk so aussehen:


    Das gleiche auch für ipv6, denn dort stehen die Policy default auch auf ACCEPT.


    Code
    # Alles droppen oder alternativ wie bei ipv4
    ip6tables -P INPUT DROP
    ip6tables -P OUTPUT DROP
    ip6tables -P FORWARD DROP
  • # Was rein geht auf dem Interface wg0 mit Ziel 10.8.0.0/24 wird akzeptiert. Man könnte auch 10.8.0.1 einsetzen.

    iptables -A INPUT -m state --state NEW -i wg0 -d 10.8.0.0/24 -j ACCEPT

    Die Frage ist, was die Regel bewirken soll. Damit kann man über VPN einen Serverdienst auf dem vServer erreichen. Für die ursprüngliche Fragestellung, also Eine Portweiterleitung von außen und Internetzugriff für die VPN Clients, hilft die Regel nicht.


    Das gleiche auch für ipv6, denn dort stehen die Policy default auch auf ACCEPT.

    Wenn die Default INPUT Policy Accept ist, dann braucht es die Regel gar nicht.

  • Die policy mit input accept braucht keine Regel, aber dann braucht man auch keine Firewall :)


    Ich habe das so verstanden, dass er einen Dienst auf dem VPS nutzen will und das dieser nur über VPN erreichbar sein soll.

  • Ich habe das so verstanden, dass er einen Dienst auf dem VPS nutzen will und das dieser nur über VPN erreichbar sein soll.

    Ok, dann machen die Regeln Sinn. Aber die Fragestellung war eine andere, wie man am verlinkten Thread erkennt:

    https://unix.stackexchange.com/questions/449853/port-forwarding-using-openvpn-client


    Der Dienst ist hinter dem VPN Client und soll durch die öffentliche IP des VPN Servers erreicht werden.

  • Wow, ihr habt da echt viel wissen,... Muss ich mir noch mal in Ruhe alles rein ziehen.


    Um es zu lernen hatte ich 1 ein Ziel und nachher noch ein 2. hinzugefügt.

    #1: Einen Dienst nur über den VPN Tunnel erreichbar machen

    #2: Den kompletten internetverkehr über den VPN Tunnel erreichen


    Mit den Vorschlägen von frank_m habe ich es auf jeden Fall hinbekommen, dass die Dienste über den VPN erreichbar sind, damit ist das Ziel erreicht und ich glaube auch so weit verstanden.

    Bei Punkt 2 bin ich mir noch unsicher ob ich euch richtig verstanden habe. Wenn ich alles jetzt nachverfolgt habe geht der Internetverkehr über den eth0 Adapter mit der IPv6 Adresse statt über den VPN

  • Wenn ich alles jetzt nachverfolgt habe geht der Internetverkehr über den eth0 Adapter mit der IPv6 Adresse statt über den VPN

    Das ist natürlich denkbar, wenn der VPN Client eine IPv6 Verbindung hat, kann er die anstatt des Tunnels benutzen. Dann musst du entweder IPv6 auch über den Tunnel leiten, oder IPv6 im Client deaktivieren (oder zumindest die Default-Route entfernen.


    Auf jeden Fall braucht es dann aber auch noch eine MASQUERADE fürs 192er Netz auf dem VPN Server.

  • Ich habe jetzt noch mal mit einer VM alles komplett von vorne angefangen und zum Test einfach mal IPv6 deaktiviert - die MASQUERADE noch nicht rein genommen, und siehe da der gesamt Internetverkehr geht über den VPN, das sehe ich an den Daten im Client.


    Also genau so wie ich es haben wollte, aber ist das dann ohne MAQUERADE überhaupt möglich?