服务器防火墙拦截恶意扫描:新手配置实操指南
开头:恶意扫描不是小事,学会防火墙拦截是关键
如果你的服务器突然变慢、日志里出现大量重复IP尝试登录SSH,或者被安全厂商告知“存在被扫描风险”,那你需要立刻配置服务器防火墙拦截恶意扫描。
本文分三套方案(iptables、fail2ban、宝塔面板),从零开始,让你亲手关上门。
准备条件:开始前先确认三件事
- 你有服务器的 root 权限 或能使用
sudo。 - 系统为 Linux(以 CentOS 7/8、Ubuntu 20.04 为例)。
- 如果你用宝塔面板,确保已安装 Nginx 或 Apache(防火墙功能需面板支持)。
方案一:用 iptables 手动封 IP(适合临时且精准)
iptables 是 Linux 自带防火墙,直接操作内核过滤包。
以下命令需谨慎,建议先备份当前规则:
# 保存现有规则(CentOS)
iptables-save > /root/iptables.rules.bak
# Ubuntu 使用 iptables-persistent 或 netfilter-persistent
1. 查看当前有哪些恶意 IP
先通过 lastb 或 journalctl 筛选出尝试登录失败的 IP:
lastb | awk '{print $3}' | sort | uniq -c | sort -rn | head -10
把排名靠前且不认识的 IP 记下来。
2. 用 iptables 阻止单个 IP
iptables -A INPUT -s 192.168.1.100 -j DROP
替换 192.168.1.100 为实际恶意 IP。
这条规则会丢弃来自该 IP 的所有数据包。
3. 限制对 SSH 端口的尝试频率(防暴力扫描)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
效果:同一 IP 在 60 秒内建立超过 4 次 SSH 新连接,后续连接会被丢弃。
4. 保存规则使其重启生效
CentOS 7:service iptables save(需安装 iptables-services)
Ubuntu:iptables-save > /etc/iptables/rules.v4
方案二:fail2ban——自动拦截、省心省力
fail2ban 会扫描日志文件,把尝试多次失败的 IP 自动加入防火墙黑名单。
安装与配置
# CentOS
yum install epel-release -y && yum install fail2ban -y
# Ubuntu
apt update && apt install fail2ban -y
创建本地配置文件 /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 3600 # 封禁1小时
findtime = 600 # 检测10分钟内的失败次数
maxretry = 3 # 超过3次就封
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
启动并验证
systemctl enable fail2ban --now
fail2ban-client status sshd
你会看到被封的 IP 列表。
如果想手动解封某个 IP:fail2ban-client set sshd unbanip 192.168.1.100。
方案三:宝塔面板防火墙(适合不会命令行的用户)
登录宝塔后台 -> 点击左侧“安全” -> 在“防火墙”标签下:
- 放行端口:确保 80、443 等业务端口已放行。
- 屏蔽 IP:点击“添加规则”,选择“屏蔽”,填入恶意 IP。
- 使用“CC防御”:可在“网站” -> 对应站点 -> “高级设置”中开启防 CC,限制单 IP 连接数。
宝塔面板会帮你自动调用 iptables,无需手动输入命令。
避坑指南:新手最容易翻车的三个地方
- 把自己封在外面:操作 iptables 前,先用
iptables -P INPUT ACCEPT设默认允许,配置完成后再改回 DROP。更安全:先开一个 SSH 会话做探测,不要关闭当前连接。 - fail2ban 没有生效:检查日志路径是否正确(用
fail2ban-client status sshd看Currently failed数量是否为 0),如果系统使用 Journald 日志,需按官方文档调整logpath。 - 宝塔防火墙规则和系统 iptables 冲突:宝塔会覆盖自定义 iptables 规则,建议统一在面板中管理;如果手动添加规则后重启面板,可能丢失,需在面板“安全”里添加。
效果验证:怎么知道拦截成功?
- 执行
iptables -L -n,查看是否有 DROP 条目。 - 用
fail2ban-client status sshd能看到 banned IP list。 - 在宝塔面板“安全 -> 防火墙”中查看已屏蔽 IP。
- 更直观:从另一台机器用被屏蔽的 IP 尝试 SSH,应直接超时或拒绝连接。
常见问题解答
Q:我不想封整个 IP,能只限制端口扫描吗?
A:可以用 hashlimit 模块限制每分钟新建连接数,如:iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-name http --hashlimit-above 30/minute --hashlimit-burst 60 -j DROP。
Q:我的服务器被 DDoS 攻击,这些方法够用吗?
A:针对应用层 CC 攻击,fail2ban 和 iptables 有一定效果;但大流量 DDoS 需要云厂商的清洗服务(如阿里云高防、Cloudflare)。
Q:重启后规则全丢了怎么办?
A:确保保存了规则(service iptables save)并启用 iptables-services 服务;fail2ban 会自动恢复,宝塔面板每次启动也会重新加载。
结语
配置服务器防火墙拦截恶意扫描并不难,关键在于选对方案并做好持久化。
建议零基础用户先用宝塔面板 + fail2ban 组合,业务稳定后再深入 iptables 自定义规则。
如果你在操作过程中遇到“规则没生效”或“把自己封禁”,请回头检查避坑部分,多半能解决。