iptables REDIRECT em combinação com correspondência na interface vs. endereço IP

2

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:

  • Todo o tráfego de / para o host local é intocado.
  • Todo o tráfego gerado pelo Tor é intocado.
  • Todas as conexões TCP de saída são enviadas por meio do Tor (a porta de proxy transparente é 54).
  • Todas as consultas de DNS de saída são resolvidas pelo Tor (DNS na porta 55).
  • Para evitar vazamentos, todos os outros tráfegos de saída são atingidos na cabeça com um tijolo e jogados em uma vala.

(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?

    
por Sam Harada 11.11.2013 / 23:05

0 respostas