
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