NAT路由器后面的Web服务器无法访问

乔治·P。

我在NAT路由器后面的家用小服务器上遇到了一个神秘的问题。我在那儿运行一些Web和其他服务,也可以通过端口转发从LAN外部访问这些服务。几天以来,我再也无法访问Web服务器了(无论是端口80还是443)。但是只能从局域网之外从内部,我仍然可以轻松访问。尽管在非标准端口上,SSH仍然可以从外部运行。

因此,我进行了Wireshark跟踪,其中局域网外部的浏览器尝试访问服务器。为了提高可读性和匿名性,我将服务器IP地址更改为ssss,将浏览器IP地址更改为bbbb

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

TCP连接已正确设置。然后,浏览器发送HTTP GET请求并收到“ 403 Forbidden”响应。此外,几乎同时与HTTP响应消息它得到一个FIN和RST消息!

在服务器端,我做了一个相同通信的tcpdump:

$ 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

在这里,TCP连接设置(前三个数据包)仍然可以。但是HTTP消息到底在哪里呢?既没有请求,也没有回应?这是怎么回事?服务器为什么立即用RST数据包关闭连接?

最初,我怀疑Apache的某些配置错误(有时我在不知道自己在做什么的情况下更改了那里的内容)。因此,我关闭了Apache并启动了Python SimpleHTTPServer脚本。Wireshark和tcpdump跟踪结果几乎相同,但现在至少从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
----------------------------------------

但这并没有真正带给我更多的东西。有谁知道这一切的原因可能是什么?

马克·里德尔

感谢您发送捕获文件。

在客户端和服务器之间有防火墙或某种中间盒(可能是Cisco ASA),它正在拦截您的Web流量并生成403消息和RST数据包。原因如下:

  1. TCP三向握手在客户端和服务器之间成功完成。往返时间约为30ms到目前为止一切都很好。
  2. 客户端向服务器发送HTTP GET请求。
  3. 403禁止消息被发送回客户端2ms的请求被发送后,这是远远太快已经从实际的服务器。从服务器捕获的流量也没有显示HTTP请求的迹象。两个设备之间的某个设备已生成此403

    请注意403的语言:

    您正在尝试访问一个禁止的站点。

    有关详细信息,请咨询系统管理员。

    那不是标准的Apache 403,并且来自快速的Google,我可以在Cisco ASA讨论线程上看到对类似消息的引用我还可以看到,您捕获的403的源MAC确实是Cisco设备。

  4. RST数据包同​​时发送到客户端和服务器,以强制关闭连接。请注意,每个RST数据包的源IP如何成为另一台设备的源IP。这两台设备之间的某个东西已经向双方发送了一个伪造的RST数据包,声称来自对方。

您到底从哪里进行外部测试?可能是来自公司网络吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章