Pude configurar un espacio de nombres de red, establecer un túnel con openvpn e iniciar una aplicación que usa este túnel dentro del espacio de nombres. Hasta ahora todo bien, pero se puede acceder a esta aplicación a través de una interfaz web y no puedo entender cómo enrutar las solicitudes a la interfaz web dentro de mi LAN.
Seguí una guía de @schnouki que explicaba cómo configurar un espacio de nombres de red y ejecutar OpenVPN dentro de él.
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
Después de eso, puedo verificar mi ip externa y obtener diferentes resultados dentro y fuera del espacio de nombres, tal como estaba previsto:
curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>
La aplicación se inició, estoy usando diluvio para este ejemplo. Probé varias aplicaciones con una interfaz web para asegurarme de que no sea un problema específico de diluvio.
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
Puedo acceder a la interfaz web en el puerto 8112 desde dentro del espacio de nombres y desde afuera si especifico la ip de 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
Pero sí quiero redirigir el puerto 8112 desde mi servidor a la aplicación en el espacio de nombres. El objetivo es abrir un navegador en una computadora dentro de mi LAN y obtener la interfaz web con http: // my-server-ip: 8112 (my-server-ip es la ip estática del servidor que instancia la interfaz de red)
EDITAR: eliminé mis intentos de crear reglas de iptables. Lo que intento hacer se explica anteriormente y los siguientes comandos deberían generar 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
Intenté las reglas DNAT y SNAT y agregué una MASQUERADA por si acaso, pero como no sé lo que estoy haciendo, mis intentos son inútiles. Quizás alguien pueda ayudarme a armar esta construcción.
EDITAR: la salida de tcpdump de tcpdump -nn -q tcp port 8112
. Como era de esperar, el primer comando devuelve un HTTP 200 y el segundo comando termina con una conexión rechazada.
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
EDITAR: @schnouki mismo me señaló un artículo de la Administración de Debian que explica un proxy TCP genérico de iptables . Aplicado al problema en cuestión, su script se vería así:
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
Desafortunadamente, el tráfico entre las interfaces veth se detuvo y no sucedió nada más. Sin embargo, @schnouki también sugirió el uso de socat
un proxy TCP y esto funciona perfectamente.
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
Todavía tengo que entender el extraño desplazamiento de puertos mientras el tráfico atraviesa las interfaces veth, pero mi problema está resuelto ahora.
veth
dispositivos en absoluto (aunque esto es muy interesante ... ;-)). ¿Ha utilizadotcpdump
para verificar qué tan lejos llegan los paquetes entrantes? Sitcpdump -i veth0
no muestra nada, entoncestcpdumo -i lo
puede ser necesario.