我正在努力使用 openVPN 设置连接两个站点。以下是场景
办公室 1(服务器):
- 本地网络:192.168.178.0/24
- openvpn 服务器公网 IP:192.168.178.2 位于 br0
- openvpn 服务器内部 ip:tun0 上的 192.168.0.1
办公室 2(客户):
- 本地网络:192.168.177.0/24
- openvpn 客户端公网 IP:192.168.177.2 在 p2p1 上
openvpn 客户端内部 ip:tun0 上的 192.168.0.6
openvpn内部网络:192.168.0.0/24
客户端和服务器均位于具有动态分配的 IP 地址的 NAT 路由器之后。
基本上,两个办公室中的相关机器应该可以“看到”对方。在设置隧道并正确配置两个站点的路由表后,两个网络上的常规主机都可以 ping 通这两个网络上的所有内容。到目前为止一切正常。
但是,端点只能看到彼此,而看不到各自远端网络上的任何主机。例如,如果执行
ping 192.168.178.2
从 VPN 端点 192.168.177.2 开始,它就可以正常工作,任何其他地址都无法工作;主机不会回复。
现在,当我 ping 另一个地址(例如 192.168.178.3)时,看一下 tcpdump 的输出。
11:11:28.104640 IP 192.168.0.6 > 192.168.178.3:ICMP 回显请求,ID 2130,序列号 1,长度 64
源 IP 似乎不太正确。它属于 OpenVPN 的内部网络,我没有收到 ICMP 回复。
当我明确指示 ping 使用正确的源 IP 时,事情开始起作用:
ping 192.168.178.3 -I 192.168.177.2
现在,tcpdump 的输出也正常了:
11:20:08.266271 IP 192.168.177.2 > 192.168.178.3:ICMP 回显请求,ID 7883,序列号 17,长度 64 11:20:08.316037 IP 192.168.178.3 > 192.168.177.2:ICMP 回显答复,ID 7883,序列号 17,长度 64
查看客户端路由表中的关键条目,很明显源地址来自内部网络:
default via 192.168.177.1 dev p2p1 192.168.0.1 via 192.168.0.5 dev tun0 192.168.0.5 dev tun0 proto kernel scope link src 192.168.0.6 192.168.177.0/24 dev p2p1 proto kernel scope link src 192.168.177.2 192.168.178.0/24 via 192.168.0.5 dev tun0
是否有可能让 OpenVPN 使用适当的方式创建该条目源码??
这是我的 openVPN 配置文件。我将跳过 TLS 部分,因为隧道本身按预期工作。
办公室 1 的服务器:
local 192.168.178.2 server 192.168.0.0 255.255.255.0 proto tcp-server port 1194 dev tun mssfix user nobody group nogroup keepalive 20 120 ping-timer-rem persist-tun persist-key float comp-lzo push "comp-lzo" push "route 192.168.178.0 255.255.255.0" route 192.168.177.0 255.255.255.0 client-config-dir client-configs
有一个客户端配置,如下所示:
iroute 192.168.177.0 255.255.255.0 push "route 192.168.178.0 255.255.255.0 vpn_gateway"
办公室 2 的客户:
client dev tun0 remote <server address> proto tcp-client port 1194 connect-retry 15 comp-lzo user nobody group nogroup persist-tun persist-key
我真的很茫然......非常感谢您的帮助。
答案1
您看到的行为是设计使然。网络上的主机默认使用流量出口接口的 IP 地址作为源 IP。
其中一个 LAN 上的客户端计算机将使用例如 192.168.178.10 作为其源 IP,因为它不是多宿主的。然后网关将把数据包路由到您的 OpenVPN 盒,它将毫无问题地通过隧道。
但是,如果您从 OpenVPN 框本身开始,它将使用 OpenVPN 接口的 IP 地址,因为这是数据包的出口。
这很好。它到达了远程站点。但随后远程站点想要将数据包发送到 192.168.0.6 以进行 ping 响应。响应发送到网关,但由于网关(我假设,因为您没有在网络上发布网关的路由表)没有该网络的路由,因此它不知道如何继续。
解决这个问题最简单的方法就是在两个网络的网关上添加一条 192.168.0.0/24(您的 OpenVPN 网络)的路由。
另一种选择是,如果您的操作系统支持它(您没有指定在哪个操作系统上运行 OpenVPN),则查看是否可以使用路由的“src”参数来覆盖选择出口接口 IP 地址的默认行为。请参阅标题为如何在 openvpn 中设置自定义路由源了解更多信息。