
Estoy intentando reenviar el tráfico de red a través de una VPN Wireguard a una máquina virtual que se ejecuta en otro host. Todo eso, preservando al mismo tiempo la dirección IP de origen original para lograr un proxy transparente. Ambos servidores están alojados en diferentes centros de datos. Esta es mi configuración de red:
La red es una máquina "Proxy" que reenvía la red mediante DNAT:
iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dport $ports -j DNAT --to 192.168.122.100
ip route add 192.168.122.100 dev wg1
Puedo acceder a la dirección IP de la VM desde una sesión ssh en una máquina proxy consultando 192.168.122.100 directamente. Si intento acceder a estos puertos reenviados desde una red externa consultando la dirección IP yyyy, el tráfico se detiene en la máquina host, tabla nat/paso PREROUTING.
RASTREO del paquete que no se entrega (zzzz sería la dirección IP de mi casa). El seguimiento proviene de la máquina "host":
raw:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT
mangle:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT
mangle:PREROUTING-CUSTOM-BACK:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT
mangle:PREROUTING-CUSTOM-BACK:return:3 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT
mangle:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT
nat:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT
nat:PREROUTING-CUSTOM-FRONT:return:3 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT
nat:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT
nat:PREROUTING:policy:2
ejecuta ACCEPT
la política predeterminada aquí.
Un seguimiento de paquetes en funcionamiento (en la máquina Host) cuando intento acceder a 192.168.122.100 directamente:
raw:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING-CUSTOM-BACK:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING-CUSTOM-BACK:return:3 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING-CUSTOM-FRONT:return:3 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:FORWARD:policy:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
filter:FORWARD:rule:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
filter:FORWARD-CUSTOM-FRONT:rule:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:POSTROUTING:policy:2 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING:rule:1 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING-CUSTOM-FRONT:return:1 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING:policy:7 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
Como puede ver, nat:PREROUTING:policy:2
todavía se ejecuta y luego ese paquete se enruta a una VM. La única diferencia realmente es la dirección IP de origen.
Mi pregunta es la siguiente: ¿la pila de redes Linux descarta paquetes que provienen de un dispositivo de red LAN pero que tienen una dirección de origen que no es LAN? ¿Hay alguna forma de solucionar este problema y enrutar más los paquetes?
Respuesta1
Resulta que la pila de redes de Linux de hecho eliminó estos paquetes y con muy buen propósito. La pila de redes hace algo llamado "Filtrado de ruta inversa". Los paquetes que llegan desde un dispositivo de red tienen una IP de origen que no se enrutaría a través del mismo dispositivo y se descartarían. En circunstancias normales, dichos paquetes no son válidos o podrían tener intenciones maliciosas. Sin embargo, si sabes lo que estás haciendo, es posible desactivar este comportamiento:
echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter # blanket-disable for all interfaces
echo 1 >/proc/sys/net/ipv4/conf/eth0/rp_filter # enable for external network device just to be safe
Ahora los paquetes se reenvían más y se puede lograr un proxy transparente.