You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过iptables配置拒绝所有非指定两个子网来源的数据包?

如何通过iptables配置拒绝所有非指定两个子网来源的数据包?

嘿,我完全懂你遇到的困扰!你一开始尝试的iptables -A OUTPUT ! -s 11.2.4.0/24,11.2.3.0/24 -j DROP写法确实走不通,一方面iptables本身就不支持在多源地址前直接加否定符!,另一方面就算你拆成两条DROP规则,第一条! -s 11.2.4.0/24就会把所有非这个子网的数据包全丢了,根本轮不到第二条规则去处理11.2.3.0/24的流量,完全达不到预期效果。

其实换个思路就迎刃而解了,给你两种靠谱的解决方案:

方案一:先放行指定子网,再拒绝所有其他流量

这种方法逻辑直观,适合子网数量少的场景:

# 放行来自11.2.4.0/24子网的数据包
iptables -A OUTPUT -s 11.2.4.0/24 -j ACCEPT
# 放行来自11.2.3.0/24子网的数据包
iptables -A OUTPUT -s 11.2.3.0/24 -j ACCEPT
# 拒绝所有其他来源的数据包
iptables -A OUTPUT -j DROP

原理很简单:符合条件的数据包会被前两条规则优先放行,剩下的所有非指定子网的流量都会被最后一条规则拦截,完美实现你的需求。

方案二:用ipset管理子网集合(适合多子网场景)

如果以后你需要添加更多允许的子网,用ipset会更灵活,不用反复修改iptables规则:

  1. 先创建一个包含允许子网的集合:
ipset create allowed_subnets hash:net
ipset add allowed_subnets 11.2.4.0/24
ipset add allowed_subnets 11.2.3.0/24
  1. 然后配置iptables拒绝不在这个集合里的流量:
iptables -A OUTPUT ! -m set --match-set allowed_subnets src -j DROP

后续要新增或删除子网,直接操作ipset就行,比如ipset add allowed_subnets 11.2.5.0/24,非常方便。

至于你之前看manpage发现的规则拆分问题,确实是关键:当你用-s指定多个地址时,iptables会自动拆成多条独立规则。如果加了!,每条规则都会变成“拒绝非当前子网的数据包”,第一条规则就会把所有非11.2.4.0/24的流量都拦截,第二条规则根本不会被触发,这就是为什么11.2.3.0/24的数据包也会被误拦的原因。

备注:内容来源于stack exchange,提问作者chilliefiber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 09:34:30