我在 AWS 和 GoGrid 数据中心之间设置 openvpn 时遇到了奇怪的问题。我的网络看起来像这样
/----------------\ /----------------\ /------------------\ /----------------\
| VPS-DEVEL.gg | | VPS-VPN.gg | | VPS-VPN.aws | | VPS-PROVIS.aws |
| 10.160.64.7/24 | eth1 --- eth1 | 10.160.64.9/24 | tun0 --- tun0 | 10.160.48.219/24 | eth0 --- eth0 | 10.160.52.8/24 |
\----------------/ \----------------/ \------------------/ \----------------/
我可以毫无问题地从 aws ping 到 gogrid(来自两个 aws 虚拟机的 VPS-DEVEL.gg 和 VPS-VPN.gg),但我无法从 gogrid ping 到 AWS。
我在 VPS-VPN.gg 上的路由表如下所示:
[root@VPSVPN ~]# route -n
Směrovací tabulka v jádru pro IP
Adresát Brána Maska Přízn Metrik Odkaz Užt Rozhraní
169.254.4.1 164.40.132.83 255.255.255.255 UGH 0 0 0 eth0
169.254.4.2 10.160.64.9 255.255.255.255 UGH 0 0 0 eth1
10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
164.40.132.80 0.0.0.0 255.255.255.240 U 0 0 0 eth0
10.8.0.0 10.8.0.2 255.255.255.240 UG 0 0 0 tun0
10.159.254.0 10.160.64.1 255.255.255.0 UG 0 0 0 eth1
10.160.64.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.160.0.0 10.8.0.2 255.255.192.0 UG 0 0 0 tun0
0.0.0.0 164.40.132.81 0.0.0.0 UG 0 0 0 eth0
我在 VPS-VPN.aws 上的路由表:
admin@ip-10-160-48-219:~$ sudo route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.160.48.1 0.0.0.0 UG 0 0 0 eth0
10.8.0.0 10.8.0.9 255.255.255.240 UG 0 0 0 tun0
10.8.0.9 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
10.160.48.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.160.64.0 10.8.0.9 255.255.255.0 UG 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
我的 openvpn 服务器配置(gogrid 端):
[root@VPSVPN ~]# cat /etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert vpsvpn.crt
key vpsvpn.key # This file should be kept secret
dh dh1024.pem
server 10.8.0.0 255.255.255.240
ifconfig-pool-persist ipp.txt
client-config-dir /etc/openvpn/ccd # ghor
client-to-client # ghor
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
max-clients 100
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 11
route 10.160.0.0 255.255.192.0
push "route 10.160.64.0 255.255.255.0"
我的 openvpn 客户端配置(aws 端):
admin@ip-10-160-48-219:~$ cat /etc/openvpn/gogrid/gogrid.ovpn
client
dev tun
proto udp
remote 164.40.132.83 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca /etc/openvpn/gogrid/ca.crt
cert /etc/openvpn/gogrid/test-eu-west-1-aws.crt
key /etc/openvpn/gogrid/test-eu-west-1-aws.key
askpass /etc/openvpn/gogrid/test-eu-west-1-aws.pass
TCPDump 显示了这一点:
- 来自 aws(两个虚拟机)的 Ping 通过 VPS-VPN.aws tun0 接口进入 vpn 隧道,到达 VPS-VPN.gg 上的 tun0 并回复正确
- 来自 gogrid 的 Ping 通过 VPS-VPN.gg tun0 接口进入 vpn 隧道,但未到达 VPS-VPN.aws 上的 tun0 接口
- 从 VPS-VPN.gg ping 到 tun0 (10.8.0.10) 的 VPS-VPN.aws IP 运行良好
两个 VPS-VPN 都启用了 ip_forward。
VPS-VPN.aws 上的 IPTables 看起来像这样,AWS 安全组设置为允许来自任何地方的所有流量(当我可以在 VM 上使用 iptables 时,我不喜欢使用 SecGroups):
admin@ip-10-160-48-219:~$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 867 packets, 68073 bytes)
pkts bytes target prot opt in out source destination
1426 117K fail2ban-ssh tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1360 105K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 743 packets, 72322 bytes)
pkts bytes target prot opt in out source destination
Chain fail2ban-ssh (1 references)
pkts bytes target prot opt in out source destination
1400 115K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
admin@ip-10-160-48-219:~$ sudo iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 1743 packets, 105K bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 1359 packets, 69760 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 390 packets, 40130 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
748 67734 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
17 1428 MASQUERADE all -- * tun0 0.0.0.0/0 0.0.0.0/0
我在路由中使用 10.160.0.0/18 只是因为我将拥有更多具有此范围内子网的 VPC。每个 AWS VPC 都有子网 /21。一切都在 GoGrid 端的子网 10.160.64.0/24 中,并且 aws 路由表设置为将此子网的所有内容路由到 VPS-VPN.aws 实例。这是有效的,我可以从 AWS ping GoGrid。
你能指出我在哪里犯了一些错误吗?此设置 AFAIK 应该适用于两个方向。非常感谢。
所以我找到了解决方案。我的客户端到客户端路由配置错误。为了使其正常工作,
client-to-client
服务器配置文件中必须有指令,必须正确设置client-config-dir
指令,并且此目录中必须有用于连接客户端的 CCD 文件。CCD 文件的名称必须与证书连接客户端用于身份验证的通用名称相同,并且在此文件中必须添加客户端网络的路由规则,在我的情况下
进行此更改后,双向通信都可以正常工作。