Webserver por trás do roteador NAT inacessível

0

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?

    
por Georg P. 25.08.2016 / 18:36

2 respostas

1

Obrigado por enviar os arquivos de captura.

Existe um firewall ou algum tipo de middlebox (possivelmente Cisco ASA) entre seu cliente e servidor que está interceptando o tráfego da web e gerando a mensagem 403 e os pacotes RST. Aqui está o porquê:

  1. O handshake TCP de três vias é concluído com êxito entre o cliente e o servidor. O tempo de ida e volta é de aproximadamente 30 ms . Tudo bem até agora.
  2. O cliente envia uma solicitação HTTP GET ao servidor.
  3. Uma mensagem 403 Proibida é enviada de volta ao cliente 2ms depois que a solicitação é enviada, o que é distante muito rápido para ter sido do servidor real. A captura de tráfego do servidor também não mostra nenhum sinal da solicitação HTTP. Algum dispositivo entre os dois dispositivos gerou este 403 .

    Observe o verbage do 403:

    You are attempting to access a forbidden site.

    Consult your system administrator for details

    Esse não é um Apache 403 padrão e, de um Google rápido, posso ver uma referência a uma mensagem semelhante em um thread de discussão do Cisco ASA . Eu também posso ver que o MAC de origem do 403 na sua captura é de fato um dispositivo Cisco.

  4. Um pacote RST é enviado ao cliente e ao servidor para fechar a conexão à força. Observe como o IP de origem de cada pacote RST é o IP de origem do outro dispositivo. Algo entre esses dois dispositivos envia um pacote RST falsificado para ambas as partes, alegando ser do outro.

De que exatamente você está realizando seus testes externos? É de uma rede corporativa, talvez?

    
por 26.08.2016 / 18:04
0

Você diz em sua pergunta que, enquanto está executando o Apache, você recebe uma mensagem "403 Proibido".

Essa mensagem é gerada pelo Apache e, portanto, sua solicitação e sua resposta parecem estar sendo processadas corretamente pela sua rede.

Gostaria de focar suas investigações adicionais na configuração do Apache. Como você configurou seu servidor? Se por endereço IP você precisa ter certeza de que o Apache sabe que deve responder tanto a IPs locais privados quanto a públicos. Você pode postar seu httpd.conf e os arquivos em seu diretório habilitado para sites?

    
por 26.08.2016 / 00:41