PPTP VPN 不適用於 Linux 路由器
原來的:
我剛剛為我的路由器從舊的 Linux 安裝(Debian 擠壓)切換到了新的(Linux Mint 17.3)(我正在使用帶有 Linux 安裝的完整台式電腦作為我的路由器)。Linux PC 直接連接到我的 DSL 調製解調器並協商 PPPoE 連接,然後為我的所有其他設備路由網際網路連接。
據我所知,我已將其設置為與之前的 Debian 安裝相同。我有一個簡單的
rc.local
腳本來設置 iptables,它在新盒子上是一樣的,它正在執行(我通過/etc/rc.local
從根控制台執行確保了這一點)。我還在新盒子上設置了 DNS。大多數東西都是一樣的,但我有一個問題:我的 Windows 機器上的 VPN 不再能夠連接。查看Wireshark,我注意到最初的PPTP數據包似乎成功發送和接收,但隨後有一個“Set-Link-Info”數據包從我的Windows機器發送,然後Windows機器開始設置“PPP LCP配置請求” “數據包。此時,它沒有收到任何響應。對我的舊 Debian 設置進行的 Wireshark 擷取顯示,此時它得到了響應,最終導致“PPP LCP 配置確認”。
我真的不知道還有什麼要檢查的。我不明白為什麼 PPTP 連接在我的新設置中卡住了。關於如何進行故障排除的任何想法?
注意:這是
/etc/rc.local
我擁有的(在兩個安裝中都相同)設置我的整個 iptables 配置:#!/bin/sh -e echo "*** Running rc.local ***" # First up, make sure 'net.ipv4.ip_forward=1' exists, uncommented, in /etc/sysctl.conf (just do this manually) echo "MAKE SURE net.ipv4.ip_forward=1 EXISTS, UNCOMMENTED, IN /etc/sysctl.conf OR NAT WILL NOT WORK!!!" echo "" # Firewall variables #WAN_IFACE="eth0" # At the time of writing, this is the NIC built into the mobo WAN_IFACE="ppp0" # Virtual PPP interface when using PPPoE LAN_IFACE="eth1" # At the time of writing, this is the extension NIC card LAN_IP="192.168.1.1/24" # Class-C internal network # Setup iptables... flush existing rules iptables -F iptables -t nat -F set +e # Set +e here to continue on error; iptables may give an error if this chain doesn't currently exist and we try to delete it iptables -X LOGGING set -e # Set default policies for chains iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # Allow all local loopback access iptables -A INPUT -i lo -p all -j ACCEPT iptables -A OUTPUT -o lo -p all -j ACCEPT # Allow incoming traffic for established connections iptables -A INPUT -i $WAN_IFACE -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i $WAN_IFACE -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i $LAN_IFACE -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i $LAN_IFACE -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT # Allow incoming ICMP traffic iptables -A INPUT -p icmp -j ACCEPT ### # Uncomment lines in this section to allow unsolicited incoming traffic on ports ## Open common service ports ## SSH #iptables -A INPUT -i $WAN_IFACE -p tcp --destination-port 22 -j ACCEPT ## HTTP (8080 + 8081) #iptables -A INPUT -i $WAN_IFACE -p tcp --destination-port 8080 -j ACCEPT #iptables -A INPUT -i $WAN_IFACE -p tcp --destination-port 8081 -j ACCEPT iptables -A INPUT -i eth1 -p tcp --destination-port 8080 -j ACCEPT iptables -A INPUT -i eth1 -p tcp --destination-port 8081 -j ACCEPT # DNS iptables -A INPUT -i eth1 -p tcp --destination-port 53 -j ACCEPT iptables -A INPUT -i eth1 -p udp --destination-port 53 -j ACCEPT # Local Samba connections iptables -A INPUT -p tcp --syn -s $LAN_IP --destination-port 139 -j ACCEPT iptables -A INPUT -p tcp --syn -s $LAN_IP --destination-port 445 -j ACCEPT ### # NAT setup - allow the NAT masquerading iptables -t nat -A POSTROUTING -o $WAN_IFACE -j MASQUERADE # Allow forwarding of packets between the Internet and local network interface(s) iptables -A FORWARD -i $WAN_IFACE -o $LAN_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i $LAN_IFACE -o $WAN_IFACE -j ACCEPT # Logging setup iptables -N LOGGING iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix="IPTables-Dropped: " --log-level 4 iptables -A LOGGING -j DROP # Logging; uncomment the below to log dropped input packets to syslog (verbose; only use for debugging!) echo "Uncomment the necessary lines in rc.local to enable iptables logging..." #iptables -A INPUT -j LOGGING echo "*** Finished running rc.local ***" exit 0
更新:
我一直在對此進行更多調查,Wireshark 對我的 Linux 路由器輸出內容的分析揭示了一個非常顯著的差異。這是兩個螢幕截圖,第一個來自我的舊 Debian 盒子,它的路由有效,第二個來自我的新 Mint 盒子,它沒有:
我用紅色和藍色條紋替換了 IP 地址,以指示我的 Linux 路由器的公共 IP 地址,以及我們正在與之通信的遠端地址,以便通過 PPTP 協議建立 VPN 連接。此外,我的 Windows 機器在本地網路上的 IP 地址以綠色標出。
需要注意的是 PPTP 協議完成後會發生什麼,我們切換到 PPP LCP 數據包。在 Debian 機器上,它會繼續將這些數據包的源地址轉換為我的公共 IP 地址,然後再將它們發送到公共網際網路。但是在我的 Linux Mint 機器上,發出的數據包的源地址仍然保留為我試圖建立連接的 Windows 機器的本地網路地址。它使用本地 C 類源地址將數據包發送到網際網路 - 當然它們沒有被路由!
問題是,是什麼導致了我的 Linux Mint 機器上的 NAT 崩潰,而 Debian 機器上沒有發生這種情況?iptables 是一樣的,
/etc/network/interfaces
都是一樣的。我不知道……但也許這個發現會幫助這裡的人幫助我解決這個問題。:-)
為了使 NAT 工作,您需要載入一個特定於協議的幫助模組。預設情況下,您只會載入用於 TCP 和 UDP 的內容。
這就是為什麼您會看到您的 PPTP 流量(實際上是 PPP over GRE)在沒有 NAT 的情況下逃逸。該模組是
nf_nat_proto_gre
,至少從 Linux 4.4 開始。類似的故事適用於連接跟踪(沒有它,GRE 數據包不會被視為已建立或相關連接的一部分)。那就是
nf_conntrack_proto_gre
。事實證明,PPTP 也需要特殊處理(我猜它在 PPP 協商中嵌入了 IP 地址,但我沒有檢查過)。PPTP 連接的特殊處理
nf_nat_pptp
和跟踪由nf_conntrack_pptp
.A
modprobe ip_nat_pptp
應該讓您的 VPN 正常工作。模組之間的依賴關係將最終載入所有四個。要使其在整個啟動過程中繼續工作,請添加nf_nat_pptp
到/etc/modules
.(不,我不知道這是在哪裡記錄的,抱歉!)