Vpn

帶有 xl2tpd 和 racoon 的 VPN - 如何從非預設 IP 地址中對流量進行 NAT

  • April 4, 2013

我有一台執行 Debian 的伺服器,它的網路如下:

eth0 - has public IP address 1.2.3.4
eth1 - has public IP address 1.2.3.5

我正在嘗試在伺服器上設置一個 VPN,我可以從我的 Android 手機連接到該 VPN。我按照http://wiki.debian.org/HowTo/AndroidVPNServer上的說明安裝和配置 xl2tpd 和 racoon。一切正常,但我要進行最後一項調整:當我將手機連接到 VPN 時,我的公網 IP 地址(來自手機的流量從中路由)是 eth0 上的地址,即 1.2.3.4。我希望 VPN 流量在 eth1 的 IP 地址後面進行 NAT,即 1.2.3.5(理想情況下,VPN 客戶端繼續連接到 1.2.3.4)。

我的防火牆規則如下所示:

VPN_CLIENT_RANGE=192.168.200.0/24
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
# Enable VPN traffic on the ppp+ adapters (only active when a call is established)
# to go through the machine using SNAT/masquerading.
iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s $VPN_CLIENT_RANGE -j MASQUERADE

我曾希望在最後三行中將 eth0 更改為 eth1 會達到正確的效果,但事實並非如此 - VPN 客戶端可以連接但無法再看到網際網路,並且日誌顯示來自 VPN 客戶端的流量(pppX 介面在伺服器)仍然從 eth0 發送出去(防火牆在沒有最後三行的情況下阻止了它)。

我是否需要以某種方式在 pppd 中配置源地址?或者更改 ppp 介面的預設路由?

我已經解決了。

當客戶端連接到 VPN 時,將建立 PPP 連接。

數據包從客戶端流向伺服器上的 pppN 介面。導致它們通過“錯誤”IP地址從那裡流出到網際網路的原因是伺服器的預設路由表:

$ ip route show
default dev eth0 scope link

即所有出站流量都通過eth0。

假設我們不想更改預設路由,我們需要通過 eth1 創建一個帶有預設路由的單獨路由表,並讓 VPN 使用它。

將新表的條目添加到 /etc/iproute2/rt_tables :

101 vpn

該數字可以是文件中唯一的任何東西;該名稱是對手頭工作的描述性名稱。

現在通過 eth1 將預設路由添加到此表:

# ip route add table vpn default dev eth1 scope link

最後,強制傳入的 VPN 流量(在 pppN 介面上)根據我們的新表進行路由。最簡單的方法是使用 /etc/ppp/ip-up.d 和 ip-down.d 機制在 ppp 介面啟動和關閉時添加和刪除規則。

/etc/ppp/ip-up.d/vpn-routing:

#!/bin/sh
IF=$1
ip rule add dev $IF table vpn

/etc/ppp/ip-down.d/vpn-routing:

#!/bin/sh
IF=$1
ip rule delete dev $IF table vpn

為了使所有這些在重新啟動後仍然存在,您需要將“ip route add”行放在啟動時執行的某些內容中 - 例如您的防火牆腳本 - 或作為 eth0 上的 /etc/network/interfaces 中的“up”行。

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