切換選單
切換偏好設定選單
切換個人選單
尚未登入
若您做出任何編輯,會公開您的 IP 位址。
於 2026年2月18日 (三) 05:05 由 Koud Wind留言 | 貢獻 所做的修訂 (创建页面,内容为“我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生IP在对端口进行暴力破解, 即便是上了类似Fail2ban这种防护工具, 日志里陌生IP的记录也永远不会消停; 想上白名单, 但每次自己的IP变了之后, 还要再手动加进白名单里, 比较麻烦. 这时候, 我们就可以用 <code>nftables</code> 自动拉黑那些尝试扫描端口的陌生IP. ---- === 1. 准备 === 确保…”)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)

我想很多人有這樣的困惑, 明明自己改了默認端口, 一看日誌, 仍然還有陌生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;
    }
}