Windows 客戶端撥號 VPN 提示「錯誤 800:無法建立網路連接」。服務端日誌無明顯報錯,但抓包發現 TCP 1723 (PPTP 控制連接) 和 GRE 協議 (IP 協議號 47) 被防火牆丟棄。
#!/bin/bash
# fix_vpn_800.sh
# 執行前請確認外網卡名稱 (預設 eth0),如為 ens33/ens192 請修改
WAN_IF="eth0"
VPN_SUBNET="10.8.0.0/24" # 與 pptpd.conf remoteip 一致
# 1. 臨時關閉防火牆驗證 (可選)
# systemctl stop firewalld
# iptables -F
# 2. 核心放行規則
iptables -A INPUT -i $WAN_IF -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -i $WAN_IF -p gre -j ACCEPT
iptables -A OUTPUT -p tcp --dport 1723 -j ACCEPT
iptables -A OUTPUT -p gre -j ACCEPT
# 3. 轉發鏈 (VPN 內網互通 + 出站 NAT)
iptables -A FORWARD -i ppp+ -o $WAN_IF -j ACCEPT
iptables -A FORWARD -i $WAN_IF -o ppp+ -j ACCEPT
iptables -A FORWARD -i ppp+ -o ppp+ -j ACCEPT
# 4. NAT 出站 (若未配置)
iptables -t nat -A POSTROUTING -o $WAN_IF -s $VPN_SUBNET -j MASQUERADE
# 5. 保存並重啟
service iptables save
systemctl restart iptables
echo "Rules applied. Verify with: iptables -L -n -v | grep -E '1723|gre|ppp'"
echo "Test VPN dial again."
| 鏈/表 | 規則 | 作用 |
|---|---|---|
| INPUT | -p tcp --dport 1723 | 允許 PPTP 控制連接建立 |
| INPUT | -p gre | 允許 GRE 封裝數據面流量 |
| FORWARD | -i ppp+ -o WAN | VPN → 外網 |
| FORWARD | -i WAN -o ppp+ | 外網 → VPN (回包) |
| FORWARD | -i ppp+ -o ppp+ | VPN 用戶間互訪 |
| NAT POSTROUTING | -s VPN_SUBNET -j MASQUERADE | VPN 流量偽裝為服務器公網 IP 出站 |