即使 CentOS 7 的防火墙(firewalld)是关闭的,这些 iptables 规则仍然需要设置。原因如下:
🔍 关键概念澄清
-
“关闭防火墙”通常指
systemctl stop firewalld
这只是停用了 firewalld 服务,但 Linux 内核的 netfilter(即 iptables 所操作的底层框架)始终在运行。 -
PPTP VPN 的正常工作依赖两个核心功能:
- NAT(网络地址转换):让连接进来的 VPN 客户端能通过服务器访问互联网。
- 由这条规则实现:
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
- 由这条规则实现:
- 数据包转发和协议放行:允许 GRE 协议(PPTP 控制通道用 TCP 1723,数据通道用 GRE 协议 47)通过。
- 由这些规则实现:
iptables -A INPUT -p gre -j ACCEPT iptables -A INPUT -p tcp --dport 1723 -j ACCEPT iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -s 192.168.100.0/24 -j TCPMSS --clamp-mss-to-pmtu
- 由这些规则实现:
- NAT(网络地址转换):让连接进来的 VPN 客户端能通过服务器访问互联网。
❗ 即使没有防火墙拦截,如果没有 NAT 规则,VPN 客户端也无法上网 —— 因为返回的数据包不知道如何路由回客户端。
🧪 举个例子
假设你没加 NAT 规则:
- 客户端 IP:192.168.100.101(通过 PPTP 分配)
- 它访问
8.8.8.8 - 请求从服务器
eth0发出,源 IP 是 192.168.100.101 - 8.8.8.8 收到后尝试回包给 192.168.100.101 —— 但这是私有 IP,公网无法路由,丢包!
而 MASQUERADE 规则会把源 IP 伪装成服务器公网 IP,这样回包才能正确返回服务器,再由 pptpd 转发给客户端。
✅ 结论
| 操作 | 是否必需 | 说明 |
|---|---|---|
MASQUERADE NAT 规则 | ✅ 必需 | 否则客户端无法访问外网 |
ACCEPT GRE 和 TCP 1723 | ⚠️ 通常必需 | 如果系统默认策略是 ACCEPT(如刚装的 CentOS 无任何 iptables 规则),可能暂时能连;但为了稳定性和兼容性,强烈建议显式添加 |
TCPMSS clamp | ✅ 推荐 | 避免因 MTU 问题导致网页打不开、游戏卡顿等 |
💡 即使
iptables -L显示为空(默认全通),也必须配置 NAT 规则,否则 VPN 无法实现上网功能。
🔧 验证方法
- 连接 VPN 后,在客户端 ping 公网 IP(如
8.8.8.8) - 在服务器上抓包:
看源 IP 是否已被伪装成服务器公网 IP(说明 NAT 生效)tcpdump -i eth0 host 8.8.8.8
📝 补充建议
即使你不使用 firewalld,也可以直接管理 iptables:
# 查看当前规则
iptables -L -n -v
iptables -t nat -L -n -v
# 保存规则(重启后不丢失)
yum install -y iptables-services
systemctl enable iptables
service iptables save
✅ 总结:无论防火墙是否关闭,只要你想让 PPTP 客户端能正常上网,就必须配置这些 iptables 规则,尤其是
1831

被折叠的 条评论
为什么被折叠?



