Linux

Openvpn:客戶端可以ping伺服器,伺服器無法ping客戶端

  • October 28, 2015

我在 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 顯示了這一點:

  1. 來自 aws(兩個虛擬機)的 Ping 通過 VPS-VPN.aws tun0 介面進入 vpn 隧道,到達 VPS-VPN.gg 上的 tun0 並回復正確
  2. 來自 gogrid 的 Ping 通過 VPS-VPN.gg tun0 介面進入 vpn 隧道,但未到達 VPS-VPN.aws 上的 tun0 介面
  3. 從 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 文件的名稱必須與證書連接客戶端用於身份驗證的通用名稱相同,並且在此文件中必須添加客戶端網路的路由規則,在我的情況下

iroute 10.160.0.0 255.255.192.0

進行此更改後,雙向通信都可以正常工作。

引用自:https://serverfault.com/questions/732228