如何通过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规则:
- 先创建一个包含允许子网的集合:
ipset create allowed_subnets hash:net ipset add allowed_subnets 11.2.4.0/24 ipset add allowed_subnets 11.2.3.0/24
- 然后配置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
相关产品推荐
相关产品推荐

