IPTables e proxies transparentes

4

Eu configurei um proxy TCP local e transparente em localhost . Eu quero redirecionar todo o tráfego TCP para este proxy, para que ele possa lidar com isso e nada "vaza", contornando o proxy. Eu preciso usar o IPTables para redirecionar o tráfego. Pensei em usar o TPROXY, mas isso requer suporte a aplicativos e somente o alvo REDIRECT é suportado no momento.

Eu usei as seguintes regras do IPTables:

iptables -t nat -A OUTPUT -o lo -j RETURN
iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN
iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN
iptables -t nat -A OUTPUT -m owner --uid-owner proxy-owner -j RETURN
iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $PROXY_PORT

iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner proxy-owner -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j LOG
iptables -P OUTPUT DROP

Eles parecem funcionar bem, mas estou confuso sobre o porquê.

Aqui estão duas perguntas que ainda não sei a resposta:

1) Em relação à última regra na tabela NAT, por que eu quero apenas redirecionar os pacotes SYN para a porta proxy local ( --syn )?    Eu quero redirecionar todos os pacotes TCP. Na configuração atual parece apenas o pacote SYN    é redirecionado para o proxy local, e todos os outros pacotes podem fluir diretamente para o destino, levando (em teoria) a uma confusão total (ou todos, exceto o SYN sendo bloqueado pela tabela de filtros).    No entanto, se eu descartar a opção --syn e redirecionar todos os pacotes para o proxy local, o proxy não funcionará. Por quê?

2) Com relação à quarta regra na tabela de filtros, por que preciso permitir explicitamente conexões estabelecidas de saída? O proxy é o único aplicativo que tem permissão para enviar pacotes para destinos não locais de qualquer maneira , e já é permitido fazer isso (regra 3), então para que eu preciso da quarta regra? Parece que permite que conexões não proxy contornem o proxy.

Obrigado!

    
por BlueShirm 26.09.2011 / 02:57

3 respostas

1

As duas partes da sua pergunta estão vinculadas.

A parte (1) captura um pacote SYN e o redireciona como você sugere. A partir deste ponto, o conntrack (2) assume e reconhece que cada pacote subseqüente nesse fluxo é parte da mesma conexão e o redireciona da mesma maneira que o pacote SYN original.

Uma visão geral do controle de conexão pode ser encontrada no link

    
por 26.10.2011 / 17:06
1

Respostas:

  1. O motivo pelo qual você deseja unir os SYNs é duplo. Primeiro, todos os pacotes estabelecidos subsequentes serão passados por conntrack (a segunda linha que você perguntou). Qualquer coisa que seja não correspondida por conntrack e também não seja um SYN é um pacote não estabelecido e não pertence. Portanto, ele é ignorado neste ponto e, finalmente, é finalmente descartado pela última regra em sua tabela de filtros. Essa é uma maneira de proteger seu processo de proxy da atividade de seus usuários. Por exemplo, algumas formas de sondagem de rede começam a enviar com ACK ou FIN apenas para ver como o remoto reagirá e alguns aplicativos morrem horrivelmente quando recebem pacotes malformados / inesperados.

  2. Por que permitir explicitamente o tráfego conntrack-ed? Porque a última linha indiscriminadamente cai tudo. Deixar o drop e remover o conntrack deixaria os pacotes do seu proxy conversando com os clientes. Há uma distinção muito boa aqui. As linhas que correspondem com base no proprietário do uid correspondem apenas aos pacotes gerados pelo proprietário do proxy. Os pacotes de entrada dos clientes que são entregues ao proxy não são de propriedade do proxy.

Considere o seguinte diagrama:

[ client ] <---traffic---> [ proxy ] <---traffic---> [ target ]

O tráfego à esquerda entre o cliente e o proxy não é de propriedade do proxy (foi criado por uma fonte não confiável fora do sistema) e, portanto, não corresponde à linha 3 do filtro, que significa que sem a linha de filtro 4 ele será derrubado pela linha de filtro seis.

O tráfego à direita entre o proxy e o destino é de propriedade do proxy (foi criado por um processo executado sob um UID local) e, portanto, é sempre permitido pela linha nat 4 e filtrar linha 3.

No seu caso especificamente, como tudo está sendo executado localmente, essa pode não ser a melhor abordagem. Há várias maneiras de você poder rolar as regras iptables . O que realmente importa é que isso ainda funcione para você. Se você aprender mais sobre o iptables você pode massagear as regras, mas você pode deixá-lo como está e ficar bem também.

Espero que isso ajude. É um assunto bastante complexo.

    
por 12.06.2012 / 20:19
0

I need to use iptables to redirect the traffic

Não - você acabou de configurar sua rede para que este seja o único host com acesso à Internet e diga a todos os demais para usá-lo como roteador.

As outras coisas que você precisa são apenas NAT / masquerading - tentar fazê-lo se comportar como um proxy é simplesmente bobo.

    
por 26.09.2011 / 15:17