好吧,我有一个OpenVPN服务器A,它承载范围10.8.0.0/24和一个OpenVPN服务器B,主机10.7.0.0/24。 服务器A也是服务器B的客户端。
这是两台服务器的tun适配器的configuration。
OpenVPN服务器
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0 inet 10.7.0.6 peer 10.7.0.5/32 scope global tun1
OpenVPN服务器B
inet 10.7.0.1 peer 10.7.0.2/32 scope global tun0
OpenVPN A的客户端通过服务器A获取所有的stream量,并通过其WAN接口输出。 但是,一个IP范围192.168.0.0/24只能通过服务器B的VPN到达。我已经build立了一条通过所有192.168.0.0/24通过连接服务器A到服务器B的tun接口的路由。
ip route add 192.168.0.0/24 dev tun1
我可以在服务器A上ping 192.168.0.0/24, 但是当我在服务器A的OpenVPN客户端上时,我无法ping或达不到该范围。我可以ping通tun地址10.7.0.6的IP,但不能ping 192.168.0.0/ 24。 谁能解释一下为什么会发生这种情况?
如图所示,我构build了一个虚拟networking和一系列虚拟机,使这个问题更容易可视化。
预期转发数据包的每个系统都必须启用ipv4转发:
# sysctl net.ipv4.ip_forward=1
我的testingnetworking中openvpn的configuration被简化了。 我使用的openvpn没有身份validation/encryption,从命令行运行,以提供一个简单的隧道“openvpn-a”和“openvpn-b”之间的机器。
OpenVPN的-A:
root@openvpn-a# openvpn --remote openvpn-b --dev tun1
OpenVPN的-B:
root@openvpn-b# openvpn --remote openvpn-a --dev tun1
我遇到了你描述的确切问题,试图从客户端-a(192.168.10.10)ping到openvpn-b(192.168.20.1)。
这是由openvpn-a转发的数据包产生的,并且使用openvpn-b没有路由的源地址到达openvpn-b。
这个问题的解决scheme可以通过几种方式来解决……一个是通过openvpn-a的隧道设备在openvpn-b上添加一个到anetworking的路由:
OpenVPN的-B:
root@openvpn-b# ip route add 192.168.10.0/24 via 10.8.0.1
另一种方法是将openvpn-b的默认路由configuration为通过openvpn-a的隧道设备:
openvpnb-B:
root@openvpn-b# ip route add default via 10.8.0.1
另一个是在openvpn-a上的隧道设备上configurationNAT:
OpenVPN的-A:
root@openvpn-a# iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
在诊断这个问题时,Wireshark和/或tcpdump可以起到很好的作用。 从openvpn-b的隧道设备上可以看出,当一个数据包到达并且没有到源地址networking的路由时:
root@openvpn-b# tcpdump -n -i tun1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun1, link-type RAW (Raw IP), capture size 65535 bytes 15:45:10.973251 IP 192.168.10.10 > 192.168.20.1: ICMP echo request, id 2550, seq 1, length 64 ^C 1 packet captured 1 packet received by filter 0 packets dropped by kernel