iptables reenvía tráfico no local a través del proxy ssh

iptables reenvía tráfico no local a través del proxy ssh

Intento reenviar tráfico desde un puerto local a una máquina remota a través de SSHapoderado(no túnel). Aprendí que no se puede hacer solo con reglas de iptables (corríjame si no es cierto), así que configuré REDSOCKS para redirigir las conexiones TCP al proxy SSH SOCKS.
Logré transportar el tráfico local a la máquina remota con reglas de iptables en la cadena de SALIDA, pero el mismo concepto en PREROUTING no funciona. El objetivo es hacer que la máquina local vea Internet exterior como lo sería en la red de la máquina remota (como una VPN).

----------                      --------------
| inside |  <-- 10.0.0.0/24 --> |-> iptables |
----------                      |      |     |
                                |      ˇ     |
                                |   redsocks |
                                |      |     |
                                |      ˇ     |                  ----------
                                |     ssh -> | <-- internet --> | remote |
                                --------------                  ----------

Nota: ¡No quiero hacer nada (cambiar la configuración, agregar rutas) en la máquina remota!

Conexión SSH establecida con ssh -D 1337 user@remote.
Redsocks ya está configurado e iniciado, escuchando en el puerto 12345.

en la máquina del medio:

OUTSIDE_INTERFACE=wlan0
INSIDE_INTERFACE=eth0
SSH_SOCKS_PORT=1337
REDSOCKS_PORT=12345

# set the ip address
ifconfig $INSIDE_INTERFACE 10.0.0.1 netmask 255.255.255.0

# enable ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# reset iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -F
iptables -X

# redirect local traffic, except traffic from redsocks to ssh
iptables -t nat -A OUTPUT -p tcp --dport $SSH_SOCKS_PORT -j RETURN
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT

# redirect traffic from inside
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT

Entonces, después de esto, el tráfico de la máquina local se redirige y veo Internet como si estuviera en la red remota.
Pero la máquina interiorno puedoacceso a Internet.

(La dirección IP en eladentroLa máquina ya está configurada, probada con un ping exitoso).

Lo intenté:

  • iptables -t nat -A PREROUTING -s 10.0.0.0/24 -p tcp -j REDIRECT --to-ports 12345
  • añadiendoiptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADE

Si yosoloestablecer la iptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADEreglasolo, la máquina interna puede acceder a Internet (pero no a través del proxy).

Después de intentar conectarme, veo las siguientes estadísticas:

# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 10 packets, 641 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   42  2184 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 12345

Chain INPUT (policy ACCEPT 43 packets, 2244 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 19 packets, 1164 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   18  1080 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1337
   18  1080 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            redir ports 12345

Chain POSTROUTING (policy ACCEPT 46 packets, 2825 bytes)
 pkts bytes target     prot opt in     out     source               destination

Según tengo entendido, significa que los paquetes de la máquina interna también se redirigen, pero luego se pierden en alguna parte...


También tengo alguna pregunta

  • ¿Por qué la regla no redirige el tráfico ssh iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports $REDSOCKS_PORT? Sólo filtré el $SSH_SOCKS_PORTpuerto...

diagrama de flujo de iptables

Respuesta1

Ok, el problema no estaba en las reglas de iptables, o no principalmente.
Redirección de iptablesHaz lo siguiente:

Redirige el paquete a la propia máquina cambiando la IP de destino a la principaldirección de la interfaz entrante(Los paquetes generados localmente se asignan a la dirección 127.0.0.1).

Y los calcetines rojos, de forma predeterminada, solo escuchan el paquete que llega.127.0.0.1, por lo que los paquetes con destino a una dirección de interfaz no llegarán a redsocks.

Después de cambiar la configuración de redsocks alocal_ip = 0.0.0.0;funcionó.

(Nota: es solo para TCP, para UDP (como DNS) se necesitan más configuraciones).

Respuesta2

Según su situación, solo necesita monitorear redsocks hasta 10.0.0.1, luego REDIRECT o DNAT, por ejemplo

iptables -t nat -A PREROUTING -p tcp -m tcp --syn -j DNAT --to 10.0.0.1:12345

Encontré el mismo problema que tú. La SALIDA me confundió y seguí escuchando en 127.0.0.1.

Referencia:Enrutar una conexión VPN a un proxy de calcetines en el mismo servidor

información relacionada