帶有 xl2tpd 和 racoon 的 VPN - 如何從非預設 IP 地址中對流量進行 NAT
我有一台執行 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”行。