切換選單
切換偏好設定選單
切換個人選單
尚未登入
若您做出任何編輯,會公開您的 IP 位址。
於 2026年2月18日 (三) 05:18 由 Koud Wind留言 | 貢獻 所做的修訂 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