好的,我有一个 OpenVPN 服务器 A,它托管范围 10.8.0.0/24,还有一个 OpenVPN 服务器 B,它托管范围 10.7.0.0/24。服务器 A 也是服务器 B 的客户端。
这是两台服务器的 tun 适配器的配置。
OpenVPN 服务器 A
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 路由,并通过其 WAN 接口传出。但是,只有通过服务器 B 的 VPN 才能访问一个 IP 范围 192.168.0.0/24。我已设置一条路由,将所有 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。有人能解释一下为什么会发生这种情况吗?
答案1
我构建了一个虚拟网络和一系列虚拟机(如下图所示),以便更轻松地可视化这个问题。
每个需要转发数据包的系统都必须启用 IPv4 转发:
# sysctl net.ipv4.ip_forward=1
我的测试网络中的 openvpn 配置已简化。我使用不带身份验证/加密的 openvpn,从命令行运行它,在机器“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 没有该数据包的源地址的路由。
可以通过多种方式解决此问题...其一,是通过 openvpn-a 的隧道设备在 openvpn-b 上添加到网络“a”侧的路由:
openvpn-b:
root@openvpn-b# ip route add 192.168.10.0/24 via 10.8.0.1
另一种是将 openvpn-b 的默认路由配置为通过 openvpn-a 的隧道设备:
openvpnb-b:
root@openvpn-b# ip route add default via 10.8.0.1
还有一种方法是在 openvpn-a 上的隧道设备上配置 NAT:
openvpn-a:
root@openvpn-a# iptables -t nat -A POSTROUTING -o tun1 -j MASQUERADE
在诊断此问题时,Wireshark 和/或 tcpdump 可以发挥很大作用。当数据包到达且没有到源地址网络的路由时,可以在 openvpn-b 的隧道设备上看到:
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