Sono stato in grado di impostare uno spazio dei nomi di rete, stabilire un tunnel con openvpn e avviare un'applicazione che utilizza questo tunnel all'interno dello spazio dei nomi. Fin qui tutto bene, ma questa applicazione è accessibile tramite un'interfaccia web e non riesco a capire come instradare le richieste all'interfaccia web all'interno della mia LAN.
Ho seguito una guida di @schnouki che spiega come impostare uno spazio dei nomi di rete ed eseguire OpenVPN al suo interno
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
Successivamente, posso controllare il mio IP esterno e ottenere risultati diversi all'interno e all'esterno dello spazio dei nomi, proprio come previsto:
curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>
L'applicazione è avviata, sto usando diluvio per questo esempio. Ho provato diverse applicazioni con un'interfaccia web per assicurarmi che non si trattasse di un diluvio specifico.
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
Sono in grado di accedere all'interfaccia web sulla porta 8112 dallo spazio dei nomi e dall'esterno se specifico l'ip di veth vpn1.
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
Ma voglio reindirizzare la porta 8112 dal mio server all'applicazione nello spazio dei nomi. L'obiettivo è aprire un browser su un computer all'interno della mia LAN e ottenere l'interfaccia web con http: // my-server-ip: 8112 (my-server-ip è l'IP statico del server che ha istanziato l'interfaccia di rete)
EDIT: ho rimosso i miei tentativi di creare regole iptables. Quello che sto cercando di fare è spiegato sopra e i seguenti comandi dovrebbero generare un HTTP 200:
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
Ho provato le regole DNAT e SNAT e ho lanciato una MASQUERADE per buona misura, ma dal momento che non so cosa sto facendo, i miei tentativi sono inutili. Forse qualcuno può aiutarmi a mettere insieme questo costrutto.
EDIT: l'output di tcpdump di tcpdump -nn -q tcp port 8112
. Non sorprende che il primo comando restituisca un HTTP 200 e il secondo comando termina con una connessione rifiutata.
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 stesso mi ha indicato un articolo dell'Amministrazione Debian che spiega un proxy TCP iptables generico . Applicato al problema attuale, la loro sceneggiatura sarebbe simile a questa:
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
Sfortunatamente, il traffico tra le interfacce veth è stato sequestrato e non è successo nient'altro. Tuttavia, @schnouki ha anche suggerito l'uso di socat
come proxy TCP e questo funziona perfettamente.
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
Devo ancora capire la strana porta che si mescola mentre il traffico attraversa le interfacce Veth, ma il mio problema è risolto ora.
veth
dispositivi (trovo questo molto interessante, però ... ;-)). Haitcpdump
mai usato per controllare quanto arrivano i pacchetti in arrivo? Setcpdump -i veth0
non mostra nulla,tcpdumo -i lo
potrebbe essere necessario.