Perda de pacotes no túnel IpSec/GRE

Perda de pacotes no túnel IpSec/GRE

Esta é a minha configuração:

  +--------------------+ +-------------------+ +------ --------------+
  | Roteador B a +-----+ Roteador+Firewall C | | b Roteador D |
  | 10.10.10.1 ----------------------------------10.10.10.2 |
  | +-----+ | | +--- mais redes
  | 192.168.10.1 | |192.168.2.11 +--+192.168.2.57 |
  +----|---------------+ +-------------------+ +------ --------------+
       | |                
  +----|---------------+ +----|---------------+
  |192.168.10.11 | |192.168.2.38 |
  |Servidor A | |Cliente E |
  | | | |
  | | | |
  +--------------------+ +--------------------+
  • Os roteadores B e C possuem IPs públicos na internet e um túnel IpSec (Racoon) para 192.168.10.1-192.168.2.57.
  • Todas as máquinas estão rodando Ubuntu Linux.
  • Há um túnel GRE incorporado entre 192.168.10.1-192.168.2.57 com os IPs de túnel 10.10.10.1 e 10.10.10.2.
  • O túnel é necessário para poder rotear dados da rede 192.168.10.0/24 para outras redes atrás do roteador D (por exemplo, 192.168.3.0/24).
  • Cada IP pode executar ping em todos os outros IP.
  • Se o cliente E abre uma página web no servidor A, o handshake TCP/IP e o "GET /" chegam ao servidor A, mas a (grande) resposta do servidor A não chega ao cliente E, mas é perdida "no" GRE túnel.
  • Achei que tínhamos perdido pacotes grandes devido à fragmentação e reduzido o MTU nas interfaces a e b, no final para 1000 bytes, mas isso não ajudou.
  • tcpdump na interface a mostra o tráfego HTTP correto
  • tcpdump na interface b mostra o handshake e o tráfego HTTP de E->A, mas não mostra os grandes pacotes de resposta de A->E.
  • tcpdump no roteador + firewall C mostra os pacotes GRE saindo do túnel IpSec, nenhum pacote grande chega
  • A solicitação HTTP de B->E funciona bem.
  • Pacotes grandes entre D<->B não através do GRE, mas diretamente no túnel IpSec (ou seja, ssh 192.168.10.1 na interface 192.168.2.57) funcionam
  • Pacotes grandes entre B e "mais redes" funcionam (via túnel GRE!).
  • Trocar os papéis de A e E não ajuda. (E como servidor, A como cliente ou pacotes grandes na outra direção não funcionam.)

Agora estou preso. Algum conselho sobre o que verificar? Qual configuração ajudaria a diagnosticar? Muito obrigado!

Responder1

Você se esqueceu do MSS

1) Você deve definir o mtu no túnel gre 1400

2) Para pacotes SYN, defina mss no mesmo tamanho mtu 1400

no linux:

iptables -I FORWARD -i tun+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400

Responder2

A tabela padrão éfiltro, então quando você fornece uma regra como iptables -A FORWARD ...você acabou de colocar a regrafiltromesa. Existem também várias outras mesas e mesasmangleé um deles. A partir de man iptables: "Esta tabela é usada para alteração especializada de pacotes."

Então, para editar um pacote (que é feito por -j TCPMSS --set-mss) deve-se usar ummangletabela, é por isso que a regra deveria ser assim:

iptables -t mangle -A FORWARD -i tun+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400

informação relacionada