使用nftables预防被端口扫描:修订间差异
来自md5.pw
更多语言
更多操作
创建页面,内容为“我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生IP在对端口进行暴力破解, 即便是上了类似Fail2ban这种防护工具, 日志里陌生IP的记录也永远不会消停; 想上白名单, 但每次自己的IP变了之后, 还要再手动加进白名单里, 比较麻烦. 这时候, 我们就可以用 <code>nftables</code> 自动拉黑那些尝试扫描端口的陌生IP. ---- === 1. 准备 === 确保…” |
添加分类目录 |
||
| (未显示1个用户的2个中间版本) | |||
| 第30行: | 第30行: | ||
* 设立陷阱端口, 只有尝试建立连接时才会封禁, 推荐设为一些协议的默认端口, 误封概率适中 | * 设立陷阱端口, 只有尝试建立连接时才会封禁, 推荐设为一些协议的默认端口, 误封概率适中 | ||
<syntaxhighlight> | <syntaxhighlight>table inet prevent_scanning { | ||
table inet prevent_scanning { | |||
set tmp_blacklist_ipv4 { | set tmp_blacklist_ipv4 { | ||
type ipv4_addr | type ipv4_addr | ||
| 第49行: | 第48行: | ||
policy drop; | policy drop; | ||
# 放行本地/已建立/相关的连接 | |||
iif lo accept; | iif lo accept; | ||
ct state established,related accept; | ct state established,related accept; | ||
| 第69行: | 第69行: | ||
udp dport { 50-70, 110-170, 514, 1194, 5353 } 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_ipv6 { ip6 saddr } drop; | ||
} | } | ||
} | }</syntaxhighlight> | ||
</syntaxhighlight> | |||
* 任何端口没被放行后, 直接拉黑, 端口被扫中的概率最低, 但误封率较高 (比如不小心访问到80端口) | * 任何端口没被放行后, 直接拉黑, 端口被扫中的概率最低, 但误封率较高 (比如不小心访问到80端口) | ||
| 第107行: | 第106行: | ||
} | } | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
=== 4. 完成配置 === | |||
根据自己的喜好进行调整后保存, 重启<syntaxhighlight> | |||
systemctl restart nftables.service | |||
</syntaxhighlight>查看封禁了哪些IP<syntaxhighlight> | |||
nft list set inet prevent_scanning tmp_blacklist_ipv4 | |||
nft list set inet prevent_scanning tmp_blacklist_ipv6 | |||
</syntaxhighlight> | |||
[[Category:500 常见应用指南 — Application Guides]] | |||
2026年2月18日 (三) 07:08的最新版本
我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生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