我的设置如下:
Internet
|
| 192.168.0.3
PC1 | Laptop1
|---------------Switch(Gateway)---------------Pi1-------Pi2---------Pi3------------|
PC2 192.168.0.1 192.168.0.*(DHCP) 192.168.0.2 Laptop2
192.168.0.4
从笔记本电脑上,我可以 ping 外部网站,例如“176.34.131.233”(DuckDuckGo),但是当我尝试通过浏览器连接到这些服务器(通过在 URL 栏中粘贴 IP 地址)时,我收到“未找到服务器”的提示。
从桌面来看,一切都运行正常。
因此,问题显然出在 Pi 或笔记本电脑上。
笔记本电脑没有运行 DNS,因此将 IP 粘贴到 URL 中。
我在 wireshark 上注意到笔记本电脑能够完成三路握手 (SYN > SYN, ACK > ACK),但由于某种原因,它似乎完成了 2 次 (使用相同的 dst 端口和不同的 src 端口)。
握手完成后,连接立即由笔记本电脑的 FIN、ACK 终止,然后是另一个 FIN 的正常关闭连接,然后是来自服务器的 ACK,然后是最终的 ACK(此连接的关闭也在 2 个不同的端口上重复)。
没有 HTTP GET 数据包发送到服务器。
Pi 正在运行我自己用 python 编写的桥接软件,从笔记本电脑可以 ping 外部服务器以及可以完成三次握手这一事实来看,该软件似乎可以运行。
所以问题是,为什么会有两组三次握手,为什么我可以 ping 一个网站,但却无法在我的浏览器中加载它?
如果有人有任何想法或建议,我们将不胜感激。
我的想法是,要么是笔记本电脑的配置方式有问题(运行 Linux),要么是路由器中的某种防火墙阻止了数据,要么是我的代码存在根本性错误。我调查了所有问题,但无济于事。
答案1
这部分可能是你的问题的核心:
笔记本电脑没有运行 DNS,因此将 IP 粘贴到 URL 中。
当浏览器通过 HTTP 请求文档时,它会发送Host
指定所请求域的标头。此标头对于运行“虚拟主机”很有用,即在单个 IP 地址上托管多个网站。Web 服务器检查传入的标Host
头以确定客户端尝试联系哪个网站并相应地处理请求。
直接在浏览器的地址栏中输入 IP 地址会导致不Host
发送任何标头。如果服务器配置为在虚拟主机设置中运行(即使对于托管单个站点的服务器来说,这也很常见),它将无法确定您尝试连接到哪个虚拟主机,并且它将回复一些通用错误响应,例如 404。
如果您不想使用真实 DNS,有一个简单的解决方法:将实际域添加到文件hosts
。您尚未指定有问题的机器上运行的操作系统类型,因此这里有一个通用指南。该hosts
文件位于%SystemRoot%\System32\drivers\etc\hosts
Windows 和/etc/hosts
Linux 上(有关详细信息,请参阅维基百科更全面的列表)。这是一个纯文本文件,但您需要管理员权限才能编辑它。只需<ip> <domain>
在末尾添加一行格式即可,例如:
151.101.193.69 superuser.com
保存文件。此条目将覆盖此域的 DNS 解析。所有使用操作系统提供的 DNS 的 HTTP 客户端现在都将解析superuser.com
为151.101.193.69
,因此浏览器将发送正确的Host
标头。