
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
- adicionando
iptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADE
Se euapenasdefinir a iptables -t nat -A POSTROUTING -o $OUTSIDE_INTERFACE -j MASQUERADE
regrasozinho, 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_PORT
regra? Eu apenas filtrei a$SSH_SOCKS_PORT
porta ...
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