我在联想 Thinkpad T420s 上运行用于开发的 Web 服务器,但无法从三个独立的设备(分别是台式机、iPad 和手机)连接到它。
笔记本电脑和其他设备连接到运行 DD-WRT 的路由器(台式机有线,其他设备无线)。我已经确定了以下内容:
为遇到本地服务器问题的人提供的检查表
- 服务器正在运行并监听连接(通过 http 到本地主机进行测试)。
- netstat -a -n -b 显示某些东西正在监听正确的端口。
- Windows 防火墙在公共、私有和域网络上被完全禁用。
- 主机的 IP 是静态的。
- 主机上的其他服务器也不起作用(我尝试了端口 8000、1515 上的服务器,并且测试了 ping)。
- 在另一台(台式)机器上,我能够托管服务器并响应来自我的手机的 ping。有趣的是,我也能够从笔记本电脑和 iPad 访问桌面服务器,但首先通过手机发出请求“唤醒”服务器后,仅需一秒钟。(这对笔记本电脑上的服务器不起作用。)
除了常规的修复方法之外,我还尝试了许多其他方法:
为尝试过上述所有方法的人准备的检查清单
- 确保 AP 隔离已禁用(http://www.dd-wrt.com/wiki/index.php/Advanced_wireless_settings#AP_Isolation)
- 修复 Winsock2 (http://answers.microsoft.com/en-us/windows/forum/windows_7-system/resettingrepairingreinstalling-winsock2-testing/aa044f6b-00e2-406b-8edb-cba5c4799cf2)
- 据我所知,VIP 访问连接尚未安装(请参阅这里对于其他人发现这会阻止传入连接)
- 使用嗅探传入连接Wireshark(这表明当我用手机发出请求时,网络主机没有听到任何传入请求。)
- 通过尝试从我的桌面访问主机来嗅探传出连接,从桌面嗅探表明根本没有 HTTP 传出请求,只有一系列 TCP:
我的问题有两个:
- Thinkpad T420s 上是否存在某些特定的东西可以秘密阻止传入连接?
- 最好的方法是什么系统地弄清楚为什么传入连接没有得到响应?(请参阅上面的答案)
任何帮助都将不胜感激。我已经没有主意了!
更新:现在可以了,但不知道为什么。希望这份清单对任何试图本地访问 Web 服务器的人都有用。
答案1
有许多软件防火墙和 DD-WRT 路由器功能可能会阻止传入连接。AP 隔离和禁用防火墙是我最先提出的两个建议。我的下一步是进一步检查路由器设置。我的直觉告诉我,如果您的笔记本电脑和台式机有有线连接,那么两者之间就可以正常工作。
一个用于系统地排除连接问题的绝佳工具是数据包嗅探器,例如 wireshark。此时,您正在猜测网络上正在发生什么。然后切换各种设置,希望确认猜测。既然可以亲眼看到,何必猜测呢?数据包捕获将为您提供正在发生的事情的实时读数。您可能会发现 TCP SYN 数据包从未到达服务器,或者它确实到达了服务器,但没有发出响应。或者,这可能是完全不同的问题,例如名称/ip/arp 解析问题。嗅探器本身无法解决任何问题,但它应该可以让您更好地了解现在正在发生的事情。
尝试解释数据包捕获一开始可能会有些令人生畏,请尝试专注于基础知识并忽略更复杂的部分。
编辑:现在您已经添加了数据包捕获截图,只是想跟进一下。发生的事情更加清晰。使用像 wireshark 这样的工具的挑战之一是了解协议应该看起来像。由于 HTTP 建立在正常的 TCP 连接之上,因此您在此处看到的是在端口 1515 上设置 TCP 连接的一系列失败。您看不到 HTTP 的原因是 TCP 连接在客户端和服务器之间的对话进行到这一步之前就失败了。我将通过前两次尝试的数据包编号向您介绍它:
数据包(204).150 -> .151 [SYN]“您好,我想连接到端口 1515”
数据包(207).151 -> .150 [RST,ACK]“未监听。这里没有端口 1515。关闭好吗?”
数据包(208).150 -> .151 [SYN]“您好,我想连接到端口 1515”
数据包(209).151 -> .150 [RST,ACK]“未监听。这里没有端口 1515。关闭好吗?”
ETC...
TCP 对话中的 RST 标志是强制关闭。它比正常结束对话的 FIN 标志更粗鲁。这通常意味着要么有防火墙阻止了端口 1515,要么没有任何东西在监听端口 1515。我更常见到 [RST, ACK] 来自没有服务监听该端口的服务器,而防火墙往往只是 RST 或黑洞(无响应)流量。
现在它已经正常工作了,请再进行一次捕获,以便您可以看到成功连接的样子。它应该是这样的:
.150 -> .151 [SYN] “您好,我想连接端口 1515”
.151 -> .150 [SYN,ACK]“已确认,这是我的缓冲区大小”
.150 -> .151 [ACK]“对我有用”
.150 -> .151 [ACK][HTTP/GET] “通过 HTTP 请求 html”
.151 -> .150 [ACK][HTTP/1.1 200 OK] “这是您请求的 html”
基于 TCP ACK 的一系列 HTTP 对话
.150 -> .151 [FIN]“感谢服务器,我已完成所有操作,请关闭连接”
.151 -> .150 [ACK, FIN]“我同意我们应该关闭连接”