Eu tenho um problema misterioso com um pequeno servidor que estou executando em casa, atrás de um roteador NAT. Estou executando vários serviços da web e outros, que também posso acessar de fora da minha LAN por meio do encaminhamento de porta. Desde alguns dias, não consigo mais acessar o servidor da Web (nem pela porta 80 nem pela 443). Mas só de fora da LAN! De dentro, ainda consigo acessar sem problemas. O SSH ainda funciona de fora, embora em uma porta não padrão.
Então eu fiz um rastreamento Wireshark onde um navegador fora da LAN tenta acessar o servidor. Por questões de legibilidade e anonimato, mudei o endereço IP do servidor para s.s.s.s e o endereço IP do navegador para b.b.b.b.
No. Time Source Destination Protocol Length Info
1 0.000000 b.b.b.b s.s.s.s TCP 66 59468 → 80 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
2 0.022883 s.s.s.s b.b.b.b TCP 66 80 → 59468 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1380 SACK_PERM=1 WS=128
3 0.022949 b.b.b.b s.s.s.s TCP 54 59468 → 80 [ACK] Seq=1 Ack=1 Win=66048 Len=0
4 0.025405 b.b.b.b s.s.s.s HTTP 294 GET / HTTP/1.0
5 0.026677 s.s.s.s b.b.b.b HTTP 666 HTTP/1.1 403 Forbidden (text/html)
6 0.026678 s.s.s.s b.b.b.b TCP 54 80 → 59468 [FIN, ACK] Seq=613 Ack=241 Win=0 Len=0
7 0.026678 s.s.s.s b.b.b.b TCP 54 80 → 59468 [RST, ACK] Seq=614 Ack=241 Win=0 Len=0
A conexão TCP está configurada corretamente. Em seguida, o navegador envia a solicitação HTTP GET e recebe uma resposta "403 Proibida". Além disso, quase simultaneamente com a mensagem de resposta HTTP recebe uma mensagem FIN e RST!
No lado do servidor eu fiz um tcpdump da mesma comunicação:
$ sudo tcpdump -n port 80 or port 443
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:53:26.625013 IP b.b.b.b.59468 > s.s.s.s.80: Flags [S], seq 2382139585, win 8192, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
16:53:26.625131 IP s.s.s.s.80 > b.b.b.b.59468: Flags [S.], seq 1966829679, ack 2382139586, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:53:26.647631 IP b.b.b.b.59468 > s.s.s.s.80: Flags [.], ack 1, win 258, length 0
16:53:26.650205 IP b.b.b.b.59468 > s.s.s.s.80: Flags [R.], seq 1, ack 1, win 258, length 0
Aqui, a configuração da conexão TCP (primeiros três pacotes) ainda está boa. Mas onde estão as mensagens HTTP? Não há pedido nem resposta ?! O que está acontecendo? E por que o servidor está fechando imediatamente a conexão com um pacote RST?
No começo eu suspeitei de alguma configuração incorreta do Apache (às vezes eu estou mudando as coisas lá sem realmente saber o que estou fazendo). Então eu desliguei o Apache e iniciei um script Python SimpleHTTPServer. Os rastros Wireshark e tcpdump ficaram praticamente iguais, mas agora pelo menos alguns erros de saída do script Python:
----------------------------------------
Exception happened during processing of request from ('b.b.b.b', 59468)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 321, in process_request
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 655, in __init__
self.handle()
File "/usr/lib/python2.7/BaseHTTPServer.py", line 340, in handle
self.handle_one_request()
File "/usr/lib/python2.7/BaseHTTPServer.py", line 310, in handle_one_request
self.raw_requestline = self.rfile.readline(65537)
File "/usr/lib/python2.7/socket.py", line 476, in readline
data = self._sock.recv(self._rbufsize)
error: [Errno 104] Connection reset by peer
----------------------------------------
Mas isso não me trouxe mais nada. Alguém tem uma idéia do que poderia ser a razão de tudo isso?