Debian

PPTP VPN 不適用於 Linux 路由器

  • September 28, 2020

原來的:

我剛剛為我的路由器從舊的 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 盒子,它沒有:

Debian 擠壓上的 Wireshark

Linux Mint 17.3 上的 Wireshark

我用紅色和藍色條紋替換了 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.

Amodprobe ip_nat_pptp應該讓您的 VPN 正常工作。模組之間的依賴關係將最終載入所有四個。要使其在整個啟動過程中繼續工作,請添加nf_nat_pptp/etc/modules.

(不,我不知道這是在哪裡記錄的,抱歉!)

引用自:https://unix.stackexchange.com/questions/274785