漏洞扫描先看端口和服务版本,把暴露面收小、限速、自动封禁三步就能大幅降低风险。
扫描器在看什么
端口扫描器先探测开放端口,再对服务做版本识别(banner grabbing)。阻止扫描不是”隐身”,而是:少暴露、限速率、自动封禁、隐藏版本。没有任何方法能完全阻止 determined attacker,但能过滤掉批量扫描和低级探测 [7]。
一、防火墙限速:nftables
nftables 是现代 Linux 的包过滤框架,用 meter 对每个源 IP 的新建连接做速率限制 [4][5]。
# 新建表与链
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
# 对 SSH 新建连接每源 IP 限 3 次/分钟
nft add rule inet filter input tcp dport 22 ct state new meter ssh_scan { ip saddr limit rate 3/minute } accept
# 查看与持久化
nft list ruleset
nft list ruleset > /etc/nftables.conf
systemctl enable --now nftables
把规则持久化到 /etc/nftables.conf,并启用服务:
WSL2 实测:nftables v1.0.9,上述规则可创建并 nft list ruleset 回读;删除表后 ruleset 清空 [4]。
二、内核参数加固:sysctl
通过 sysctl 调整内核网络栈,降低扫描与洪水攻击面 [3][2]。
# /etc/sysctl.d/99-scan-harden.conf 写入后应用
cat > /etc/sysctl.d/99-scan-harden.conf <<'EOF'
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
EOF
sysctl --system
sysctl net.ipv4.tcp_syncookies
应用并验证 [1]:
tcp_syncookies:SYN 队列溢出时启用 syncookie,防 SYN 洪水(默认 1)[3]。icmp_echo_ignore_broadcasts:忽略广播 ICMP echo,防 Smurf 放大(默认 1)。accept_redirects/send_redirects:关闭 ICMP 重定向,防路由劫持。
WSL2 实测:上述 5 项参数均可写入 /etc/sysctl.d/ 并通过 sysctl --system 应用,回读值正确 [1]。
三、自动封禁:fail2ban
fail2ban 监听日志,对重复失败的源 IP 自动加防火墙规则 [6]。Ubuntu 24.04 软件包版本 1.0.2,主配置 /etc/fail2ban/jail.conf(勿直接改,用 jail.local 覆盖)。
apt-get install -y fail2ban
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = ssh
EOF
systemctl enable --now fail2ban
fail2ban-client status sshd
注意:[sshd] jail 需要 openssh-server 已安装并产生日志;WSL2 默认未安装 sshd,因此该 jail 在纯净环境无法启用 [6]。
四、端口敲门:knockd
端口敲门(port knocking)默认关闭所有端口,只有收到正确敲门序列才临时开放。Ubuntu 24.04 knockd 0.8 配置 /etc/knockd.conf 示例:
# /etc/knockd.conf
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
启用:把 /etc/default/knockd 中 START_KNOCKD=0 改为 1,systemctl enable --now knockd。敲门序列务必保密,且 knockd 依赖 iptables,nftables-only 环境需额外适配。
五、收敛服务面与隐藏版本
# 查看监听端口
ss -tlnp
# 关闭不必要的服务
systemctl disable --now <service>
- 关闭未用服务(如 telnet、ftp、rpcbind),减少攻击面 [7]。
- SSH:修改
/etc/ssh/sshd_config的Port、PermitRootLogin no、PasswordAuthentication no(密钥登录),并systemctl restart ssh。 - 服务 banner:避免在 HTTP/SSH/FTP 响应中泄露版本号(如 nginx
server_tokens off)。
回滚
- nftables:
nft flush ruleset或nft delete table inet filter;恢复/etc/nftables.conf备份。 - sysctl:删除
/etc/sysctl.d/99-scan-harden.conf,sysctl --system。 - fail2ban:
systemctl stop fail2ban,移除jail.local。 - knockd:
systemctl stop knockd,恢复/etc/default/knockd。
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
| nft: Operation not permitted | 非 root 或内核无 nf_tables | 用 root;检查 grep nf_tables /proc/modules |
| sysctl: permission denied | 容器/WSL 限制 | 在宿主机或有权限的环境执行 |
| fail2ban 启动失败 | 无日志文件或后端不支持 | 安装 openssh-server;检查 fail2ban-client -d |
| 敲门后仍无法连接 | 序列/超时/iptables 路径 | 核对 sequence 与 seq_timeout,检查 iptables -L |
实测与局限性
- 实测环境:WSL2 Ubuntu 24.04.4,nftables v1.0.9,fail2ban 1.0.2,knockd 0.8,kernel 6.6.114。
- 已验证:nftables 表/链/规则创建与回读、meter 限速语法;sysctl 5 项参数写入与应用;fail2ban/knockd 软件包文件布局(dpkg-deb 解包核查);ss 监听端口查询 [7]。
- 局限性:WSL2 无法验证真实重启后的规则持久化、跨网段扫描、SELinux/AppArmor 策略;fail2ban/knockd 未实际启动(环境无 sshd/iptables 命令);nftables 服务在 WSL2 默认 disabled,启用需 systemd 可用。
参考资料
- [1] sysctl(8) – Linux manual page (man7.org)(man7-sysctl)
- [2] sysctl.conf(5) – Linux manual page (man7.org)(man7-sysctlconf)
- [3] ip-sysctl.txt – Linux kernel documentation (kernel.org)(kernel-ip-sysctl)
- [4] nft(8) – nftables – Debian trixie(debian-nft)
- [5] Meters – nftables wiki(nftables-wiki-meters)
- [6] fail2ban/config/jail.conf at master(fail2ban-jailconf)
- [7] ss(8) – Linux manual page (man7.org)(man7-ss)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。