首页 > Sysadmin > 正文

Linux 阻止漏洞扫描:防火墙加固

huyuanwen 2026-11-05 Sysadmin

漏洞扫描先看端口和服务版本,把暴露面收小、限速、自动封禁三步就能大幅降低风险。

扫描器在看什么

端口扫描器先探测开放端口,再对服务做版本识别(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 可用。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。