我有两台计算机连接到同一个 VPN(hamachi)网络。它们位于不同的地方。假设我有以下地址:
机器 A:(rpi zero - 使用 wifi)
wlan0:
inet 192.168.2.160 netmask 255.255.255.0
ham0:
inet 25.61.150.71 netmask 255.0.0.0
机器B(笔记本电脑 - 使用wifi):
wlan0:
inet 192.168.0.103 netmask 255.255.255.0
ham0:
inet 25.72.151.72 netmask 255.0.0.0
每台机器都可以互相 ping 通。但是,如果我想从机器 B 访问机器 A 网络上的其他机器,该怎么办?
例如在机器B上:
ping 192.168.2.123
192.168.2.123 位于机器 A LAN 上。
我尝试过这个:
机器 A(作为 root):
LAN=wlan0
HAM=ham0
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $LAN -j MASQUERADE
iptables -A FORWARD -i $LAN -o $HAM -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $HAM -o $LAN -j ACCEPT
机器B:
sudo ip route add 192.168.2.0/24 via 25.61.150.71
但没有成功。
我无法从机器 B ping 通 192.168.2.123。
我怎样才能正确地做到这一点?
编辑:上面写的命令似乎是正确的。我已经用 freelan vpn 而不是 hamachi 测试了类似的设置,并且成功了。
答案1
解决方案实际上更加直接一些。
暂时忽略iptables
命令,因为这是关于将您的子网隐藏在 NAT 后面。machine A
192.168.2.0/24
而应该关注执行 ping 命令时实际发生的情况。
当您向远程 IP 发送 ping 时,您实际上需要告知两者machine A
以及machine B
如何获取相应的网络192.168.0.0/24
和192.168.2.0/24
。
您说的第一部分是正确的machine B
,即为了 ping 任何东西都192.168.2.0/24
必须经过25.61.150.71
。
这就是您在命令中所做的:
machineB> sudo ip route add 192.168.2.0/24 via 25.61.150.71
这是可能的,因为machine A
和machine B
位于 Hamachi 提供的同一子网上。
但是任何 ping 命令也需要发送回复,那么它如何machine A
知道网络192.168.0.0/24
位于何处?
您可以知道machine A
子网192.168.0.0/24
位于后面25.72.151.72
。
这将导致以下命令:
machineA> sudo ip route add 192.168.0.0/24 via 25.72.151.72
然而,我们还没有完全脱离困境,因为即使machine A
我们machine B
知道将流量发送到属于任一网络的任何主机,我们仍然面临着如何任何其他主机属于知道192.168.0.0/24
如何联系192.168.2.0/24
吗?
如果machine A
和machine B
不是其网络的默认网关,那么我们需要向任一网络的默认网关添加静态路由。
对于machine A
的默认路由器,我们需要告知192.168.0.0/24
可以通过 到达192.168.2.160
。
类似地,我们需要告诉可以通过的machine B
默认路由器。192.168.2.0/24
192.168.0.103
完成所有上述操作后,您应该能够从属于任一网络的任何主机 ping 通属于另一个网络的任何主机。