使用nftables创建动态黑名单

408

我想用nftables创建一个动态黑名单。在嵌入式设备上的0.8.3版本下,我使用nft list规则集创建一个规则集,如下所示:

table inet filter {
set blackhole {
    type ipv4_addr
    size 65536
    flags timeout
}

chain input {
    type filter hook input priority 0; policy drop;
    ct state invalid drop
    ct state established,related accept
    iif "lo" accept
    ip6 nexthdr 58 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-done, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report } accept
    ip protocol icmp icmp type { echo-reply, destination-unreachable, echo-request, router-advertisement, router-solicitation, time-exceeded, parameter-problem } accept
    ip saddr @blackhole counter packets 0 bytes 0 drop
    tcp flags syn tcp dport ssh meter flood { ip saddr timeout 1m limit rate over 10/second burst 5 packets}  set add ip saddr timeout 1m @blackhole drop
    tcp dport ssh accept
}

chain forward {
    type filter hook forward priority 0; policy drop;
}

chain output {
    type filter hook output priority 0; policy accept;
}
}

对我来说,这只是一个临时解决方案。我想将官方手册页中的示例用于动态黑名单。如果我使用手册页中的官方示例,我的nftables文件将如下所示:

table inet filter {
set blackhole{
        type ipv4_addr
        flags timeout
        size 65536
}
chain input {
        type filter hook input priority 0; policy drop;

        # drop invalid connections
        ct state invalid drop

        # accept traffic originating from us
        ct state established,related accept

        # accept any localhost traffic
        iif lo accept

        # accept ICMP
        ip6 nexthdr 58 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-done, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report } accept
        ip protocol icmp icmp type { destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem, echo-request, echo-reply } accept

        # accept SSH (port 22)
        ip saddr @blackhole counter drop
        tcp flags syn tcp dport ssh meter flood { ip saddr timeout 10s limit rate over 10/second} add @blackhole { ip saddr timeout 1m } drop
        tcp dport 22 accept

}


chain forward {
        type filter hook forward priority 0; policy drop;
}

chain output {
        type filter hook output priority 0; policy accept;
}

}

但是,当我使用nft -f myfile在版本0.8.3上加载此nftables文件时,出现此错误:

Error: syntax error, unexpected add, expecting newline or semicolon
    tcp flags syn tcp dport ssh meter flood { ip saddr timeout 10s limit rate over 10/second} add @blackhole { ip saddr timeout 1m } drop

我不知道为什么会这样,但是根据Wiki,它应该在版本0.8.1和内核4.3中工作。

我有版本0.8.3和内核4.19.94。

我已经在Debian Buster的0.9.0版官方手册中测试了该规则集。联机帮助页上的规则集可与Debian配合使用,但ip仅被阻止一次。

在此示例中,我想创建一个防火墙规则,如果对我的设备启动了暴力攻击,它将阻止ssh端口上的ip地址。但我想阻止IP例如5分钟。在那之后,应该可以从攻击者ip重新连接到设备。如果他再次进行暴力破解,则应再次阻止ip 5分钟,依此类推。如果要使用nftables,我想避免对我的嵌入式设备使用sshguard或fail2ban之类的其他软件。

我希望任何人都能帮助我。谢谢!

AB

hydra工具可同时多次连接到SSH服务器。在OP的情况下(评论hydra -l <username> -P </path/to/passwordlist.txt> -I -t 6 ssh://<ip-address>),它会使用6个连接并发线程。

根据服务器设置的不同,一个连接通常会尝试5或6个密码,大约需要10秒钟才能被SSH服务器拒绝,因此我看不到如何可以超过每秒10次​​的连接尝试次数(但是就是这种情况) 。这可能意味着触发原因是在不到1 / 2s的时间内完成了5次以上的连接尝试。我不太相信的准确性10/s,但是可以假设它发生在这里。

版本和语法问题

不适用于0.8.1或0.8.3版本的语法是此提交中出现的较新语法

src:重新访问语法以从数据包路径更新集和映射

对于集,我们允许这样做:

  nft add rule x y ip protocol tcp update @y { ip saddr}

[...]

它是版本0.8.3之后提交的因此仅在nftable> = 0.8.4时可用

在同一页面中,用于从数据包路径更新集的当前Wiki修订版在同一页面中仍显示具有以前语法的命令

 % nft add rule filter input set add ip saddr @myset

[...]

并以较新的语法显示结果:

[...]

                add @myset { ip saddr }

[...]

某些Wiki页面或最新的联机帮助页可能不适用于较早的nftables版本。

无论如何,如果使用内核4.19运行,则应首选nftables > = 0.9.0以获得更多功能。例如,它在Debian 10Debian 9 backports中可用

有条件接受规则之前应将其列入黑名单

一旦将IP添加到黑名单中,这不会阻止已建立的连接继续进行,不受阻碍和不加说明,直到它们被SSH服务器本身断开连接为止。这是因为之前存在通常的短路规则:

        # accept traffic originating from us
        ct state established,related accept

此评论具有误导性:它不接受来自我们的流量,接受任何流量这是短路规则。它的作用是通过仅解析新连接的所有规则来处理状态连接:此规则之后的任何规则都适用于新连接。接受连接后,它们的各个数据包将保持接受状态,直到连接结束。

对于处理黑名单的特定情况,应在此短路规则之前放置特定的黑名单规则或其中的一部分,以便立即生效。在OP的情况下是:

        ip saddr @blackhole counter drop

它应该在ct state established,related accept规则之前移动

现在,一旦将攻击者添加到黑名单中,其他正在进行的连接就不会再有剩余的尝试猜测密码的尝试:它们将立即挂起。

如果有黑名单,请考虑白名单

附带说明一下,便宜的iif lo accept规则本身既可以作为优化措施也可以被列入白名单:在滥用情况下,所有(甚至长期存在的)本地已建立的连接现在也将被列入黑名单(例如:从127.0.0.1起) 。考虑在规则之前添加各种白名单规则@blackhole

(可选)更快地警告应用程序

为了还防止服务器不断进行答复以到达列入黑名单的IP(特别是对于UDP流量,对包括SSH在内的TCP没用),daddr也可以在inet filter output链中添加使用的等效规则,并通过拒绝来更快地通知尝试访问本地进程的本地进程。认为他们应该中止:

    ip daddr @blackhole counter reject

两者之间的差异add以及update应用于集合上的差异

现在有了这样的设置,即使立即停止正在进行的连接,攻击者也可以继续尝试并在100万之后获得新的短窗口,这不是最佳选择。

条目必须在输入规则中更新d @blackhole ... dropupdate如果该条目已经存在,将刷新计时器,而add不会执行任何操作。这将继续阻止任何进一步的(失败的)尝试连接到SSH服务器的尝试,直到攻击者放弃,并且打开的窗口为零。(我在上面添加的输出规则不应更改,这不是攻击者的操作):

代替:

ip saddr @blackhole counter drop

使用(仍保持较旧的语法):

ip saddr @blackhole counter set update ip saddr timeout 1m @blackhole drop

甚至应该在ct state invalid规则之前将其移动,否则,如果攻击者尝试使用无效数据包(例如,TCP数据包不是已知连接的一部分,例如已被忘记的连接中的最新RST),则该集将不会被更新。

限制已建立连接的最大数量

需要内核> = 4.18和nftables> = 0.9.0,因此无法使用OP的当前配置来完成。

攻击者可能会发现它一次无法连接太多次,但只要连接速度不快,它仍然可以无限增加新连接。

并发连接限制(可与iptables一起使用connlimit)也可以与其他计量规则一起添加:

tcp flags syn tcp dport 22 meter toomanyestablished { ip saddr ct count over 3 } reject with tcp reset

将允许任何给定的IP地址仅建立3个SSH连接。

或者,同时触发@blackhole集(这次使用更新的语法):

tcp flags syn tcp dport 22 meter toomanyestablished { ip saddr ct count over 3 } add @blackhole { ip saddr timeout 1m } drop

在OP的情况下,这甚至应在之前的计量规则之前触发。请谨慎使用,以避免合法用户受到影响(但请参见openssh的ControlMaster选项)。

IPv4和IPv6

由于没有通用的IPv4 + IPv6设置地址类型,所有处理IPv4的规则(无论何时有2个字母的单词ip)都应该复制到其中包含一个ip6并在IPv6设置上工作的镜像规则

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

nftables动态将IPv4和IPv6列入黑名单

来自分类Dev

StackExchange黑名单

来自分类Dev

动态IP地址:是否有黑名单修复程序?

来自分类Dev

如何在MySQL中创建“黑名单”?

来自分类Dev

IP黑名单Apache

来自分类Dev

使用Zend Opcache将目录列入黑名单

来自分类Dev

grep-使用文件将其列入黑名单

来自分类Dev

不使用黑名单的 JWT 注销功能?

来自分类Dev

要求某种模式的IP黑名单

来自分类Dev

PHP邮件发送和黑名单

来自分类Dev

Windows Phone 8黑名单

来自分类Dev

Windows Phone 8黑名单

来自分类Dev

洪流跟踪网站黑名单

来自分类Dev

黑名单 xhci_hcd

来自分类Dev

动态填充ipset列表以将与某个iptables规则匹配的ip地址列入黑名单

来自分类Dev

Android-如何为我的应用程序文件创建“黑名单”

来自分类Dev

进出口dnslookup,优先级和“黑名单”(不是真正的黑名单)

来自分类Dev

SSH的白名单和黑名单

来自分类Dev

如何使用MDM协议为iOS设备实现黑名单应用程序

来自分类Dev

RegExp使用目录和文件扩展名黑名单过滤特定文件路径

来自分类Dev

使用XSD模式将xml数据中的黑名单字符

来自分类Dev

是否使用VPN自动浏览Internet,具体取决于URL是否在黑名单中

来自分类Dev

RegExp使用目录和文件扩展名黑名单过滤特定文件路径

来自分类Dev

使用黑名单捕获当前应用程序屏幕截图

来自分类Dev

在 NGINX 中使用 GET 请求自动将机器人 IP 列入黑名单

来自分类Dev

是否有一个(开放源代码)VCS可以使用白名单而不是黑名单?

来自分类Dev

是否有一个(开放源代码)VCS可以使用白名单而不是黑名单?

来自分类Dev

托管电子邮件黑名单的麻烦

来自分类Dev

bash完成中的黑名单程序

Related 相关文章

热门标签

归档