Wird die ausgehende Verbindung von einem OpenVPN-Client zu einem LAN hinter einem OpenVPN-Server vom Serverkernel weitergeleitet?

Wird die ausgehende Verbindung von einem OpenVPN-Client zu einem LAN hinter einem OpenVPN-Server vom Serverkernel weitergeleitet?

Mir ist ein etwas seltsames Verhalten aufgefallen, das ich nicht ganz verstehe. Ich habe also eine OpenVPN-Verbindung wie in der Grafik unten zu sehen eingerichtet. (Es handelt sich um ein TUN- und Client-zu-Client-Setup). Meine Gedanken richten sich auf die Route des Pings in diesem Szenario: meine OpenVPN-Verbindung

 from client: 192.168.200.102 to LAN: 10.198.0.16

Im Allgemeinen ist es nicht überraschend, dass dieser Ping erfolgreich ist, aber für mein Verständnis, falls ich meine iptables-Einstellungen auf dem Server ändere auf

-P FORWARD DROP

und dann sogar

 net.ipv4.ip_forward = 0.

Mit den obigen Einstellungen sollte der Datenverkehr das Ziel nie erreichen. Obwohl der Datenverkehr erfolgreich ist, erreicht er die LAN-Schnittstelle irgendwie nie. Das Problem ist, dass ich den Datenverkehr (durch Ausführen des tcpdump data-network packet analyzer) nicht an der LAN-Schnittstelle eth0 10.198.0.16 ankommen sehen kann. Vielmehr scheint es, dass die Tun-Schnittstelle den Datenverkehr selbst beantwortet, als ob die LAN-IP an die Tun-Schnittstelle gebunden wäre, siehe unten:

sudo tcpdump -i tun0 tcpdump: 16:34:21.391381 IP 192.168.200.102 > 10.198.0.16: ICMP echo request, id 14, seq 1885, length 64 16:34:21.391514 IP 10.198.0.16 > 192.168.200.102: ICMP echo reply, id 14, seq 1885, length 64

Was passiert hier? Soweit ich weiß, geht die Anfrage vom Client an die Tun-Schnittstelle auf dem Server und wird schließlichWEITERGELEITETvom Kernel auf eth0, richtig? Wäre das normalerweise sichtbar, wenn man ausführt: sudo tcpdump -i tun0oder sudo tcpdump -i eth0?

Ich bin in dieser Sache so pingelig, weil ich es als Sicherheitsrisiko betrachte, wenn es keine Möglichkeit gibt, Regeln zu implementieren, die den Zugriff von Clients auf das LAN des Servers verhindern. Was ich hier übersehe: Gibt es einen OpenVPN-Prozess, der selbst Pakete an die eth0-Schnittstelle weiterleitet (wie für die Client-zu-Client-Konfiguration vorgesehen)?

Damit Sie mir bei meinem Problem besser helfen können, habe ich unten einige Diagnoseinformationen angehängt.

Für den Server

  1. ip addr

    `1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
        valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether b8:27:eb:5c:a6:e6 brd ff:ff:ff:ff:ff:ff
        inet 10.198.0.16/24 brd 10.198.0.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::ba27:ebff:fe5c:a6e6/64 scope link 
           valid_lft forever preferred_lft forever
    3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
        link/ether b8:27:eb:09:f3:b3 brd ff:ff:ff:ff:ff:ff
    4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
        link/none 
        inet 192.168.200.1/24 scope global tun0
           valid_lft forever preferred_lft forever
        inet6 fe80::87cd:fedd:92fc:cde/64 scope link stable-privacy 
           valid_lft forever preferred_lft forever
    

`

  1. ip route

    default via 10.198.0.1 dev eth0 proto static 
    10.198.0.0/24 dev eth0 proto kernel scope link src 10.198.0.16 
    192.168.200.0/24 dev tun0 proto kernel scope link src 192.168.200.1 
    192.168.178.0/24 via 192.168.200.1 dev tun0 scope link 
    
  2. server openvpn.conf

    tls-server
    mode server
    dev tun
    local 10.198.0.16
    proto tcp-server
    port 1234
    user openvpn
    group openvpn
    ca /etc/openvpn/cacert.pem
    cert /etc/openvpn/servercert.pem
    key /etc/openvpn/serverkey
    dh /etc/openvpn/dh2048.pem
    ifconfig-pool 192.168.200.2 192.168.200.103 255.255.255.0
    client-config-dir /etc/openvpn/ccd
    ifconfig 192.168.200.1 255.255.255.0
    keepalive 10 120
    comp-lzo
    client-to-client
    push "topology subnet"
    topology "subnet"
    log /var/log/openvpn.log
    

Für den Kunden

  1. ip addr

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
        link/ether 38:af:d7:a0:52:ec brd ff:ff:ff:ff:ff:ff
    3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 00:28:f8:8d:1c:6f brd ff:ff:ff:ff:ff:ff
        inet 192.168.178.79/24 brd 192.168.178.255 scope global dynamic noprefixroute wlp2s0
           valid_lft 859868sec preferred_lft 859868sec
        inet6 2a0a:a540:d54:0:bd79:eb10:5e26:548a/64 scope global temporary dynamic 
           valid_lft 7190sec preferred_lft 3590sec
        inet6 2a0a:a540:d54:0:6086:b044:dff:2694/64 scope global dynamic mngtmpaddr noprefixroute 
           valid_lft 7190sec preferred_lft 3590sec
        inet6 fe80::ad5c:6e18:87fa:dff4/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
        link/none 
        inet 192.168.200.102/24 brd 192.168.200.255 scope global tun0
           valid_lft forever preferred_lft forever
        inet6 fe80::5dfc:6b3a:3c4d:e9a4/64 scope link stable-privacy 
           valid_lft forever preferred_lft forever
    
  2. ip route

     default via 192.168.178.1 dev wlp2s0 proto dhcp metric 600 
     169.254.0.0/16 dev wlp2s0 scope link metric 1000 
     10.198.0.0/24 via 192.168.200.1 dev tun0 
     192.168.200.0/24 dev tun0 proto kernel scope link src 192.168.200.102
    
     192.168.178.0/24 dev wlp2s0 proto kernel scope link src 192.168.178.79 metric 600 
    
  3. client openvpn.conf

     dev tun
     client
     nobind
     remote 11.22.33.44
     proto tcp
     port 1234
     ca /etc/openvpn/cacert.pem
     cert /etc/openvpn/user_cert.pem
     key /etc/openvpn/user
     comp-lzo
     verb 3
     keepalive 10 120
     log /var/log/openvpn.log
    
  4. ccd for client

    iroute 192.168.178.0 255.255.255.0
    

Antwort1

Der Datenverkehr zwischen dem VPN und dem Rest des Netzwerks läuft natürlich über tun0. Für diesen Datenverkehr FORWARDwird wie üblich die Kette konsultiert und Sie können steuern, wer sich wo verbinden kann. Wenn ip_forwardnicht aktiviert ist, wird der Datenverkehr nicht weitergeleitet.

Wenn client-to-clientnicht verwendet wird, verwendet der Datenverkehr zwischen den Clients den gleichen Pfad: Er erscheint in der tun0Schnittstelle des Server-Betriebssystems, wird mithilfe der Routing-Tabelle des Betriebssystems richtig geroutet, durchquert die Firewall und der einzige Unterschied besteht darin, dass entschieden wird, dass das Ziel hinter liegt tun0, sodass das Paket dort ausgegeben wird.

Dies ist nicht sehr effizient, da sich der OpenVPN-Prozess im Benutzerbereich befindet, während sich tun0 im Kernelbereich befindet und dies zu mindestens zwei Kontextänderungen für jedes Paket führt.

Wenn client-to-clientjedoch verwendet wird, erscheinen Pakete zwischen Clients nicht auf tun0, und die Firewall- FORWARDKette des Servers wird nicht konsultiert und die ip_forwardSteuerung beeinflusst ihre Weiterleitung nicht. Der OpenVPN-Prozess selbst wird zu einem Router mit eigener Routing-Tabelle, unabhängig vom Host-Betriebssystem. Sie können es mit dem statusBefehl der Verwaltungsschnittstelle anzeigen oder in die Statusdatei übertragen. Sie können Routen innerhalb dieses „Routers“ mit der Direktive steuern (ich glaube, das steht für „interne Route“), die nur in der Datei des Clients oder in der per Skript generierten dynamischen Konfiguration iproutegültig ist .client-config-dir

Am einfachsten ist es, VPN nicht als etwas Besonderes zu betrachten. Sobald der Tunnel eingerichtet ist, vergessen Sie ihn. Er ist jetzt nur noch eine zusätzliche reguläre Schnittstelle in jedem Computer (Server und Clients), wobei alle diese Schnittstellen mit einem normalen, einfachen Router verbunden sind. Und denken Sie an das übliche Routing und die Firewall.


Ich habe endlich bemerkt, dass Sie die Adresse von pingender VPN-Server selbstwenn auch einer anderen Schnittstelle zugewiesen. Dieses Paket istwird nicht weitergeleitetda sein Ziel der Server selbst ist, ip_forwardhat es keinen Einfluss darauf, wie dieses Paket verarbeitet wird, und es durchläuft INPUTdie Firewall-Kette und die Antwort wird durchlaufen OUTPUT(also nicht FORWARDdie Kette, wie es der Fall wäre, wenn sie nicht für das System selbst bestimmt wäre). Das Paket gelangt von dort in das System tun0(und wird dort gesehen), aber Sie werden es nicht auf dem sehen, eth0da es nicht weggeschickt wird. Es wird lokal verarbeitet. Dasselbe gilt für Antworten.

Es ist (für den Routing-bezogenen Code) unerheblich, wo im System die Adresse zugewiesen ist (welche Schnittstelle) oder welche Adresse des Systems Sie für den Zugriff verwenden. Entscheidend ist, ob sie zum System gehört oder nicht.


Das damit verbundene Sicherheitsproblem besteht darin, dass manche Leute glauben, sie könnten den Zugriff auf diesen Dienst über andere Schnittstellen unterbinden, wenn sie den Dienst an eine IP-Adresse binden, die einer bestimmten Schnittstelle zugewiesen ist.Das ist falsch.Wenn andere Systeme, die hinter anderen Schnittstellen liegen, eine Route zu der IP haben, an die der Dienst gebunden ist,sind in der Lageum auf den Dienst zuzugreifen. Dies ist keine korrekte Möglichkeit, den Dienst zu sichern. Eine ordnungsgemäße Firewall-Einrichtung ist erforderlich.

Ein weiteres damit verbundenes Problem ist, dass manche Leute ping -I <local-address> <address-to-ping>oder sogar verwenden ping -I <interface> <address-to-ping>und denken, sie würden direkt auswählen, welche Schnittstellen-Pings gesendet werden. Auch das ist falsch. Auf diese Weise können Sie nur auswählen, welcheQuelladressePings werden vorhanden sein, aber nicht die Schnittstelle, um sie zu senden; die Schnittstelle wird vom Routing-Code streng entsprechend der Routing-Tabelle ausgewählt, die ausschließlich auf der Zieladresse des Pakets basiert (ich gehe davon aus, dass keine VRF- oder RPDB-Einrichtung durchgeführt wurde, aber das ist fortgeschrittenes Zeug und Leute, die es einrichten, kennen diese Funktion sowieso).

verwandte Informationen