GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Wie leitet man Datenverkehr zwischen Linux-Netzwerk-Namespaces weiter?

Ich konnte einen Netzwerk-Namespace einrichten und einen Server starten, der auf 127.0.0.1 innerhalb des Namespace lauscht:

# ip netns add vpn
# ip netns exec vpn ip link set dev lo up
# ip netns exec vpn nc -l -s 127.0.0.1 -p 80 &

# ip netns exec vpn netstat -tlpn

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      5598/nc

Danach kann ich mich mit dem Server innerhalb des Namensraums verbinden:

# ip netns exec vpn nc 127.0.0.1 80 -zv
localhost [127.0.0.1] 80 (http) open

Aber ich kann mich nicht mit dem Server außerhalb des Namespaces verbinden:

# nc 127.0.0.1 80
(UNKNOWN) [127.0.0.1] 80 (http) : Connection refused

Wie konfiguriere ich iptables oder Namespace, um Datenverkehr vom globalen Namespace zum vpn-Namespace weiterzuleiten?

Akzeptierte Antwort:

Erstens:Ich glaube nicht, dass Sie dies erreichen können, indem Sie 127.0.0.0/8 und/oder eine Loopback-Schnittstelle (wie lo) verwenden. Sie müssen einige andere IPs und Schnittstellen verwenden, da bestimmte Dinge für 127.0.0.0/8 und für Loopback fest verdrahtet sind.

Dann gibt es sicherlich mehr als eine Methode, aber hier ist ein Beispiel:

# ip netns add vpn
# ip link add name vethhost0 type veth peer name vethvpn0
# ip link set vethvpn0 netns vpn
# ip addr add 10.0.0.1/24 dev vethhost0
# ip netns exec vpn ip addr add 10.0.0.2/24 dev vethvpn0
# ip link set vethhost0 up
# ip netns exec vpn ip link set vethvpn0 up
# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.134 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.100 ms

Der erste Befehl erstellt aus dem Nichts ein Paar virtueller Ethernet-Schnittstellen, die durch ein virtuelles Ethernet-Kabel verbunden sind. Der zweite Befehl verschiebt eine dieser Schnittstellen in das netns vpn. Betrachten Sie es als Äquivalent zu Dingen wie socketpair(2) oder pipe(2):Ein Prozess erstellt ein Paar, verzweigt sich dann, und jeder Prozess behält nur ein Ende des Paares und sie können kommunizieren.

Normalerweise (LXC, virt-manager,…) gibt es auch eine Brücke, um alles in das gleiche LAN zu bringen, wenn Sie viele Netze haben.

Sobald dies eingerichtet ist, ist es für den Host wie jeder Router.
Aktivieren Sie die IP-Weiterleitung (seien Sie restriktiver, wenn Sie können:Sie benötigen es zumindest für vethhost0 und die Hauptschnittstelle):

# echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

Fügen Sie eine DNAT-Regel hinzu, wie:

# iptables -t nat -A PREROUTING ! -s 10.0.0.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

Jetzt können Sie entweder eine Standardroute innerhalb von VPN hinzufügen mit:

# ip netns exec vpn ip route add default via 10.0.0.1

Oder fügen Sie stattdessen eine SNAT-Regel hinzu, damit alles innerhalb von vpn als von 10.0.0.1 kommend angesehen wird.

# iptables -t nat -A POSTROUTING -d 10.0.0.2/24 -j SNAT --to-source 10.0.0.1

Damit können Sie von jedem anderen Host aus testen, aber nicht vom Host selbst. Fügen Sie dazu auch eine DNAT-Regel ähnlich der vorherigen DNAT hinzu, aber in OUTPUT und geändert (andernfalls würde jede ausgehende HTTP-Verbindung auch geändert) auf Ihre eigene IP. Nehmen wir an, Ihre IP ist 192.168.1.2:

# iptables -t nat -A OUTPUT -d 192.168.1.2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

Jetzt funktioniert es sogar, wenn Sie eine Verbindung vom Host zu sich selbst herstellen if Sie verwenden keine Loopback-IP, sondern eine andere IP, die zum Host gehört, mit einer NAT-Regel wie oben. Nehmen wir an, Ihre IP ist 192.168.1.2:

# ip netns exec vpn nc -l -s 10.0.0.2 -p 80 &
[1] 10639
# nc -vz 192.168.1.2 80
nc: myhost (192.168.1.2) 80 [http] open
#
[1]+  Done                    ip netns exec vpn nc -l -s 10.0.0.2 -p 80

Linux
  1. So verwenden Sie den Linux-Befehl mtr

  2. Wie führt man Chroot mit Linux-Namespaces durch?

  3. So überwachen Sie den Netzwerkverkehr unter Linux mit vnStat

  4. Wie man unter Linux zwischen 2 Micros unterscheidet

  5. Linux:Wie misst man den täglichen/monatlichen Netzwerkverkehr?

So finden Sie verfügbare Netzwerkschnittstellen unter Linux

So ändern Sie die Netzwerk-MAC-Adresse in Linux

So installieren und verwenden Sie den webbasierten Linux Network Traffic Analyzer von Darkstat

So fügen Sie eine Route unter Linux hinzu

So konfigurieren Sie Linux als statischen Router

So verwenden Sie den netstat-Befehl unter Linux