我有一个使用 OpenVPN 配置的站点到站点 VPN。隧道似乎很好(我可以从一端ping到另一端),但我无法让两端的网络相互看到。
我的拓扑如下:
Net1 (192.168.13.0/24)
|
|
|
192.168.13.35
ens160
-----------
OVPN Client
-----------
tun0
10.13.10.2
|
|
10.13.10.1
tun0
-----------
OVPN Server
-----------
ens160
10.1.121.6
|
|
Net2 (10.1.121.0/26)
我可以从客户端ping到服务器:
srv# ping 10.13.10.2
PING 10.13.10.2 (10.13.10.2) 56(84) bytes of data.
64 bytes from 10.13.10.2: icmp_seq=1 ttl=64 time=5.46 ms
64 bytes from 10.13.10.2: icmp_seq=2 ttl=64 time=5.01 ms
我可以从客户端到 Net1(当然,在添加适当的路由之后):
client#ping 10.1.121.8
PING 10.1.121.8 (10.1.121.8) 56(84) bytes of data.
64 bytes from 10.1.121.8: icmp_seq=1 ttl=63 time=48.0 ms
但是,我完全无法反其道而行之(从服务器对客户端网络-Net2- 执行 ping 操作)。我什至无法从服务器访问 Net2 上的客户端 IP:
server#ping 192.168.13.35
PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data.
^C
--- 192.168.13.35 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2014ms
我确实有适当的路线:
server# ip route
default via 10.1.121.1 dev ens160 onlink
10.1.121.0/26 dev ens160 proto kernel scope link src 10.1.121.6
10.13.10.0/24 dev tun0 proto kernel scope link src 10.13.10.1
192.168.13.0/24 via 10.13.10.2 dev tun0
client# ip route
default via 192.168.13.1 dev ens160 onlink
10.1.121.0/24 via 10.13.10.1 dev tun0
10.13.10.0/24 dev tun0 proto kernel scope link src 10.13.10.2
192.168.13.0/24 dev ens160 proto kernel scope link src 192.168.13.35
IPTables 没有阻止任何东西(一切都设置为 ACCEPT):
client# iptables -L -vn
Chain INPUT (policy ACCEPT 56 packets, 3839 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 40 packets, 4343 bytes)
pkts bytes target prot opt in out source destination
server# iptables -L -vn
Chain INPUT (policy ACCEPT 736 packets, 75398 bytes)
pkts bytes target prot opt in out source destination
2 168 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 4 packets, 236 bytes)
pkts bytes target prot opt in out source destination
1 84 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 449 packets, 43393 bytes)
pkts bytes target prot opt in out source destination
如果我在隧道接口上运行 tcpdump,我会看到 ICMP 数据包离开客户端,但看不到它们在服务器上传入:
server# ping 192.168.13.35
PING 192.168.13.35 (192.168.13.35) 56(84) bytes of data.
16:57:40.262004 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 1, length 64
16:57:41.269165 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 2, length 64
16:57:42.277154 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 3, length 64
16:57:43.285163 IP 10.13.10.1 > 192.168.13.35: ICMP echo request, id 1562, seq 4, length 64
client# tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
两个端点都是 Ubuntu 16.04 Server LTS(x64,大部分默认安装)。
我以为我对 Linux 网络有所了解,但是……看来我错了 :) 。我不知道为什么这不起作用,而且我已经没有什么可以尝试的想法了。谁能指出我正确的方向?
谢谢!
您可能缺少
iroute
. 除了推送路线之外,您还需要iroute
在配置文件中。这是 OpenVPN 手册页的摘录。--iroute 网络 [网络掩码]
生成到特定客户端的内部路由。如果省略网络掩码参数,则默认为 255.255.255.255。该指令可用于将固定子网从服务器路由到特定客户端,无论客户端从何处连接。请记住,您还必须将路由添加到系统路由表中(例如使用 --route 指令)。需要两条路由的原因是 --route 指令将数据包从内核路由到 OpenVPN。一旦进入 OpenVPN,--iroute 指令就会路由到特定的客户端。此选项必须在客户端实例配置文件中使用 --client-config-dir 或使用 --client-connect 脚本动态生成。--iroute 指令还与 --push "route ..." 有重要的交互作用。--iroute 本质上定义了一个由特定客户端拥有的子网(我们称之为客户端 A)。如果您希望其他客户端能够访问 A 的子网,您可以使用 --push "route ..." 和 --client-to-client 来实现这一点。为了让所有客户端都能看到 A 的子网,OpenVPN 必须将此路由推送到除 A 之外的所有客户端,因为子网已经由 A 拥有。OpenVPN 通过不将路由推送到客户端来完成此操作路由。
您需要在各自的客户端和服务器中进行如下配置条目。
iroute 192.168.3.0 255.255.255.0
此外,如果您在多个客户端后面有多个网络,您可能需要检查 CCD。
客户端配置目录
该指令设置客户端配置目录,OpenVPN 服务器将扫描每个传入连接,搜索特定于客户端的配置文件(有关更多信息,请参阅手册页)。此目录中的文件可以即时更新,而无需重新启动服务器。请注意,此目录中的更改只会对新连接生效,对现有连接无效。如果您希望特定于客户端的配置文件更改对当前连接的客户端(或已断开连接,但服务器未超时其实例对象的客户端)立即生效,请使用管理终止客户端实例对象接口(如下所述)。这将导致客户端重新连接并使用新的 client-config-dir 文件
Fossil 的回答正是我所需要的,我已经接受了。我只想为可能有同样问题的其他人添加一些信息。因为这个问题之前在 serverfault 上被问过,但是答案要么没有提到 iroute(一个例子),要么只有死链接(比如这个)
所以...首先,我在这里找到了对 iroute 的一个很好的解释(以及为什么需要它) 。但是由于我刚刚提到了链接失效的风险,我还将尝试在下面提及最重要的想法。
看起来内核路由不足以让流量通过 OpenVPN 隧道。如果您想访问位于 OpenVPN 客户端后面的 LAN,您还需要一个 OpenVPN 内部路由 (iroute)。这是通过在 server.conf 中使用 client-configuration-dir 语句添加的,并将 iroute 语句添加到放置在该子目录中的配置文件中。
就我而言,我还需要:
这也引发了一个有趣的问题——如果 OpenVPN 不能仅使用内核路由工作,乍一看似乎不可能在 ovpn 隧道之上运行路由协议。有没有人得到这样的解决方案(ovpn+rip/ospf)?