OpenVPN路由到LAN在服务器后面

我有一个使用OpenVPNconfiguration的站点到站点VPN。 隧道似乎很好(我可以从一端到另一端),但是我不能让两端的networking看到对方。

我的拓扑结构如下所示:

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客户端networking-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不会阻塞任何东西(一切都设置为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,主要安装了默认设置)。

我以为我知道一点关于Linuxnetworking,但是…似乎我错了:)。 我不知道为什么这不起作用,我已经用尽了想法去尝试。 任何人都可以请指出我在正确的方向吗?

谢谢!

你可能错过了iroute 。 除了推送路由之外,你还需要在configuration文件中使用iroute 。 这是OpenVPN手册页的摘录。

– 路由networking[netmask]

生成到特定客户端的内部路由。 networking掩码参数(如果省略)默认为255.255.255.255。 此指令可用于将固定的子网从服务器路由到特定的客户端,而不pipe客户端从哪里连接。 请记住,您还必须将路由添加到系统路由表(例如使用–route指令)。 之所以需要两条路由,是因为–route指令将数据包从内核路由到OpenVPN。 一旦在OpenVPN中,–iroute指令路由到特定的客户端。 该选项必须在客户机实例configuration文件中使用–client-config-dir指定,或者使用–client-connect脚本dynamic生成。 –iroute指令也有一个重要的互动 – 推“路线…”。 –iroute本质上定义了一个特定客户所拥有的子网(我们称之为客户A)。 如果您希望其他客户端能够访问A的子网,则可以使用–push“route …”和–client-to-client来实现此目的。 为了让所有的客户端都能看到A的子网,OpenVPN必须把这个路由推送给所有的客户端,除了A之外,因为子网已经被A所有。OpenVPN通过不向客户端推送一条到达客户端的路由iroutes。

你将需要像下面的configuration条目在各自的客户端和服务器。

iroute 192.168.3.0 255.255.255.0

此外,如果您有多个客户端后面有多个networking,则可能需要检出CCD。

客户端的configuration,DIR

这个指令设置了一个客户端configuration目录,OpenVPN服务器将在每个传入连接上扫描,search客户端特定的configuration文件(参见手册页以获取更多信息)。 此目录中的文件可以即时更新,无需重新启动服务器。 请注意,此目录中的更改仅对新连接生效,而不是现有连接。 如果希望特定于客户机的configuration文件更改为对当前连接的客户机(或已断开连接的客户机,但服务器尚未超时的实例对象)立即生效,请使用pipe理中止客户机实例对象界面(如下所述)。 这将导致客户端重新连接并使用新的client-config-dir文件

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

所以…首先,我在这里find了iroute的一个很好的解释(以及为什么需要)。 但是由于我刚才提到链接死亡的风险,我也会尝试提及下面最重要的想法。

看起来内核路由不足以让stream量通过OpenVPN隧道。 如果你想到达一个OpenVPN客户端的局域网,你还需要一个OpenVPN内部路由(iroute)。 这是通过在server.conf中使用client-configuration-dir语句添加的,并将iroute语句添加到该子目录内的configuration文件中。

就我而言,我还需要:

 #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隧道之上运行路由协议。 有没有人得到这样的解决scheme(ovpn + rip / ospf)工作?