Problemas de conexão com alguns sites através de gateway Linux

21:07 Software, Tutoriais

Se você instalou um Linux em seu velho Pentium 100 para ser o roteador dos pacotes de sua rede local para a internet (usando ADSL), mas não consegue fazer conexão com vários sites (embora alguns funcionem), você pode estar tendo problemas com a MTU (Maximum Transmission Unit) de sua interface de rede. Para entender a causa deste problema, precisamos entender um pouco mais a fundo o funcionamento dos diversos protocolos e camadas responsáveis pela transmissão dos pacotes para a internet.

Primeiramente, uma conexão ethernet tem um tamanho máximo de quadro (frame) de 1518 bytes. Destes, 14 são usados no cabeçalho do quadro, e outros 4 são utilizados para uma sequência de checagem do quadro. Podemos verificar então que o tamanho máximo para transmitir um pacote em ethernet é de 1500 bytes, e esse valor recebe o nome de MTU da interface de rede. Em outras palavras, o MTU de uma interface indica o tamanho do maior pacote IP que pode ser transmitido sem fragmentação.

Quando utilizamos ADSL para fazer a conexão com a internet, o que acontece é que as operadoras liberam o acesso atavés de um outro protocolo colocado acima do ethernet. Este protocolo é o PPPoE (PPP over Ethernet), que adiciona mais um cabeçalho de 8 bytes, reduzindo assim o MTU desta interface (interface ppp) para 1492 bytes. O protocolo TCP se encarrega de configurar um campo chamado MSS (Maximum Segment Size), que seria o tamanho máximo de um segmento (pacote TCP), que por padrão é o MTU da interface menos o tamanho do cabeçalho TCP (40 bytes), desta forma evitando a fragmentação dos pacotes. O problema é que no caminho em que o pacote tem que percorrer até chegar ao seu destino, podem haver links com uma MTU menor. Uma boa implementação do protocolo TCP executa a “procura de MTU no caminho”, que consiste em configurar um bit especial (DF - Don´t fragment) no pacote IP. Assim que um roteador encontra esta informação e verifica que a fragmentação seria necessária, este roteador deveria descartar o pacote e enviar uma resposta ICMP (Fragmentation-Required) de volta à origem. Com esta resposta, a origem poderia reenviar o pacote com um MTU menor.

O problema é que muitos provedores de serviço bloqueiam respostas ICMP, e muitos roteadores não enviam a resposta correta em caso de detecção do bit DF. Consideremos agora um exemplo prático:

Um browser faz uma requisição para uma página HTTP. Ao montar o pacote TCP, o sistema operacional detecta que o MTU de sua interface de rede é de 1500 (ethernet) e sugere um MSS de 1460 bytes. O servidor web também está conectado em ethernet e portanto aceita a sugestão dos 1460 bytes. A requisição é feita, e por se tratar de um pacote pequeno, faz seu caminho sem problemas. O servidor web responde a essa requisição com vários pacotes, muitos deles de 1460 bytes. Ao chegarem ao provedor, estes pacotes não podem ser transmitidos sobre o PPPoE (MTU de 1492), e portanto são descartados (bit DF ligado). Mas o provedor não envia a resposta ICMP esperada, e então o servidor web não tem como saber que o pacote foi descartado. O resultado é que os pacotes de resposta são silenciosamente descartados, e o browser fica aguardando por uma resposta que nunca chega.

Este problema ocorre também com acessos FTP: a conexão pode ser feita, mas as requisições de listagens de diretório são descartadas, e o cliente FTP trava esperando estas respostas.

Existem algumas formas de corrigir este problema:

Mudar o MTU das interfaces
Mudar o MTU de todas as interfaces de sua rede interna para o máximo que uma conexão PPPoE suporta (1492 bytes) ;

Habilitar o “PMTU clamping” no plugin PPPoE
Para isso, edite o arquivo /etc/ppp/pppoe.conf, mude a linha CLAMPMSS para:
CLAMPMSS=1492;

Habilitar o “PMTU clamping” usando o firewall do linux
Para isto, adicione a seguinte regra no início de sua tabela FORWARD (execute essa regra antes de todas as outras no seu script de firewall):
iptables -A FORWARD -p tcp –tcp-flags SYN,RST SYN -j TCPMSS –clamp-mss-to-pmtu

Nas duas últimas soluções, somente alterações no servidor são necessárias. No meu caso, a única alteração que funcionou corretamente foi a do firewall.

Referências:

http://www.linux.org/docs/ldp/howto/IP-Masquerade-HOWTO/mtu-issues.html
http://www.akadia.com/services/pppoe_iptables.html
http://www.znep.com/~marcs/mtu/index.html

Deixe um comentário

Seu comentário

Você pode usar as seguintes tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Atenção: A moderação de comentários está ativada, e isto pode atrasar a visualização de seu post. Não é necessário enviar novamente.