
Estoy enrutando conexiones HTTPS a través de un túnel SSH (-w) usando iptables
marcas y iproute2
reglas, las razones por las que necesito hacerlo de esta manera son artificiales, por decir lo menos, por lo que es posible que la mayoría de las soluciones alternativas no funcionen para mí en absoluto.
El dispositivo tun0 existe y funciona como deseo, y el enrutamiento funciona cuando aplico la MARCA en la cadena de SALIDA, pero por alguna razón la regla de enrutamiento parece no funcionar si la MARCA se aplica en la cadena ADELANTE.
El sistema operativo es CentOS 6.7 con un kernel 2.6.32 y iptables 1.4.7. El iptables
marcado y registro:
# iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark 1
# iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 1
# iptables -t mangle -A POSTROUTING -m mark --mark 1 -j LOG --log-prefix "marked: "
La iproute2
configuración de la regla:
# cat 201 tunneled >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table tunneled
# ip route add default via 192.168.100.1 dev tun1 table tunneled
Y una pequeña sección del registro para mostrar resultados:
Feb 17 19:11:35 nhopm kernel: marked: IN= OUT=eth0 SRC=192.168.82.2 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=16734 DF PROTO=TCP SPT=34619 DPT=443 WINDOW=29200 RES=0x00 SYN URGP=0 MARK=0x1
Feb 17 19:12:00 nhopm kernel: marked: IN= OUT=tun1 SRC=192.168.81.8 DST=69.30.217.90 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=62747 DF PROTO=TCP SPT=55349 DPT=443 WINDOW=14600 RES=0x00 SYN URGP=0 MARK=0x1
El host tiene 2 NIC eth0
: 192.168.81.8, siendo 192.168.81.1 la puerta de enlace predeterminada y eth1
192.168.82.8 que actúa como la puerta de enlace predeterminada para 192.168.82.0/24; no hay problemas con esta configuración, funciona como se esperaba. El túnel tun0 tiene 192.168.100.1 en su otro extremo.
He tratado de reducir esto a la situación más simple que ilustra el problema sin abrumar con detalles, pero proporcionaré tantos detalles como se considere necesario para tratar de encontrar dónde radica el problema. Solicite cualquier cosa que pueda ser útil en los comentarios. Espero haber entendido mal una pequeña parte de cómo funciona esto.
Solución alterna
Mi intento de hacer lo anterior se basó en este iptables
diagrama de flujo:
de iptables.info
Lo que oculta el hecho de que el mismo conjunto deDecisión de rutano se aplican a los paquetes provenientes de la cadena OUTPUT como a los provenientes de la cadena FORWARD.
Para que esto funcionara, necesitaba reemplazar la marca realizada en la cadena ADELANTE con una entrada similar en la cadena PREROUTING.
iptables -t mangle -A PREROUTING -p tcp --dport 443 ! -d 192.168.0.0/16 -j MARK --set-mark 1
Lo que en realidad se adapta un poco mejor a mis necesidades.
Sin embargo, no voy a responder a esto (todavía), ya que todavía no he encontrado documentación al respecto; si lo hago, daré una respuesta, a menos que alguien se me adelante.