Por curiosidade, estou lendo alguns tutoriais sobre proxies TOR transparentes, pois é um tópico bastante interessante do ponto de vista da rede. Ao contrário dos gateways VPN que usam apenas tun
/ tap
interfaces e são totalmente claros para mim, o proxy TOR usa uma única porta. Todos os tutoriais repetem a linha mágica:
iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040
onde eth0
é a interface de entrada (LAN) e 9040
é alguma porta TOR. O problema é que não entendo completamente por que tal coisa faz sentido do ponto de vista da rede.
De acordo com o meu entendimento de redirect
/ dst-nat
chains e como parece funcionar em roteadores físicos, dst-nat
a cadeia toma dst-port
e dst-addr
ANTES que a decisão de roteamento seja tomada e os altere para outra coisa. Então por exemplo:
- antes
dst-nat
:192.168.1.2:46364 -> 88.88.88.88:80
- depois
dst-nat
:192.168.1.2:46364 -> 99.99.99.99:8080
E 99.99.99.99:8080
é o que outras cadeias na faixa de fluxo de pacotes IP veem (por exemplo filter
, tabela) e é assim que o pacote fica a partir de agora após deixar o dispositivo, por exemplo.
Agora, muitas pessoas na Internet (incluindo neste stackexchange) alegaram que redirect
é basicamente o mesmo que dst-nat
definir dst-addr
o endereço local da interface. Diante disso, esta regra:
iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040
claramente não faz sentido. Se fosse assim que funcionasse, o TOR obteria todos os pacotes com destino 127.0.0.1:9040
. Para aplicativos típicos em que o aplicativo pega o pacote e responde a ele de alguma forma (por exemplo, servidores da Web), faz todo o sentido porque, afinal, esse processo do servidor é o destino final do pacote de qualquer maneira, portanto, tudo bem que o endereço de destino seja localhost. Mas o roteador TOR é bem ... um roteador, então ele precisa saber o destino original do pacote. Estou esquecendo de algo? Não DNAT
afeta o que os aplicativos locais recebem? Ou é um comportamento específico da REDIRECT
diretiva?
Dê uma olhada nesta resposta: Como um proxy SOCKS transparente sabe qual IP de destino usar?
Cotação:
O iptables substitui o endereço de destino original, mas lembra o antigo. O código do aplicativo pode buscá-lo solicitando uma opção de soquete especial,
SO_ORIGINAL_DST
.Na verdade, você está certo sobre o TOR, todo pacote tcp recebido é redirecionado para localhost:9040.
O REDIRECT alvo é um tipo especial do alvo DNAT, que mudaria o endereço IP para a interface local e mapearia para a porta que você especificou.
Suponha que haja um roteador cuja interface lan seja
eth0
(com rede192.168.1.0/24
e endereço IP:192.168.1.1
) e a regra iptables para esse roteador seja:iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040
então todos os pacotes tcp dos clientes dentro da lan seriam redirecionados para
192.168.1.1:9040
.Suponha que haja conexão tcp do cliente (com endereço IP
192.168.1.2
) dentro da lan para google.com (suponha que ip:)8.8.1.1
então,pedido bruto:
192.168.1.2:12345 -> 8.8.1.1:80
após a cadeia de pré-roteamento do roteador:
192.168.1.2:12345->192.168.1.1:9040