
我有一個 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_if
ext_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/1
和128.0.0.0/1
C 上的路由,這些路由比預設路由更具體,並且在隧道停止時可以輕鬆刪除。
- 透過設定經由 S 到 A 的明確路由: