使用nftables預防被端口掃描
出自md5.pw
更多語言
更多操作
這是此頁面最近一次修訂;沒有已批准修訂。
我想很多人有這樣的困惑, 明明自己改了默認端口, 一看日誌, 仍然還有陌生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