iptables encaminha tráfego não local através do proxy ssh

iptables encaminha tráfego não local através do proxy ssh

Estou tentando encaminhar o tráfego de uma porta local para uma máquina remota através de SSHprocurador(não túnel). Aprendi que isso não pode ser feito apenas com regras de iptables (corrija-me, se não for verdade), então configurei o REDSOCKS para redirecionar conexões TCP para o proxy SSH SOCKS.
Consegui transportar o tráfego local para a máquina remota com regras de iptables na cadeia OUTPUT, mas o mesmo conceito no PREROUTING não funciona. O objetivo é fazer com que a máquina local visualize a Internet externa como seria na rede da máquina remota (como uma VPN).

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

Nota: não quero fazer nada (alterar configuração, adicionar rotas) na máquina remota!

Conexão SSH estabelecida com ssh -D 1337 user@remote.
Redsocks já está configurado e iniciado, escutando na porta 12345.

na máquina intermediária:

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

Depois disso, o tráfego da máquina local é redirecionado e eu vejo a internet como se estivesse na rede remota!
Mas a máquina internanão podeacesso à internet.

(O endereço IP nodentromáquina já configurada, testada com um ping bem-sucedido.)

Tentei:

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

Se euapenasdefinir a iptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADEregrasozinho, a máquina interna pode acessar a Internet (mas não através do proxy).

Depois de tentar conectar, vejo as seguintes estatí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

Pelo que entendi, isso significa que os pacotes da máquina interna também são redirecionados, mas são perdidos em algum lugar...


Também tenho algumas perguntas

  • por que o tráfego ssh não é redirecionado pela iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports $REDSOCKS_PORTregra? Eu apenas filtrei a $SSH_SOCKS_PORTporta ...

fluxograma iptables

Responder1

Ok, o problema não estava nas regras do iptables, ou não principalmente.
REDIRECIONAR Iptablesfaça o seguinte:

Ele redireciona o pacote para a própria máquina, alterando o IP de destino para o primárioendereço da interface de entrada(pacotes gerados localmente são mapeados para o endereço 127.0.0.1).

E redsocks, por padrão, ouvem apenas os pacotes que chegam127.0.0.1, portanto, os pacotes com o destino de um endereço de interface não chegarão aos redsocks.

Depois de alterar a configuração do redsocks paralocal_ip = 0.0.0.0;funcionou.

(Nota: é apenas para TCP, para UDP (como DNS) são necessárias configurações adicionais.)

Responder2

De acordo com a sua situação, você só precisa monitorar redsocks até 10.0.0.1, depois REDIRECT ou DNAT, por exemplo

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

Eu encontrei o mesmo problema que você. Fiquei confuso com OUTPUT e continuei ouvindo em 127.0.0.1.

Referência:Roteando uma conexão VPN para um proxy meias no mesmo servidor

informação relacionada