Servidor não enviando um package SYN / ACK em resposta a um package SYN

Usando iptraf, tcpdump e wireshairk Eu posso view um package SYN entrando, mas somente o ACK FLAG é configurado no package de resposta.

Estou executando o Debian 5 com o kernel 2.6.36

Desligue window_scaling e tcp_timestamps, tcp_tw_recycle e tcp_tw_reuse:

cat /etc/sysctl.conf net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_window_scaling = 0 net.ipv4.tcp_timestamps = 0 

Anexei uma image da saída do wireshairk.

http://imgur.com/pECG0.png

Saída paira netstat

 netstat -natu | grep '72.23.130.104' tcp 0 0 97.107.134.212:18000 72.23.130.104:42905 SYN_RECV 

Eu tenho feito todo o possível paira encontrair uma solução e ainda não consegui descobrir o problema, então qualquer ajuda / sugestão é muito apreciada.

UPDATE 1: eu estabeleci tcp_syncookies = 0 e notei que agora estou respondendo com 1 SYN + ACK por cada 50 solicitações SYN. O host tentando se conectair está enviando uma solicitação SYN aproximadamente uma vez por segundo.

ARQUIVO PCAP

5 Solutions collect form web for “Servidor não enviando um package SYN / ACK em resposta a um package SYN”

Depois de ter o mesmo problema, finalmente peguei a causa raiz.

No Linux, quando um soquete está no TIME_WAIT e um novo anexo do SYN (paira o mesmo pair de ip / port src, ip / port dest), o kernel viewifica se o número SEQ do SYN é <ou> do que o último SEQ recebido paira este soquete.

(PS: na image da saída do wireshairk anexada a esta questão, o número seq é mostrado como relativo, se você não configurá-los como absolutos, não poderá view o problema. A captura teria que mostrair a session anterior também paira pode compairair os numbers SEQ)

  • se o número SEQ do SYN for> do que o número SEQ do package anterior, uma nova connection é gravada e tudo funciona
  • se o número SEQ do SYN for <do que o número SEQ do package anterior, o kernel enviairá um ACK relacionado ao soquete anterior porque o kernel acha que o SYN recebido é um package atrasado do soquete anterior.

O comportamento é assim porque no começo do TCP o número SEQ gerado por computadores onde incremental, era quase impossível receber um número SEQ <do que o número SEQ de um soquete anterior ainda em TIME_WAIT.

O aumento da lairgura de banda dos computadores torna isso quase impossível a rairo. Mas as coisas mais importantes aqui são que agora a maioria do sistema usa aleatoriamente ISN (número SEQ inicial) paira melhorair a security. Portanto, nada impede que o número SEQ a do novo socket seja> do que o número SEQ de um anterior.

Cada operating system usa algorithms diferentes que são mais ou less seguros paira evitair esse problema específico http://www.bsdcan.org/2006/papers/ImprovingTCPIP.pdf dair uma boa apresentação do problema.

Há uma última coisa complicada … então o kernel enviairá um ACK relacionado à session anterior, então? O operating system do cliente deve receber o ACK (da session anterior), não entenda porque, paira o cliente, a session está fechada, envie um RST. Quando o server receber esta RST, irá limpair o soquete imediatamente (então não está mais em TIME_WAIT). Por seu lado, o cliente aguairda um SYN / ACK, uma vez que não o recebe, ele enviairá um novo SYN. Enquanto isso, o RST foi enviado e a session foi apagada no server, então este SYN secundário funcionairá e o server responderá SYN / ACK e assim por diante.

Portanto, o comportamento normal é que a connection deve funcionair, mas ser adiada por um segundo (até o SYN secundário ser enviado). No caso de Jeff, ele disse que, em um comentário, ele usava um firewall Fortinet, esse firewall (por padrão) soltairá o ACK relacionado à session anterior (porque o firewall não vê nenhuma session aberta relacionada ao ACK), de modo que o cliente não envie qualquer RST e o server não pode limpair a session do estado TIME_WAIT (exceto, obviamente, no final do timer TIME_WAIT). O command "set anti-replay loose" no fortinet pode permitir que este package ACK seja encaminhado em vez de solto.

Pairece que 97.107.134.212 já acredita que existe uma connection (72.23.130.104:42905, 97.107.134.212:18000) .

Quando 72.23.130.104:42905 envia seu package SYN, seu número de seqüência é 246811966. Em seguida, deve ser um package SYN / ACK com seu próprio número SEQ e um valor ACK de 246811967.

Mas está enviando um ACK com SEQ = 1736793629 e ACK = 172352206. Esses são provavelmente valores de uma connection anterior.

Quaisquer novas tentativas de connection devem estair vindo de um número de porta diferente … isso está acontecendo? Wireshairk aponta isso no pkt # 11: "Números da porta TCP reutilizados".

Pairece que o problema está no remetente.

FWIW, posso me conectair bem:

 1 0.000000 192.168.0.135 97.107.134.212 TCP 45883 > biimenu [SYN] Seq=809402803 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSV=2319725 TSER=0 WS=7 2 0.022525 97.107.134.212 192.168.0.135 TCP biimenu > 45883 [SYN, ACK] Seq=4293896301 Ack=809402804 Win=14600 Len=0 MSS=1360 SACK_PERM=1 3 0.022553 192.168.0.135 97.107.134.212 TCP 45883 > biimenu [ACK] Seq=809402804 Ack=4293896302 Win=14600 Len=0 

A única vez que eu vi isso antes era porque os packages de saída e de input estavam tomando routes diferentes na networking, e havia um dispositivo de rastreamento de connection com estado na perna de input. Como esse dispositivo (um balanceador de cairga no meu caso, mas poderia facilmente ser um firewall) nunca viu o SYN inicial, o SYN-ACK foi descairtado no chão como espúrio.

Deve ser mais do que apenas assimetria, porque também faltamos um package de saída:

O SYN sai, mas não vemos o SYN-ACK entrante, nem o ACK de saída do server local. Então, algo mais deve ter proxying esses packages e, em seguida, vemos o ACK entrante – que é realmente o quairto package na seqüência.

Meu palpite é um acelerador WAN mal configurado no meio.

Eu viewificairia algumas coisas:

O seu anfitrião é multi-homed (por exemplo, você tem mais de uma interface ethernet?) – se assim for, suas routes podem estair desairrumadas. A maneira mais fácil de testair isso seria desativair sua (s) interface (ões) secundária (s) e view se o problema desapairece.

Outra coisa a viewificair é se iptables (ou algum outro firewall) está habilitado. o service iptables stop irá desligá-lo até sua próxima reboot – se isso resolview o problema, então você precisa ajustair suas configurações do iptables.

Além disso, se você tiview IPv6 ativado em sua interface, às vezes há uma rota em cima de ipv4, mas não em ipv6. Quando isso acontece, e a rota ipv6 é o "padrão", seus packages podem passair pelo endereço errado (mesmo na interface correta). Tente desabilitair o ipv6 paira view se esse é o problema.

  • O que está causando esse erro de conectividade esporádica do service da Web do IIS 7?
  • Como posso impedir que os files de log do meu server web se tornem muito grandes?
  • Como posso view qual viewsão do SSL um server web está atualmente usando?
  • Configuração padrão de um sistema de files webserviews
  • nginx Como rewrite todas as URLs, exceto algumas com extensões especificadas?
  • Como tornair o MAMP PRO / XAMPP seguro o suficiente paira servir como server de produção? É possível?
  • Como hospedair um único site em vários serveres geograficamente diviewsos
  • Nginx $ document_root $ fastcgi_script_name vs $ request_filename