透過 OpenVPN 隧道 ping 外部伺服器不起作用

透過 OpenVPN 隧道 ping 外部伺服器不起作用

我有一個 OpenVPN 伺服器和一個客戶端,我想使用這個隧道不僅可以存取10.0.8.0/24整個互聯網。到目前為止,客戶端透過介面 ping 伺服器tun0是可行的,反之亦然。

但是,www.google.com從客戶端執行 ping 操作tun0不起作用(所有資料包都會遺失)。

我認為我應該配置伺服器,以便tun0轉發來自互聯網目的地的任何資料包,所以我想出了這個 iptables 配置行:

interface_connecting_to_the_internet='eth0'
interface_openvpn='tun0'
internet_ip_address=`ifconfig "$interface_connecting_to_the_internet" | sed -n s'/.*inet \([0-9.]*\).*/\1/p'`

iptables -t nat -A POSTROUTING -o "${interface_connecting_to_the_internet}" -j SNAT --to-source "${internet_ip_address}"
echo '1' > /proc/sys/net/ipv4/ip_forward

然而,這不起作用,資料包仍然丟失,我想知道我的設定可能有什麼問題。


一些細節:

ip 路由在伺服器上給出:

default via 176.31.127.254 dev eth0  metric 3 
10.8.0.0/24 via 10.8.0.2 dev tun0 
10.8.0.2 dev tun0  proto kernel  scope link  src 10.8.0.1 
127.0.0.0/8 via 127.0.0.1 dev lo 
176.31.127.0/24 dev eth0  proto kernel  scope link  src 176.31.127.109 

ip 路由在客戶端上給出:

default via 192.168.1.1 dev wlan0  proto static 
10.8.0.1 via 10.8.0.5 dev tun0 
10.8.0.5 dev tun0  proto kernel  scope link  src 10.8.0.6 
127.0.0.0/8 via 127.0.0.1 dev lo  scope link 
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.109 

  • 客戶端使用wifi適配器wlan0和TUN適配器tun0
  • 伺服器使用乙太網路適配器eth0和TUN適配器tun0
  • VPN 跨越10.0.8.0/24

  • 客戶端和linux都使用Linux 3.6.1。

答案1

總結一下討論:

為了透過 VPN 從客戶端 C 到達伺服器 S 到達特定主機 A,必須:

  • sysctl -w net.ipv4.ip_forward=1在 S ( )上啟用 ip 轉發
  • 透過 S: 上的 iptables 啟用偽裝或 snat, iptables -t nat -A POSTROUTING -o ext_if -j MASQUERADE或使用和iptables -t nat -A POSTROUTING -o ext_if-j SNAT --to-source ext_ip的明顯含義。ext_ifext_ip
  • 在 C 上設定適當的路由(S 表示 S 的 IP 位址在VPN中):
    • 透過設定經由 S 到 A 的明確路由:ip route add A via S dev vpn_if
    • 透過 S: 設定預設路由ip route add default via S dev vpn_if,其中​​也必須設定到 S: 的適當路由ip route add S via previous_gateway dev prev_if
    • 在伺服器上使用push "redirect-gateway def1",在這種情況下,OpenVPN 將透過 S 設定到C0.0.0.0/1128.0.0.0/1C 上的路由,這些路由比預設路由更具體,並且在隧道停止時可以輕鬆刪除。

相關內容