设置
我有以下拓扑:
Router
172.25.214.1
|
|
|
SiteB
172.25.214.0/24
|
|
|
LAN: 172.25.214.3
OpenVPN server+client B
TUN0: 172.25.215.1 TUN1: 10.1.2.2
| |
| |
| |
VpnSiteB VpnSiteA
172.25.215.0/24 10.1.2.0/24
| |
| |
| |
TUN1: 172.25.215.2 TUN0: 10.1.2.1
OpenVPN server+client A
LAN: 10.1.1.3
|
|
|
SiteA
10.1.1.0/24
|
|
|
Router
10.1.1.1
在每个站点上,OpenVPN 服务器+客户端都是一个 Raspberry Pi,运行一个 OpenVPN 服务器实例和一个 OpenVPN 客户端实例。
OpenVPN 主机 SiteA 上的内核路由表:
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.1.1.1 0.0.0.0 UG 0 0 0 eth0
10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.1.2.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
172.25.214.0 172.25.215.1 255.255.255.0 UG 20 0 0 tun1
172.25.214.0 10.1.2.2 255.255.255.0 UG 30 0 0 tun0
172.25.215.0 0.0.0.0 255.255.255.0 U 0 0 0 tun1
以及 SiteB 上的 OpenVPN 主机的:
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.25.214.1 0.0.0.0 UG 0 0 0 eth0
10.1.1.0 10.1.2.1 255.255.255.0 UG 20 0 0 tun1
10.1.1.0 172.25.215.2 255.255.255.0 UG 30 0 0 tun0
10.1.2.0 0.0.0.0 255.255.255.0 U 0 0 0 tun1
172.25.214.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.25.215.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
如您所见,唯一具有多条路由的网络是 SiteA 和 SiteB。OpenVPN 主机都倾向于通过其客户接口/OpenVPN 网络。
问题
最多路由工作正常。SiteA 上的任何主机都可以与
- SiteB 上的任意主机接口
- VpnSiteA 上的任意主机接口
- VpnSiteB 上的任意主机接口除了TUN0/172.25.215.1
即 SiteA 上的主机可以 ping 通
- 10.1.1.3
- 10.1.2.1
- 172.25.215.2
- 172.25.214.3
- 10.1.2.2
- 但不是172.25.215.1
这就是我想要解决的问题。
我已完成的故障排除
测试 1
在 SiteA 上的主机上,我 ping 172.25.215.1 并跟踪TCPDUMP
两个 OpenVPN 主机上发生的情况。
- 回显请求到达 OpenVPN 主机 SiteA 的 LAN 接口
- 回显请求离开 OpenVPN 主机 SiteA 在其 TUN1 接口上
- 回显请求到达 OpenVPN 主机 SiteB 的 TUN0 接口
- 在其 TUN1 接口上回显回复离开 OpenVPN 主机 SiteB
- 不回显回复到达 OpenVPN 主机 SiteA任何它的接口。
所以这里出了问题。
测试 2
我禁用了 SiteA 的 OpenVPN 主机上的 OpenVPN 服务器,并禁用了 SiteB 的 OpenVPN 主机上的 OpenVPN 客户端。换句话说,现在只有一个隧道。这一次,我成功的从 SiteA 上的主机 ping 172.25.215.1。
所以当我有两个隧道时就会出现问题。
背景
为什么不只使用一条隧道?时不时地,两个站点的 ISP 都会停止为我分配公共 IP 地址,让我处于 CGN 之后。如果这种情况发生在托管 OpenVPN 服务器的站点上,站点之间的连接就会中断。但如果两个站点都运行 OpenVPN 服务器,如果其中一个站点处于 CGN 之后,那就没问题了。
附录
server.conf
OpenVPN 主机 SiteA 的:
; General
; ---------------------------------------------------------
dev tun0
proto udp
port xxxx
client-config-dir /etc/openvpn/ccd
keepalive 10 120
max-clients 20
tls-server
verb 2
; Network
; ---------------------------------------------------------
topology subnet
client-to-client
server 10.1.2.0 255.255.255.0
route 172.25.214.0 255.255.255.0 10.1.2.2 30
client.conf
OpenVPN 主机 SiteA 的:
; General
; ---------------------------------------------------------
client
dev tun1
proto udp
remote xxxx
resolv-retry infinite
connect-retry 5 1800
explicit-exit-notify
nobind
tls-client
verb 2
; Network
; ---------------------------------------------------------
script-security 2
up /etc/openvpn/uppe.sh
down /etc/openvpn/nere.sh
up-restart
up-delay
iproute /usr/local/sbin/unpriv-ip
注意:安全相关的设置已被删除。
uppe.sh
:
#!/bin/bash
/usr/local/sbin/unpriv-ip route add 172.25.214.0/24 via 172.25.215.1 dev tun1 metric 20
exit 0
nere.sh
#!/bin/bash
/usr/local/sbin/unpriv-ip route del 172.25.214.0/24 via 172.25.215.1 dev tun1 metric 20
exit 0
这两项与 CGN 缓解有关。
除了网络地址不同之外,SiteB 上的 OpenVPN 主机的文件是相同的。