使用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