iptables 規則以允許防火牆後面的 L2TP/IPSEC VPN
我在 Smoothwall Express 論壇上問過這個問題,但他們不願意提供太多幫助是可以理解的。畢竟,他們真的很想賣商業版。
我需要提供一個 L2TP/IPSEC VPN 來遠端支持我們即將推出的一些新機器(這部分沒有選擇)。由於遠端使用者還需要針對 Active Directory 進行身份驗證,我需要在我們的 Windows (2003) 伺服器上執行 VPN,而不是直接在防火牆上執行。
由於 Smoothwall Express 沒有從其正常管理界面轉發協議的規定,這需要通過編輯
rc.firewall.up
. 這就是我的問題。我不了解 iptables,並且覺得即使我花時間閱讀它,我把它搞砸的風險也很大。以下部分目前存在於
rc.firewall.up
:# IPSEC /sbin/iptables -N secin /sbin/iptables -A secin -i ipsec0 -j ACCEPT /sbin/iptables -A INPUT -j secin /sbin/iptables -N secout /sbin/iptables -A secout -i ipsec0 -j ACCEPT /sbin/iptables -A FORWARD -j secout
$$ some unrelated stuff here $$
# IPSEC /sbin/iptables -N ipsec /sbin/iptables -A ipsec -p udp --destination-port 500 -j ACCEPT /sbin/iptables -A ipsec -p udp --destination-port 4500 -j ACCEPT /sbin/iptables -A ipsec -p 50 -j ACCEPT /sbin/iptables -A ipsec -p 51 -j ACCEPT /sbin/iptables -A block -i ppp0 -j ipsec /sbin/iptables -A block -i ippp0 -j ipsec if [ "$RED_DEV" != "" ]; then /sbin/iptables -A block -i $RED_DEV -j ipsec fi
除非我弄錯了,第二個塊會導致我想要轉發的流量被吞掉。我嘗試註釋掉第二個塊並添加這個塊,它改編自 PPTP 直通所需的行(確實有效)以及我能夠從各種來源獲得的內容:
# L2TP/IPSEC /sbin/iptables -N l2tp /sbin/iptables -A l2tp -p udp --destination-port 500 --dst 192.169.0.7 -j ACCEPT /sbin/iptables -A l2tp -p udp --destination-port 1701 --dst 192.169.0.7 -j ACCEPT /sbin/iptables -A l2tp -p udp --destination-port 4500 --dst 192.169.0.7 -j ACCEPT /sbin/iptables -A l2tp -p 50 --dst 192.169.0.7 -j ACCEPT /sbin/iptables -A l2tp -p 51 --dst 192.169.0.7 -j ACCEPT /sbin/iptables -I FORWARD -j l2tp /sbin/iptables -t nat -N l2tp /sbin/iptables -t nat -A l2tp -i $RED_DEV -p tcp --dport 500 -j DNAT --to 192.169.0.7:500 /sbin/iptables -t nat -A l2tp -i $RED_DEV -p tcp --dport 1701 -j DNAT --to 192.169.0.7:1701 /sbin/iptables -t nat -A l2tp -i $RED_DEV -p tcp --dport 4500 -j DNAT --to 192.169.0.7:4500 /sbin/iptables -t nat -A l2tp -i $RED_DEV -p 50 -j DNAT --to 192.169.0.7 /sbin/iptables -t nat -A l2tp -i $RED_DEV -p 51 -j DNAT --to 192.169.0.7 /sbin/iptables -t nat -A PREROUTING -j l2tp
..但這不起作用。我把東西塞到哪裡去了?
順便說一句,
$RED_DEV
轉換為面向公眾的界面,顯然192.168.0.7
是我的 VPN 伺服器。更新:
事實證明,上述設置確實有效 - 有點。我正在家裡測試這個,我有一台 MacBook 和幾台 Windows XP 機器。我可以從 Mac 很好地連接,但無法使用任何 Windows 機器進行連接。不幸的是,需要此 VPN 進行遠端支持的機械公司只使用 Windows XP。:(
如問題更新中所述,即使使用雙 NAT,VPN 也可以從 Mac 到 Windows,但不能從 Windows 到 Windows。看來這真的只是想出正確的搜尋詞來找到解決方案的問題。
根據這篇知識庫文章,在 Windows XP 客戶端機器上,我們需要創建一個名為in的新
DWORD
值。對於雙 NAT,它需要值為 2。AssumeUDPEncapsulationContextOnSendRule``HKLM\System\CurrentControlSet\Services\IPSec
現在我需要為 Windows 7 找到一個解決方案,因為我遲早要處理這個問題是不可避免的。
更新
為了任何有同樣問題的人的利益,Windows 7 的修復方法是創建一個
DWORD
名為AssumeUDPEncapsulationContextOnSendRule
.HKLM\SYSTEM\CurrentControlSet\services\PolicyAgent
同樣,對於雙 NAT,它需要一個值 2。