Vpn

iptables 規則以允許防火牆後面的 L2TP/IPSEC VPN

  • September 26, 2017

我在 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。

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