通过 3 个 Raspberry Pi Bridge 连接到互联网 - 可以 ping 通,但无法在浏览器中加载

通过 3 个 Raspberry Pi Bridge 连接到互联网 - 可以 ping 通,但无法在浏览器中加载

我的设置如下:

                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\hostsWindows 和/etc/hostsLinux 上(有关详细信息,请参阅维基百科更全面的列表)。这是一个纯文本文件,但您需要管理员权限才能编辑它。只需<ip> <domain>在末尾添加一行格式即可,例如:

151.101.193.69 superuser.com

保存文件。此条目将覆盖此域的 DNS 解析。所有使用操作系统提供的 DNS 的 HTTP 客户端现在都将解析superuser.com151.101.193.69,因此浏览器将发送正确的Host标头。

相关内容