VPN 的 NAT 在 UFW 的 before.rules 里该放哪里,以及如何验证
before.rules 里的 NAT 行必须位于带 COMMIT 的合法表段内。重新加载 UFW 之前,先用 iptables-restore --test 解析候选文件。
一条在命令行里能用的 NAT 规则,粘进 before.rules 却会失败,因为该文件不是脚本。它是还原格式的文档,包含表段、链声明以及每张表的 COMMIT 标记。放错位置的行要么中止整次还原,要么静默丢弃你原以为存在的规则。下面的流程把片段放到框架期望的位置,并在下一次重新加载前证明结果。
命令行指令不是还原文件
以 iptables -t nat 开头的行是给 iptables 二进制的指令,而 UFW 读取的文件是对整套规则的描述。差别不在表面:还原格式必须知道当前在哪张表、有哪些链、表在哪里结束。粘进该文档的命令要么是语法错误,要么更糟,是挂到了错误的表上。框架之所以用还原工具加载这些文件,正是因为它们是声明式的,而不是顺序执行的。
文档还会被整体加载,因此一个格式错误的分段可能让文件其余部分无法生效。所以 NAT 片段里的一处小错会连带拖垮过滤规则,防火墙改动就是这样变成故障的。
把片段放进已有的表段
NAT 片段有形状,形状比里面的规则文字更重要。表头打开分段,链声明建立计数器,规则随后出现,COMMIT 关闭该分段。
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.55.0.0/24 -o ens3 -j MASQUERADE
COMMIT
上面的地址池和接口只是占位,换成你自己的值;值得照抄的是结构。如果文件里已有 *nat 段,就把规则加进那一段,而不是再开第二段,因为该格式要求每张表只有一个 COMMIT,同一张表出现两段就是迟早要处理的返修。保留发行版自带的链定义,包括厂商为自己的集成添加的那些。UFW 框架手册记录了 before、user 和 after 文件,以及必须有对应 COMMIT 的要求。
如果文件是空的,不要照着教程填。先确认它属于哪个软件包,以及实际生效的策略是什么,因为空的持久文件并不能证明内核里没有规则,而已加载的规则集也不能证明下次重新加载时会有完整文件可读。先恢复受支持的基线,再把站点改动叠加回去。
不应用就检查候选文件
还原工具可以在不应用的情况下解析并构建规则集,这是最省事的检查。对受保护的副本运行,而不是对线上文件运行,并且读错误文本而不只看退出状态。解析失败会指出行号,通常还会指出表名,这比一次失败的重新加载告诉你的更多。
sudo cp /etc/ufw/before.rules /root/before.rules.bak
sudo iptables-restore --test < /root/before.rules.bak
echo "exit: 0"
通过这项检查只能证明文档能被解析,别的什么也证明不了。它不能证明候选文件仍包含 UFW 依赖的每条链、只允许你指定的来源,或者远程管理仍然可达。这些是彼此独立的审查,最后一项值得在动手前另开一次会话。
选择与已安装后端和地址族匹配的工具。通过兼容层运行 nft 后端的主机需要对应的命令,而 IPv6 规则完全在另一个文件里。
把转发、NAT 和访问策略分开
源地址转换只解决寻址问题,本身不授予任何权限。转发是由 sysctl 和 filter 表控制的另一项许可,隧道有路由却不转发流量时,人们忘掉的正是它。访问策略是第三个决定,规定哪些来源能到达哪些服务,没有任何 NAT 规则能表达它。把这三者分开,故障才可诊断,而不是只剩一个模糊症状。
sysctl net.ipv4.ip_forward
sudo iptables -t nat -S POSTROUTING
sudo iptables -S FORWARD
把这三项输出放在一起读,而不是一项一项看。转发关闭时的 masquerade 规则会让客户端连上却哪儿也到不了,从客户端看完全像路由故障,把人引向错误的文件。filter 表也是过宽 accept 藏身之处,所以顺手检查它的默认策略。
验证重新加载、拒绝和 VPN 中断
三项观察构成完整的验收:重新加载成功、被允许的客户端操作可用、本应被拒绝的请求确实被拒绝。第三项最常被跳过,而它是策略真的在起作用的唯一证据。
sudo ufw reload
sudo ufw status verbose
sudo iptables -t nat -L POSTROUTING -n -v
然后测试你设计过的故障。断开隧道,观察主机的行为,因为只在 VPN 开启时生效的策略,带着一个没有被说明的依赖。之后要再重新加载一次,证明产生可用结果的是文件,而不是某种残留的运行状态。
IPv4 的 NAT 说明不了 IPv6,所以在同一条规则的备注里写明两个地址族的预期覆盖范围。目标是前后一致、可管理的策略,一个碰巧能解析的片段并不是它的证据。