1. 首页 > 技术教程 > 正文

恶意 IP 封禁:使用防火墙一键屏蔽恶意爬虫与扫描器

恶意 IP 封禁:使用防火墙一键屏蔽恶意爬虫与扫描器

你的服务器日志里是不是整天被那些莫名其妙的 IP 刷屏?什么 `404` 扫路径、`POST` 测漏洞、还有疯狂抓数据的爬虫。别问为什么,这些 IP 十有八九不是来访问你网站的,而是来搞事的。主机选这篇 Linux 教程直接告诉你:用防火墙一键封禁,省心省力,别手软。

恶意 IP 封禁:使用防火墙一键屏蔽恶意爬虫与扫描器的图片

准备:识别哪些是恶意 IP

封禁之前,你得先知道该封谁。别瞎封,万一把搜索引擎爬虫也封了,那流量就没了。

从日志里捞出高频 IP

最直接的办法,看 `nginx` 或 `apache` 的访问日志。一条命令就能把访问量最高的 IP 列出来:

统计 nginx 访问日志中,出现次数最多的前 10 个 IP

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

看到那种几万次访问、全是 `404` 或者重复请求一个路径的 IP,基本就是恶意扫描器。比如一个 IP 一小时内刷了 5000 次 `wp-login.php`,直接拉黑。

用 fail2ban 自动识别

手动翻日志太累,老运维都用 `fail2ban`。它能根据日志里的失败次数自动封禁 IP,省得你半夜爬起来看日志。

安装 fail2ban

sudo apt install fail2ban -y # Debian/Ubuntu
sudo yum install fail2ban -y # CentOS/RHEL

装完配置一下,比如监控 SSH 登录失败次数,超过 5 次就封 24 小时。配置文件在 `/etc/fail2ban/jail.local`,照着官方模板改就行。

实战:用 iptables 一键封禁恶意 IP

`iptables` 是 Linux 内核的防火墙,几乎所有 VPS 和服务器都自带。别觉得它难,封一个 IP 就一行命令。

封禁单个 IP

假设你查到恶意 IP 是 `192.168.1.100`,直接干掉:

封禁 IP,禁止所有入站流量

sudo iptables -A INPUT -s 192.168.1.100 -j DROP

这条命令的意思是:在 INPUT 链(入站规则)里,匹配源 IP 为 `192.168.1.100` 的包,直接丢弃(DROP)。效果立竿见影,对方连你的服务器都 ping 不通。

封禁整个 IP 段

有些扫描器会用整个 C 段扫你,比如 `10.0.0.0/24`。别一个个封,直接封段:

封禁 10.0.0.0/24 整个网段

sudo iptables -A INPUT -s 10.0.0.0/24 -j DROP

查看已封禁的 IP 列表

封多了容易忘,查一下当前规则:

查看 INPUT 链的所有规则

sudo iptables -L INPUT -n –line-numbers

看到一堆 `DROP` 的条目,就是你的封禁列表。如果发现误封,记下规则编号,删掉它。

解封误封的 IP

万一误封了正常访问的 IP,别慌,解封也快:

删除 INPUT 链中编号为 3 的规则

sudo iptables -D INPUT 3

`-D` 是删除,后面跟链名和规则编号。编号从 1 开始,用 `iptables -L` 看到的就是编号。

>老鸟叮嘱:`iptables` 的规则是临时的,重启服务器就没了。如果你用的是 `CentOS 7` 及以上,或者 `Ubuntu 16.04` 以上,建议改用 `firewalld` 或 `ufw`,因为它们支持持久化保存。不想换的话,记得用 `iptables-save` 把规则存下来。

进阶:用 firewalld 和 ufw 简化操作

如果你觉得 `iptables` 命令太长,可以试试更友好的工具。

firewalld 封禁 IP

`firewalld` 是 CentOS 7/8 和 RHEL 的默认防火墙,封 IP 像喝水一样简单:

封禁 IP

sudo firewall-cmd –permanent –add-rich-rule='rule family="ipv4" source address="192.168.1.100" drop'

重载规则生效

sudo firewall-cmd –reload

`–permanent` 表示永久生效,不加的话重启就失效。`–add-rich-rule` 是富规则,支持更复杂的条件。

ufw 封禁 IP

`ufw` 是 Ubuntu 的默认防火墙,更适合 Linux 小白:

封禁 IP

sudo ufw deny from 192.168.1.100

查看封禁列表

sudo ufw status numbered

解封

sudo ufw delete deny from 192.168.1.100

`ufw` 的语法非常直白,`deny from` 就是拒绝来自某个 IP 的流量。解封时用 `delete` 加上原规则就行。

排障:封了 IP 但还是能访问?

这个问题经常遇到。你明明封了 IP,对方还能访问你的网站。原因多半是:防火墙规则没生效,或者你封错了链。

检查防火墙是否运行

先确认防火墙进程在跑:

iptables 检查

sudo iptables -L -n | grep DROP

firewalld 检查

sudo systemctl status firewalld

ufw 检查

sudo ufw status

如果防火墙没启动,封了等于白封。`iptables` 没启动的话,先启用它:

启动 iptables 服务 (systemd 系统)

sudo systemctl start iptables
sudo systemctl enable iptables

检查规则顺序

`iptables` 是顺序匹配的,规则从上到下执行。如果你把 `DROP` 规则加在了 `ACCEPT` 规则后面,那 `ACCEPT` 会先放行,`DROP` 根本轮不到执行。

解决方法:把封禁规则插到 INPUT 链的最前面:

在 INPUT 链最前面插入规则

sudo iptables -I INPUT -s 192.168.1.100 -j DROP

`-I` 是插入,默认插到第一行。这样你的封禁规则就会优先执行。

老鸟叮嘱:别封错自己的 IP

封禁时最坑的操作:不小心把自己的 IP 或者 VPN 的 IP 封了。后果就是你再也连不上服务器,只能去机房或者用 IPMI/KVM 控制台解封。

建议:封禁之前,先用 `curl ifconfig.me` 看看自己当前的外网 IP,确认不是要封的那个。另外,别在 SSH 会话里封自己的 IP,万一断了,你就进不去了。

FAQ

1. Linux SSH 连不上怎么办?

先确认服务器是否还在线,ping 一下 IP。如果 ping 不通,可能是防火墙封了 SSH 端口(22)。用 IPMI 或控制台登录,检查 `iptables` 或 `firewalld` 规则,看看有没有误封。如果有,删掉规则或放行 22 端口。

2. VPS 防火墙端口放行后还是访问不了是什么原因?

大概率是云服务商的安全组/防火墙策略还没放行。很多 VPS 厂商(如阿里云、腾讯云)的控制面板里也有一个防火墙,和服务器内部的防火墙是两层。去控制台的安全组里放行对应端口。

3. Linux 小白可以直接用 root 账号操作吗?

建议不要。日常运维用普通用户,需要提权时用 `sudo`。root 权限太大,一个误操作(比如 `rm -rf /`)就能把系统搞崩。封禁 IP 这种操作,普通用户配好 `sudo` 权限后也能做。

4. BBR 开启后为什么速度没有明显提升?

BBR 对丢包严重的网络改善明显,但如果你的服务器带宽本身就小(比如 1Mbps),或者对端网络限制严格,效果有限。另外,BBR 需要双向都支持,如果对方网络不支持,单向开启作用不大。

5. 封禁 IP 后,对方还能用代理访问吗?

能。封禁 IP 只针对源 IP 地址,如果对方换了代理 IP,新的 IP 就封不住了。所以封禁 IP 是治标不治本,最好配合 `fail2ban` 自动封禁,同时用 `mod_security` 或 Nginx 的 `limit_req` 模块限制请求速率。

6. 如何查看当前有哪些 IP 被封禁?

用 `iptables -L INPUT -n` 查看所有 INPUT 链规则,找到 `DROP` 条目。如果用 `firewalld`,用 `firewall-cmd –list-all`。用 `ufw`,用 `ufw status numbered`。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9523.html 商家投稿邮箱:zhujixuanblog@qq.com