Ich konnte einen Netzwerk-Namespace einrichten, einen Tunnel mit openvpn einrichten und eine Anwendung starten, die diesen Tunnel im Namespace verwendet. Bisher so gut, aber auf diese Anwendung kann über eine Webschnittstelle zugegriffen werden, und ich kann nicht herausfinden, wie Anforderungen an die Webschnittstelle in meinem LAN weitergeleitet werden.
Ich folgte einer Anleitung von @schnouki, in der erklärt wurde, wie man einen Netzwerk-Namespace einrichtet und OpenVPN darin ausführt
ip netns add myvpn
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o en+ -j MASQUERADE
sysctl -q net.ipv4.ip_forward=1
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
Danach kann ich meine externe IP überprüfen und verschiedene Ergebnisse innerhalb und außerhalb des Namespaces erhalten, wie beabsichtigt:
curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>
Die Anwendung wird gestartet, für dieses Beispiel verwende ich deluge. Ich habe mehrere Anwendungen mit einer Weboberfläche ausprobiert, um sicherzustellen, dass es sich nicht um ein schweres spezifisches Problem handelt.
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluged
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluge-web -f
ps $(ip netns pids myvpn)
PID TTY STAT TIME COMMAND
1468 ? Ss 0:13 openvpn --config /etc/openvpn/myvpn/myvpn.conf
9302 ? Sl 10:10 /usr/bin/python /usr/bin/deluged
9707 ? S 0:37 /usr/bin/python /usr/bin/deluge-web -f
Ich kann auf das Webinterface auf Port 8112 von innerhalb des Namespaces und von außerhalb zugreifen, wenn ich die IP von veth vpn1 spezifiziere.
ip netns exec myvpn curl -Is localhost:8112 | head -1
HTTP/1.1 200 OK
ip netns exec myvpn curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
Ich möchte jedoch den Port 8112 von meinem Server an die Anwendung im Namespace umleiten. Ziel ist es, einen Browser auf einem Computer in meinem LAN zu öffnen und die Webschnittstelle mit http: // my-server-ip: 8112 abzurufen (my-server-ip ist die statische IP des Servers, der die Netzwerkschnittstelle instanziiert hat).
BEARBEITEN: Ich habe meine Versuche, iptables-Regeln zu erstellen, entfernt. Was ich versuche, ist oben erklärt und die folgenden Befehle sollten ein HTTP 200 ausgeben:
curl -I localhost:8112
curl: (7) Failed to connect to localhost port 8112: Connection refused
curl -I <my-server-ip>:8112
curl: (7) Failed to connect to <my-server-ip> port 8112: Connection refused
Ich habe DNAT- und SNAT-Regeln ausprobiert und aus gutem Grund eine MASQUERADE durchgeführt, aber da ich nicht weiß, was ich tue, sind meine Versuche erfolglos. Vielleicht kann mir jemand helfen, dieses Konstrukt zusammenzustellen.
EDIT: Die Ausgabe von tcpdump von tcpdump -nn -q tcp port 8112
. Es überrascht nicht, dass der erste Befehl ein HTTP 200 zurückgibt und der zweite Befehl mit einer abgelehnten Verbindung endet.
curl -Is 10.200.200.2:8112 | head -1
listening on vpn0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 10.200.200.1.36208 > 10.200.200.2.8112: tcp 82
IP 10.200.200.2.8112 > 10.200.200.1.36208: tcp 145
curl -Is <my-server-ip>:8112 | head -1
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
IP <my-server-ip>.58228 > <my-server-ip>.8112: tcp 0
IP <my-server-ip>.8112 > <my-server-ip>.58228: tcp 0
EDIT: @schnouki hat mich auf einen Artikel der Debian-Administration hingewiesen, in dem ein generischer iptables-TCP-Proxy erklärt wird . Angewandt auf das vorliegende Problem würde das Skript folgendermaßen aussehen:
YourIP=<my-server-ip>
YourPort=8112
TargetIP=10.200.200.2
TargetPort=8112
iptables -t nat -A PREROUTING --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
iptables -t nat -A POSTROUTING -p tcp --dst $TargetIP --dport $TargetPort -j SNAT \
--to-source $YourIP
iptables -t nat -A OUTPUT --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
Leider wurde der Datenverkehr zwischen den Veth-Schnittstellen blockiert und nichts anderes passierte. @Schnouki schlug jedoch auch die Verwendung socat
als TCP-Proxy vor und dies funktioniert einwandfrei.
curl -Is <my-server-ip>:8112 | head -1
IP 10.200.200.1.43384 > 10.200.200.2.8112: tcp 913
IP 10.200.200.2.8112 > 10.200.200.1.43384: tcp 1495
Ich habe das seltsame Port-Shuffling noch nicht verstanden, während der Datenverkehr über die veth-Schnittstellen läuft, aber mein Problem ist jetzt gelöst.
veth
Geräten (finde das aber sehr interessant ... ;-)). Haben Sietcpdump
überprüft, wie weit die eingehenden Pakete kommen? Wenntcpdump -i veth0
nichtstcpdumo -i lo
angezeigt wird, ist dies möglicherweise erforderlich.