OpenVPN 站点到站点路由问题

OpenVPN 站点到站点路由问题

我正在努力使用 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 中设置自定义路由源了解更多信息。

相关内容