iptables 丢弃所有不来自两个特定子网的数据包

iptables 丢弃所有不来自两个特定子网的数据包

我想丢弃子网 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 并丢弃其他任何内容。

相关内容