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 tun0
oder 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
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
`
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
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
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
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
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
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 FORWARD
wird wie üblich die Kette konsultiert und Sie können steuern, wer sich wo verbinden kann. Wenn ip_forward
nicht aktiviert ist, wird der Datenverkehr nicht weitergeleitet.
Wenn client-to-client
nicht verwendet wird, verwendet der Datenverkehr zwischen den Clients den gleichen Pfad: Er erscheint in der tun0
Schnittstelle 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-client
jedoch verwendet wird, erscheinen Pakete zwischen Clients nicht auf tun0
, und die Firewall- FORWARD
Kette des Servers wird nicht konsultiert und die ip_forward
Steuerung 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 status
Befehl 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 iproute
gü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_forward
hat es keinen Einfluss darauf, wie dieses Paket verarbeitet wird, und es durchläuft INPUT
die Firewall-Kette und die Antwort wird durchlaufen OUTPUT
(also nicht FORWARD
die 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, eth0
da 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).