多drop策略表导致nftables规则被覆盖?配置疑问求助
nftables多表规则冲突问题解答
核心逻辑说明
你遇到的现象是nftables的正常行为,根源在于同hook、同优先级的多链处理规则:
- 当多个链挂载到同一个hook(如
input/output)且优先级相同时,nftables会按表的加载顺序依次执行这些链。 - 若某条链设置了
policy drop,当流量未匹配到该链内的任何规则时,会直接被这条链的策略拒绝,后续链根本没有机会处理该流量。 - 反之,若流量在前面的链中被
accept规则匹配,整个hook的处理会立即终止,不会进入后续链。
你的具体问题解答
SSH流量是否会被specific_table拒绝?
取决于两个表的加载顺序:- 如果
dev表先加载,SSH流量会先匹配input_dev链的tcp dport 22 accept规则,直接被放行,不会走到specific_table的input链。 - 如果
specific_table先加载,SSH流量未匹配到该链内的规则,会被它的policy drop直接拒绝,dev表的SSH规则完全失效。
- 如果
是否必须将所有规则放在同一个table中?
不需要。你可以通过以下方式实现规则分组且不冲突:- 只保留一条挂载到hook的主链,并将其
policy设为drop。 - 其他表中的链不挂载hook,仅作为子链使用,由主链通过
jump指令调用。 - 子链无需设置
policy,仅存放匹配规则;流量依次经过所有子链,若都未匹配,最终由主链的policy drop拒绝。
- 只保留一条挂载到hook的主链,并将其
修正后的配置示例
# 主表:挂载hook,统一设置默认拒绝策略 table inet main { chain input { type filter hook input priority filter; policy drop; # 跳转至dev表的输入子链 jump input_dev # 跳转至specific_table的输入子链 jump input_specific } chain output { type filter hook output priority filter; policy drop; jump output_dev jump output_specific } } # dev表:仅存放基础规则,链不挂载hook table inet dev { chain input_dev { iifname "lo" accept ct state { established, related } accept tcp dport 22 accept ip protocol icmp accept } chain output_dev { oifname "lo" accept tcp sport 22 accept ip protocol icmp accept } } # specific_table:存放业务专属规则,链不挂载hook table inet specific_table { chain input_specific { ip6 saddr <some_specific_ip> udp sport 42999 udp dport 42544 ip6 daddr ff14::1:0 accept # 更多Excel生成的规则 } chain output_specific { ip6 saddr <some_specific_ip> udp sport 42999 udp dport 42564 ip6 daddr ff14::1:0 accept } }
关键注意事项
- 确保主链的
jump顺序符合你的规则优先级需求(比如基础规则先执行,业务规则后执行)。 - 子链内的规则仅需处理匹配放行的场景,无需设置
policy,未匹配的流量会自动回到主链继续处理。
内容的提问来源于stack exchange,提问作者minoset
相关产品推荐
相关产品推荐

