Arquivo

Textos com Etiquetas ‘snat’

Mais um mistério do Port Forwarding: Um cache no meio do caminho.

3, maio, 2010 andre 2 comentários


“Houston, we have another problem!”

Lembra daquele mistério “fantasmagórico” envolvendo o port forwarding quando acessado da rede interna? Pois bem, aquele mesmo cliente andou navegando por aí e no meio do caminho acabou caindo no artigo do Rodrigo Ribeiro que fala do Lusca Cache + Thunder Cache. De imediato, seu telefone toca e vem a solicitação para instalá-lo no servidor que hospeda o firewall.

Após tudo instalado, todo mundo navegando, relatório de economia sendo gerado e etc, você recebe outra ligação: Quando alguém da rede interna tenta acessar o servidor web da empresa (é, aquele do outro post), simplesmente não vai.

Causa:

Mais uma vez, a causa deste mistério pode ser descoberta analisando o caminho que o pacote percorre fora e dentro do servidor.

Veja a figura abaixo:

Figura 1

Percebam que a conexão é feita diretamente no proxy, porta 8888 neste caso, pois o browser está configurado para utilizar proxy ao invés de fazer a conexão direta. O browser faz a solicitação da página e o processo do proxy irá resolver o nome do site se necessário e, após isto, abrir conexão para o IP. Neste momento o proxy retorna que não conseguiu conectar no site. A mensagem pode variar de acordo com a política de firewall adotada.

Vamos analisar novamente o diagrama da travessia dos pacotes pelas tabelas e chains do ipfilter:

Figura 2

Temos um port forwarding que está sendo feito na tabela chain prerouting da tabela nat, mas este nosso pacote não passa por lá. Temos que observar que ele vem de um processo local, e só passa pela chain prerouting os pacotes que vêm da rede externa ao host. Logo, quando o pacote chega ao ip real do servidor web (que é um ip local), ele não é redirecionado e o proxy estará tentando conectar no próprio host.

Resolução:

Vejo duas soluções que podem ser utilizadas. A primeira, bem simples, é adicionar o ip real na lista de exclusão do browser. No caso de utilizar-se browsers ou aplicações que não possuam esta opção, aí não terá jeito.

A segunda, basicamente, resolvemos o problema repetindo o dnat feito na chain prerouting na chain output. Desta forma, os pacotes locais também serão redirecionados para o servidor web que está na rede interna. Veja o exemplo:

iptables -p tcp -t nat -A OUTPUT -d 200.254.225.31 –dport 80 -j DNAT –to-destination 172.15.25.3:80

Para incrementar mais esta solução (que eu acho até mais elegante e menos despendiosa), dei uma analisada com mais calma no manual do iptables, e verifiquei a existência do módulo owner, que identifica os pacotes vindos de um processo que tenha um uid e gid específicos. Com isto, podemos restringir a nossa solução apenas aos pacotes gerados pelo processo do Proxy. Podemos modificar nossa regra anterior para:

iptables -p tcp -t nat -A OUTPUT -d 200.254.225.31 –dport 80 -m owner –owner-uid squid –owner-gid squid -j DNAT –to-destination 172.15.25.3:80

É importante observar que no manual do iptables indica a possibilidade de se utilizar os parâmetros –pid-owner, –sid-owner e –cmd-owner. Porém, há também a seguinte observação: “NOTE: pid, sid and command matching are broken on SMP”. Por este motivo, não utilizei nenhuma destas opções. Para o nosso caso, o ideal mesmo seria o –cmd-owner, mas ele foi removido a partir do kernel 2.6.15. É uma pena!

Conclusão

Uma solução foi formada pela análise do cenário e estruturas internas do servidor relacionadas com filtro de pacotes (ipfilter), bem como da ferramenta utilizada para gerar as regras, no caso o iptables. Tenha sempre em mente que conhecer o ambiente entendendo como ele funciona é o que construirá seu sucesso ou fracasso em uma situação.

“Conheça a si e ao inimigo, e não temerás 100 batalhas” – A arte da guerra, Sun Tzu

Artigo também publicado em Zé Bob na Itália

Categories: Firewall e Redes, Linux

Port Forward mais completo: caçando o fantasma da rede.

28, abril, 2010 andre Sem comentários


“Houston, we have a problem!”


Problema:


Um cliente solicitou que fosse feito um redirecionamento das portas 80 e 443 para um servidor web que se encontra na rede interna da empresa, pois os consultores externos iriam iniciar os testes no novo sistema. No firewall, foi adicionada uma regra de redirecionamento (os usuários do IPTables conhecem como DNAT), você testou, e está tudo ok!

Ao solicitar o teste por parte do cliente, ele lhe diz que não consegue fazer o acesso.


Causa:


A causa deste problema está no percurso em que o pacote percorre quando o servidor responde à requisição de uma estação que está na rede interna. Observe na figura 1 o caminho que é feito pelo pacote quando há uma requisição de fora da rede interna:

OBS: Os endereços contidos neste documento são aleatórios, apenas para demonstração.


Figura 1

Neste caso, o mesmo caminho é percorrido tanto na ida quanto na volta. O pacote consegue ir e voltar sem nenhum impecilho. Observe agora na figura 2 como isto ocorre quando a requisição é feita da rede interna:

Figura 2

Podemos verificar que o caminho percorrido é diferente. O servidor não encaminha o pacote de resposta para o seu gateway. Vejamos mais detalhadamente o caminho que o pacote percorre:

  1. A estação solicita conexão (pacote com flag SYN ativado)  para o IP 200.254.225.31.
  2. O firewall modifica o destination ip para fazer o port forward (novo destination: 172.15.25.3).
  3. O servidor recebe o SYN packet e responde com pacote de aceite da conexão (pacote com os flags SYN e ACK ativados), para o IP da estação (172.15.25.100).
  4. Na tabela de roteamento do servidor, este pacote é redirecionado para o barramento, pois tem como destino um IP da mesma rede que ele está conectado, sem passar pelo gateway.
  5. A estação recebe o pacote SYN/ACK e, após verificar que não está esperando resposta de conexão deste host (172.15.25.3) mas sim do host (200.254.225.31), ele descarta o pacote.
  6. Após o período de timeout da conexão, esta é descartada.

Solução:

Uma solução que pode ser utilizada neste caso é criar uma regra que modifique o source address do pacote durante o caminho de ida. Seria como mascarar o pacote que venha da rede interna e tenha destino o IP e porta do servidor. Vou exemplificar com regras do IP Tables. Porém, para um melhor entendimento desta regra, é melhor darmos uma olhada no caminho que o pacote percorre nas chains e tabelas do IP Tables.

Figura 3

(fonte: Iptables Tutorial 1.1.19, Chapter 3)

Bom, para o DNAT, utilizamos:

/sbin/iptables –p tcp –t nat –A PREROUTING –d 200.254.225.31 –dport 80 –j DNAT –to-destination 172.15.25.3:80

As regras de DNAT são aplicadas na tabela NAT, chain PREROUTING. As de SNAT, na tabela Nat e chain POSTROUTING. Analisando a figura 3, vemos que quando o pacote chega na chain POSTROUTING, ele já passou pela PREROUTING. Desta forma, o seu destination já foi alterado. Então, a nossa regra tem que filtrar os pacotes vindo de toda a rede interna (ou um ip dela, a depender do caso) com destino o servidor (dentro da rede interna tb) na porta 80, e não o IP 200.254.225.31. Segue a regra:

/sbin/iptables –p tcp –t nat –A POSTROUTING –s 172.15.25.0/100 –d 172.15.25.3 –dport 80 –j SNAT –to-source 200.254.225.31

Após isto, basta permitirmos o tráfego do pacote na tabela filter, chain FORWARD e pronto, está tudo funcionando corretamente. Segue a regra:

/sbin/iptables –p tcp –t filter –A FORWARD –s 172.15.25.0/100 –d 172.15.25.3 –dport 80 –j ACCEPT

Veja como ficou o novo desenho na figura 4:

Figura 4

Notem que agora a estação recebe o pacote SYN/ACK do mesmo IP que ele havia solicitado antes.

Esta lógica pode ser utilizada para demais ferramentas de firewall, bastando estudar antes como o pacote trafega dentro dele para assim gerar as regras necessárias. O resto, a lógica é a mesma.

Artigo publicado também em:

Blog Zé Bob na Itália

Viva o Linux

Categories: Firewall e Redes, Linux

andresousa.org is Digg proof thanks to caching by WP Super Cache