我正在设置一些摄像头用于远程查看。每个摄像头都连接到 Raspberry Pi(运行最新版本的 raspian)。到目前为止,我家有一台摄像头(“站点 A”),我父母家有一台摄像头(“站点 B”)。我还有第三个站点(“站点 C”),它有一个静态 IP 和一个我用作集线器的 VPN 设备。具体连接如下:
- 站点 A <=> 站点 C 通过 IPsec 隧道。站点 A 在 Windows 10 计算机上托管的 lubuntu 虚拟机上运行 StrongSwan VPN 服务器。站点 B 有一个 VPN 路由器。有二此处运行的隧道:一个将站点 A 子网连接到站点 C 本地子网。第二个将站点 A 子网连接到站点 C 为任何呼入 Road Warriors 定义的子网。
- 站点 B <=> 站点 C 通过 IPsec/L2TP 以“Road Warrior”配置连接。这意味着只有一台带摄像头的 Raspberry Pi 位于站点 B 的 VPN 上。
- 站点 A 和站点 B 之间没有“直接”连接。
每个站点都有自己的子网:站点 A 为 192.168.1.0/24,站点 B(VPN 上显示的单台机器)为 192.168.2.1/32,站点 C 为 192.168.3.0/24。根据需要在涉及的机器上设置路由表以通过 VPN。
两个 Raspberry Pi 均通过无线连接。位于站点 B 的 Raspberry Pi 信号质量较高 (68/70),位于站点 A 的 Raspberry Pi 信号质量中等偏差 (40/70)。
从站点 A 子网(有线连接)上的 Windows 10 计算机,我可以使用设置通过 ssh 进入两个 Pi。这对两台机器都很好用 - 那里真的没有明显的延迟。从同一台 Windows 10 机器,使用 Internet Explorer,我可以访问托管在任一机器上的网页。(在 B 上,我有自己的网页设置。到目前为止,在 A 上我有 Apache 测试页面。)在有图像的地方加载速度有点慢,但考虑到无线连接和 pi 的性能,还可以接受。
现在,我正尝试在站点 A 的 Pi 上设置站点 B 网站的镜像。我首先尝试将配置文件直接从 B 复制到 A,但挂了。然后我尝试了几次实验来查看哪里出了问题:
- 从 A 上的 Pi 向 B 执行 ping 操作。这通常对第一个发出的数据包有效,但对所有后续数据包都失败。如果我停止 ping 并立即重新启动,第二次尝试的所有数据包都会失败。如果我在尝试之间等待一段时间,那么它就会回到原始行为,即第一个数据包成功,而后续数据包丢失。
- 通过 A 将 B ping 到 Pi。与 #1 相同。
- 运行从 A 上的 Pi 到 B 的跟踪路由。这会经过合理数量的跳数,并且所识别的跳数(即不会显示为 *.*.*.*)看起来正确。
- 在 A 上运行从 B 到 Pi 的跟踪路由。与 #3 相同。
- 在 A 上的 Pi 上运行 wget 来检索托管在 B 上的网页。这会挂起很长时间,有时会失败,但如果我让它运行足够长的时间(我上床睡觉然后回来)它最终会得到它。
- 在 B 上运行 wget 来检索托管在 A 上的 Pi 上的网页。与第 5 点相同。(此时,A 上的 Pi 仅显示 Apache 起始页。)
- 我查找了重复的 IP 地址,但在任何子网上都没有看到。
- 在每台 Pi 上运行 wget 来检索主要新闻网站的主页。两台 Pi 几乎可以立即完成此任务。
- 从站点 A 上的 Windows 10 计算机 ping 两个 Pi。这对两个 Pi 都有效,即没有数据包丢失。
当我看到站点 A 的 Pi 的无线连接很差时,我认为这可能解释了一切,但现在我完全不相信了。连接不良可能解释了上面的 5-6 并与 3-4 一致,但我不认为它解释了 1-2 或 9。它也不能解释为什么这一切在子网 A 上的有线 Windows 机器上运行得如此顺利,也不能解释 #8 如何如此快速地完成。
我确实在 SE 和其他网站上找到了几个描述类似 1-2 的行为的帖子,但据我所知,那里发现的原因并不适用于我的情况。 特别是,我似乎确实在机器之间有一条路由,而且似乎没有任何 IP 地址冲突。
我可以想出几种解决这个问题的方法,但我想了解这里的行为。有人知道这里可能出了什么问题吗?仅仅是与一台机器的无线连接不良吗?如果是这样,这与正常工作的情况有什么关系?如果不是无线连接强度,还有什么可能导致这种情况?
更新
我将站点 A 的 Pi 移至有线连接。这应该可以消除 WiFi 连接不良造成的任何问题。但这似乎并没有改变行为。
我还让 A 和 B 之间的 ping 运行了一段时间。我得到了一个奇怪的行为,每 300 个数据包都能正常工作,而其他所有数据包都被丢弃。例如,数据包 1、301、601 等。我让它一直运行到 1201。这种行为显然是可重复的。
答案1
我最终通过更改在站点 A 上托管 VPN 服务器的(虚拟)Linux 计算机上的设置解决了这个问题。我必须更改其中一个系统参数:
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
虽然这种方法有效,因此解决了问题(到目前为止!),但我不明白为什么使用 Windows 客户端一切正常,而使用 Linux 客户端却失败。如果有人能给出更广泛的答案,我很乐意看到!
为了完整起见,我相信你还需要这些:
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
在我的情况下,这些值已经设置好了。您也可以通过编辑使这些值永久生效,以反映与/etc/sysctl.conf
上述相同的值net.ipv4.ip_forward
。net.ipv4.conf.all.accept_redirects
net.ipv4.conf.all.send_redirects
注意:上述更改需要在具有 root 权限的情况下进行。
我首先使用命令行版本,echo
然后重新加载所有内容,这意味着我先执行sudo sysctl --system
,然后执行sudo IPsec restart
,然后执行命令以启动我的特定连接。但我不确定所有这些“重新启动”是否都是必要的。
我发现大部分信息本网站,其中还包含可能有助于其他人解决其他问题的其他信息。