打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

使用nftables预防被端口扫描

来自md5.pw
Koud Wind留言 | 贡献2026年2月18日 (三) 05:18的版本 3. 配置

我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生IP在对端口进行暴力破解, 即便是上了类似Fail2ban这种防护工具, 日志里陌生IP的记录也永远不会消停; 想上白名单, 但每次自己的IP变了之后, 还要再手动加进白名单里, 比较麻烦.

这时候, 我们就可以用 nftables 自动拉黑那些尝试扫描端口的陌生IP.


1. 准备

确保 nftables 已经安装

nft --version

若没有安装, 以Debian13为例

apt update
apt install nftables
systemctl enable nftables

拷贝原有的nftables配置, 到一个好找的目录里, 以 /main/nftables 为例, 再对原路径进行链接

cp /etc/nftables.conf /main/nftables/
ln -f /main/nftables/nftables.conf /etc/nftables.conf

并准备好编辑 /main/nftables/nftables.conf


2. 基础策略

如果你之前配置过nftables, 那就在原有基础上进行新增或合并

现在假设我不希望ssh端口被扫中, 默认的22端口肯定不得使用, 需要将ssh端口开放到一个没有任何协议所使用的的默认端口上 (比如ssh开放到80端口)

一般的陌生IP暴力破解一个端口, 需要先进行网络嗅探, 陌生IP可以自行扫描获取端口协议, 也可以使用其他平台公示的端口, 端口扫描器肯定优先扫描一些协议的默认端口, 绝对不能使用这些

端口扫描器扫完常见协议的端口, 之后大部分只会按照端口顺序进行扫描, 但这样基本上是不可能扫中的, 只有随机顺序扫描才有可能扫中

3. 配置

这里以ssh开放在46端口为例

我们可以分成两种方式:

  • 设立陷阱端口, 只有尝试建立连接时才会封禁, 推荐设为一些协议的默认端口, 误封概率适中
table inet prevent_scanning {
    set tmp_blacklist_ipv4 {
        type ipv4_addr
        flags timeout
        # 封禁时间
        timeout 30m
    }

    set tmp_blacklist_ipv6 {
        type ipv6_addr
        flags timeout
        timeout 20m
    }

    chain input {
        type filter hook input priority 0;
        policy drop;

        # 放行本地/已建立/相关的连接
        iif lo accept;
        ct state established,related        accept;

        # 不希望被ping到可以注释掉
        ip protocol icmp                    accept;
        ip6 nexthdr ipv6-icmp               accept;
        
        
        ip saddr @tmp_blacklist_ipv4        drop;
        ip6 saddr @tmp_blacklist_ipv6       drop;

        # 放行后不会往后执行
        tcp dport { 46 }    ct state new    accept;
        
        # 自行配置陷阱端口
        tcp dport { 1-25, 3300-3500, 6379, 8080 }       ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;
        tcp dport { 1-25, 3300-3500, 6379, 8080 }       ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;
        udp dport { 50-70, 110-170, 514, 1194, 5353 }   ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;
        udp dport { 50-70, 110-170, 514, 1194, 5353 }   ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;
    }
}
  • 任何端口没被放行后, 直接拉黑, 端口被扫中的概率最低, 但误封率较高 (比如不小心访问到80端口)
table inet prevent_scanning {
    set tmp_blacklist_ipv4 {
        type ipv4_addr
        flags timeout
        timeout 30m
    }

    set tmp_blacklist_ipv6 {
        type ipv6_addr
        flags timeout
        timeout 20m
    }

    chain input {
        type filter hook input priority 0;
        policy drop;

        iif lo accept;
        ct state established,related        accept;

        # 不希望被ping到可以注释掉
        ip protocol icmp                    accept;
        ip6 nexthdr ipv6-icmp               accept;
        
        
        ip saddr @tmp_blacklist_ipv4        drop;
        ip6 saddr @tmp_blacklist_ipv6       drop;

        tcp dport { 46 }    ct state new    accept;
        
        ct state new    add @tmp_blacklist_ipv4 { ip saddr }    drop;
        ct state new    add @tmp_blacklist_ipv6 { ip6 saddr }   drop;
    }
}

4. 完成配置

根据自己的喜好进行调整后保存, 重启

systemctl restart nftables.service

查看封禁了哪些IP

nft list set inet prevent_scanning tmp_blacklist_ipv4
nft list set inet prevent_scanning tmp_blacklist_ipv6