在 Ubuntu 服务器上部署 OpenVPN 时,防火墙并非装饰品,而是决定连接能否穿透的关键拦截器。一次规则遗漏,就可能让客户端在握手阶段卡死,甚至出现“TLS 握手失败”的报错。
UFW(Uncomplicated Firewall)底层调用 iptables,把每一条规则翻译成 NAT、FILTER 或 MANGLE 链的匹配项。对 OpenVPN 来说,最关键的两类动作是:
POSTROUTING 链做源地址伪装(MASQUERADE),否则 VPN 客户端的流量在返回时找不到回程路径。很多管理员在开启 ufw enable 前,只执行了两条规则:
看似足够,却忽略了 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 抓包,往往能在几秒钟内定位失效环节。
于是,连接的命运往往就在这几行规则之间起伏。
参与讨论
这防火墙规则真是救命。
我花了半天抓包,才发现MASQUERADE写在nat区块后面被截断,改了位置后VPN立刻能连上,真是大泄气后的大惊喜。
UFW默认DROP转发,我之前也踩坑。
别忘了在/etc/ufw/before.rules加上-A POSTROUTING前的*nat。
1194/udp被阻了吗?怎么检查?
默认FORWARD策略是DROP,改成ACCEPT要怎么写?
说只要放行端口就行的说法太片面。
我之前没写MASQUERADE,VPN根本连不上。