使用nftables预防被端口扫描:修订间差异
来自md5.pw
更多语言
更多操作
无编辑摘要 |
修复语法高亮标签的语言参数 |
||
| (未显示2个用户的2个中间版本) | |||
| 第5行: | 第5行: | ||
=== 1. 准备 === | === 1. 准备 === | ||
确保 nftables 已经安装<syntaxhighlight> | 确保 nftables 已经安装<syntaxhighlight lang="text"> | ||
nft --version | nft --version | ||
</syntaxhighlight>若没有安装, 以Debian13为例<syntaxhighlight> | </syntaxhighlight>若没有安装, 以Debian13为例<syntaxhighlight lang="text"> | ||
apt update | apt update | ||
apt install nftables | apt install nftables | ||
systemctl enable nftables | systemctl enable nftables | ||
</syntaxhighlight>拷贝原有的nftables配置, 到一个好找的目录里, 以 <code>/main/nftables</code> 为例, 再对原路径进行链接<syntaxhighlight>cp /etc/nftables.conf /main/nftables/ | </syntaxhighlight>拷贝原有的nftables配置, 到一个好找的目录里, 以 <code>/main/nftables</code> 为例, 再对原路径进行链接<syntaxhighlight lang="text">cp /etc/nftables.conf /main/nftables/ | ||
ln -f /main/nftables/nftables.conf /etc/nftables.conf</syntaxhighlight>并准备好编辑 <code>/main/nftables/nftables.conf</code> | ln -f /main/nftables/nftables.conf /etc/nftables.conf</syntaxhighlight>并准备好编辑 <code>/main/nftables/nftables.conf</code> | ||
---- | ---- | ||
| 第30行: | 第30行: | ||
* 设立陷阱端口, 只有尝试建立连接时才会封禁, 推荐设为一些协议的默认端口, 误封概率适中 | * 设立陷阱端口, 只有尝试建立连接时才会封禁, 推荐设为一些协议的默认端口, 误封概率适中 | ||
<syntaxhighlight>table inet prevent_scanning { | <syntaxhighlight lang="text">table inet prevent_scanning { | ||
set tmp_blacklist_ipv4 { | set tmp_blacklist_ipv4 { | ||
type ipv4_addr | type ipv4_addr | ||
| 第48行: | 第48行: | ||
policy drop; | policy drop; | ||
# 放行本地/已建立/相关的连接 | |||
iif lo accept; | iif lo accept; | ||
ct state established,related accept; | ct state established,related accept; | ||
| 第71行: | 第72行: | ||
* 任何端口没被放行后, 直接拉黑, 端口被扫中的概率最低, 但误封率较高 (比如不小心访问到80端口) | * 任何端口没被放行后, 直接拉黑, 端口被扫中的概率最低, 但误封率较高 (比如不小心访问到80端口) | ||
<syntaxhighlight line="1" start="0">table inet prevent_scanning { | <syntaxhighlight lang="text" line="1" start="0">table inet prevent_scanning { | ||
set tmp_blacklist_ipv4 { | set tmp_blacklist_ipv4 { | ||
type ipv4_addr | type ipv4_addr | ||
| 第107行: | 第108行: | ||
=== 4. 完成配置 === | === 4. 完成配置 === | ||
根据自己的喜好进行调整后保存, 重启<syntaxhighlight> | 根据自己的喜好进行调整后保存, 重启<syntaxhighlight lang="text"> | ||
systemctl restart nftables.service | systemctl restart nftables.service | ||
</syntaxhighlight>查看封禁了哪些IP<syntaxhighlight> | </syntaxhighlight>查看封禁了哪些IP<syntaxhighlight lang="text"> | ||
nft list set inet prevent_scanning tmp_blacklist_ipv4 | nft list set inet prevent_scanning tmp_blacklist_ipv4 | ||
nft list set inet prevent_scanning tmp_blacklist_ipv6 | nft list set inet prevent_scanning tmp_blacklist_ipv6 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Category:500 常见应用指南 — Application Guides]] | |||
2026年9月18日 (五) 15:40的最新版本
我想很多人有这样的困惑, 明明自己改了默认端口, 一看日志, 仍然还有陌生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