Eu configurei o Tor com sucesso para o proxy transparente usando o iptables (ou seja, todos os que saem o tráfego é enviado através do Tor sem o conhecimento do aplicativo). Ao fazer isso, descobri um problema estranho e uma correção igualmente estranha (solução alternativa?).
Minhas regras são as seguintes. Nenhuma cadeia definida pelo usuário ou outras regras presentes, todas as políticas são ACCEPT.
-t nat -A OUTPUT -o lo -j RETURN
-t nat -A OUTPUT -p tcp -m owner --uid-owner tor -j RETURN
-t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports 54
-t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 55
-A INPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT # Rule A
-A OUTPUT -d 127.0.0.1 -j ACCEPT # Rule B
-A OUTPUT -p tcp -m owner --uid-owner tor -j ACCEPT
-A OUTPUT -j REJECT # Rule C
Em outras palavras:
(Embora essa configuração tenha alguns problemas, como não responder às conexões da LAN, elas são irrelevantes para o problema em questão.)
Se a Regra B não estiver presente, todas as conexões de saída serão imediatamente rejeitadas pela Regra C. Sei que são rejeitadas pela Regra C porque a alteração do tipo de rejeição (ex. --reject-with icmp-proto-unreachable
) resulta em um erro diferente. Exemplo de mensagens de erro sem a regra B:
# With Rule C --reject-with icmp-port-unreachable, the default:
$ curl 213.155.151.153 # (google.com; DNS also doesn't work)
curl: (7) Failed connect to 213.155.151.153:80; Connection refused
# With Rule C --reject-with icmp-proto-unreachable:
$ curl 213.155.151.153
curl: (7) Failed connect to 213.155.151.153:80; Protocol not available
Com a Regra B, as conexões funcionam bem.
Baseado no meu entendimento do iptables, quando uma conexão TCP de saída é feita, a terceira regra na cadeia OUTPUT de nat
irá reescrever o destino do pacote para 127.0.0.1:54. O pacote entrará então na cadeia OUTPUT de filter
, e deverá ser correspondido pela Regra A, já que sua interface de saída é agora a interface de loopback. No entanto, não é correspondido pela Regra A, e se a Regra B (que corresponde a ela) não estiver presente, o pacote é arrastado para um beco e assaltado pela Regra C.
Por que a regra A e a regra B não são equivalentes? Como a correspondência da interface de loopback é diferente da correspondência do endereço de loopback, nesta situação?
Tags networking iptables linux