OpenVPN 路由至服务器后面的 LAN

OpenVPN 路由至服务器后面的 LAN

我使用 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

但是,我完全无法反过来操作(从服务器 ping 客户端网络 -Net2- 上的某个东西)。我甚至无法从服务器获取 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 没有阻止任何东西(一切都设置为接受):

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 网络了解一点,但是……看来我错了 :)。我不知道为什么这不起作用,而且我已经想不出可以尝试的方法了。有人能给我指出正确的方向吗?

谢谢你!

答案1

您可能遗漏了iroute。除了推送路由之外,您还需要iroute配置文件。以下是 OpenVPN 手册页的摘录。

--iroute 网络 [网络掩码]

生成到特定客户端的内部路由。如果省略 netmask 参数,则默认为 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 匹配的路由推送给客户端来实现这一点。

您将需要在相应的客户端和服务器中配置如下所示的条目。

iroute 192.168.3.0 255.255.255.0

此外,如果多个客户端后面有多个网络,则可能需要检查 CCD。

客户端配置目录

此指令设置客户端配置目录,OpenVPN 服务器将在每个传入连接上扫描该目录,搜索客户端特定的配置文件(有关详细信息,请参阅手册页)。此目录中的文件可以即时更新,而无需重新启动服务器。请注意,此目录中的更改仅对新连接生效,对现有连接无效。如果您希望客户端特定的配置文件更改立即对当前连接的客户端生效(或已断开连接但服务器尚未超时其实例对象的客户端),请使用管理界面(如下所述)终止客户端实例对象。这将导致客户端重新连接并使用新的客户端配置目录文件

答案2

Fossil 的回答正是我所需要的,我已经接受了。我只想为其他可能遇到同样问题的人添加一些信息。因为这个问题之前已经在 serverfault 上被问过,但答案要么没有提到 iroute(一个例子)或只有死链接(例如这个

所以...首先,我找到了对 iroute 的很好的解释(以及为什么需要它)这里。但由于我刚刚提到了链接失效的风险,因此我也会尝试在下面提及最重要的想法。

看来内核路由不足以让流量通过 OpenVPN 隧道。如果您想要到达 OpenVPN 客户端后面的 LAN,您还需要 OpenVPN 内部路由 (iroute)。这是通过在 server.conf 中使用 client-configuration-dir 语句并在位于该子目录内的配置文件中添加 iroute 语句来添加的。

就我而言,我还需要:

#Inside server.conf
client-configuration-dir my-config-dir

#Inside my-config-dir/client1 (same name as the client!)
#Tell OpenVPN that 192.168.13.0/24 is reachable via client1
iroute 192.168.13.0 255.255.255.0

这也引发了一个有趣的问题 - 如果 OpenVPN 无法仅使用内核路由工作,那么乍一看似乎不可能在 ovpn 隧道上运行路由协议。有没有人找到这样的解决方案(ovpn+rip/ospf)?

相关内容