我想丢弃子网 11.2.4.0/24 和 11.2.3.0/24 中所有没有源 IP 的数据包
我想过做这样的事情:
iptables -A OUTPUT ! -s 11.2.4.0/24,11.2.3.0/24 -j DROP
但是我收到以下错误:
iptables v1.8.2 (nf_tables): ! not allowed with multiple source or destination IP addresses
Try 'iptables -h' or 'iptables --help' for more information.
阅读条目中的手册页-s
我得到了以下信息:
可以指定多个地址,但这将扩展到多个规则(使用 -A 添加时),或者导致多个规则被删除(使用 -D)。
我现在明白了问题所在。由于会创建多条规则,因此这不会按预期工作:
我会首先丢弃所有不在 11.2.4.0/24 子网中的数据包,这样就永远不会到达第二条规则,也永远不会接受来自 11.2.3.0/24 的数据包
问题是,我不想接受来自这两个子网的所有数据包,我只是想拒绝所有不是来自那里的数据包。
我怎样才能做到这一点?
答案1
丢弃子网 11.2.4.0/24 中所有不带有源 IP 的数据包和11.2.3.0/24
为了避免任何误解:丢弃子网中没有源 IP 的所有数据包(11.2.4.0/24或者11.2.3.0/24)。
即(使用某种伪代码):
if not (from 11.2.4.0/24 or from 11.2.3.0/24) then drop [else continue]
这可以通过用户链和反转测试来实现
上述条件等效于:
if (from 11.2.4.0/24 or from 11.2.3.0/24) then continue else drop
可以像这样实现:
if from 11.2.4.0/24 then continue else if from 11.2.3.0/24 then continue else drop
可以使用用户定义的链来帮助实现此逻辑:
iptables -N dropifnomatch iptables -A dropifnomatch -s 11.2.4.0/24 -j RETURN iptables -A dropifnomatch -s 11.2.3.0/24 -j RETURN iptables -A dropifnomatch -j DROP
然后可以从其他地方调用此链(例如:INPUT)来实现目标:
iptables -A INPUT -j dropifnomatch
对于来自 11.2.4.0/24 或 11.2.3.0/24 的数据包将继续进行规则集遍历(因为对于其中任何一个,链
dropifnomatch
的遍历在到达其最终丢弃规则之前就会停止),可能是为了达到进一步限制流量的后续规则,但任何不是来自这些地址的数据包都将被立即丢弃。或者可以使用配套工具来实现ipset沿着iptables
为了有效处理更大的网络列表并将数据与代码分离,可以使用ipset配套工具来定义要列入白名单的网络列表(因此其名称将被选为
whitelist
)。ipset create whitelist hash:net ipset add whitelist 11.2.4.0/24 ipset add whitelist 11.2.3.0/24
如果数据包的源地址不在白名单中,则将其丢弃:
iptables -A INPUT -m set ! --match-set whitelist src -j DROP
因此像以前一样,它将只继续使用 11.2.4.0/24 或 11.2.3.0/24 并丢弃其他任何内容。