Ubuntu防火墙设置对OpenVPN有何影响?

8 人参与

在 Ubuntu 服务器上部署 OpenVPN 时,防火墙并非装饰品,而是决定连接能否穿透的关键拦截器。一次规则遗漏,就可能让客户端在握手阶段卡死,甚至出现“TLS 握手失败”的报错。

防火墙规则对流量的基本作用

UFW(Uncomplicated Firewall)底层调用 iptables,把每一条规则翻译成 NAT、FILTER 或 MANGLE 链的匹配项。对 OpenVPN 来说,最关键的两类动作是:

  • 放行服务器监听的端口(通常是 1194/udp),否则外部数据根本进不来。
  • POSTROUTING 链做源地址伪装(MASQUERADE),否则 VPN 客户端的流量在返回时找不到回程路径。

OpenVPN 所需的关键端口与协议

  • UDP 1194 – 默认的 OpenVPN 端口。
  • TCP 443 – 当网络仅允许 HTTPS 时的备选。
  • ICMP – 用于路径发现(ping)时的回显请求,若被阻断,客户端常误以为隧道未建立。

常见的 UFW 配置误区

很多管理员在开启 ufw enable 前,只执行了两条规则:

  • 允许 1194/udp;
  • 允许 SSH(22/tcp)。

看似足够,却忽略了 NAT 表的写入位置。若 DEFAULT_FORWARD_POLICY 仍是 “DROP”,即便端口开放,转发的报文仍被直接丢弃。再者,before.rules 中的 -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE 必须写在 *nat 区块的最前面,否则会被后面的 COMMIT 截断。

调试技巧

遇到 “TLS 错误:TLS key negotiation failed” 时,先用 sudo ufw status verbose 核对端口是否真的在 “ALLOW IN” 列表;随后用 sudo iptables -t nat -L -v 检查 MASQUERADE 计数是否递增。若计数停在零,说明 NAT 规则根本没有被匹配。此时打开 journalctl -u openvpn@server -f 观察日志,配合 tcpdump -i eth0 udp port 1194 抓包,往往能在几秒钟内定位失效环节。

于是,连接的命运往往就在这几行规则之间起伏。

参与讨论

8 条评论
  • 围棋高手

    这防火墙规则真是救命。

  • 峡谷追风

    我花了半天抓包,才发现MASQUERADE写在nat区块后面被截断,改了位置后VPN立刻能连上,真是大泄气后的大惊喜。

  • AlphonseElric

    UFW默认DROP转发,我之前也踩坑。

  • 蝶梦痕

    别忘了在/etc/ufw/before.rules加上-A POSTROUTING前的*nat。

  • 噬心鬼手

    1194/udp被阻了吗?怎么检查?

  • Blightfang

    默认FORWARD策略是DROP,改成ACCEPT要怎么写?

  • 电母闪灵

    说只要放行端口就行的说法太片面。

  • 梦之羽

    我之前没写MASQUERADE,VPN根本连不上。