下面是自己常用的一套在 Ubuntu 26.04 / Debian 系服务器上真正有效、可直接照做的防恶意扫描方案,不废话、不玄学,全是运维常用实战配置。
一、最核心原则
恶意扫描防不住,但可以:
- 不让它扫到真实端口
- 不让它暴力破解
- 扫几次就直接拉黑 IP
- 不暴露没必要的服务
二、立刻能做的 6 件事(最强防护)
1. 只开放必要端口(防火墙 UFW)
Ubuntu 默认自带 UFW,直接开:
# 只允许 80/443 和 SSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
# 启用防火墙
sudo ufw enable
# 查看状态
sudo ufw status
数据库端口 3306、Redis 6379、Mongo 27017 一律不开放公网。
2. 安装 fail2ban(自动拉黑扫描 IP)
专门治你日志里那种疯狂试探的 IP:
sudo apt update
sudo apt install fail2ban -y
默认配置就已经能防:
- SSH 爆破
- Nginx 恶意请求
- 代理扫描
- 暴力破解
3. 数据库、缓存服务只绑内网
MySQL
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
确保:
bind-address = 127.0.0.1
Redis
bind 127.0.0.1
protected-mode yes
公网绝对不要暴露数据库。
4. SSH 强化(防止被扫爆)
sudo nano /etc/ssh/sshd_config
修改:
Port 你的自定义端口(可选)
PermitRootLogin no
PasswordAuthentication no # 只用密钥
ChallengeResponseAuthentication no
重启:
systemctl restart sshd
5. Nginx 屏蔽异常请求(挡代理扫描)
在 Nginx 配置里加:
# 拦截空 UA、恶意二进制包
if ($request_uri ~* "^[\x00-\x1F]") { return 444; }
if ($user_agent = "") { return 444; }
# 禁止 CONNECT 代理请求
if ($request_method = CONNECT) { return 444; }
444 是 Nginx 专用关闭连接,不返回任何内容,扫描器直接断连。
6. 关闭不必要的服务
查看开启的服务:
ss -tulnp
不用的一律关掉:
特别是开源的软件,多一个就有一份可能
systemctl disable --now 服务名
三、进阶加固(可选,但非常强)
- Cloudflare 代理 真实 IP 隐藏,扫描器扫的是 CF IP,根本碰不到你服务器。
- 端口敲门 port-knocking SSH 不暴露,只有按顺序敲几个端口才能开门。
- 限制 IP 访问 后台、PHPMyAdmin 等只允许你自己的 IP。
只要你:
- 防火墙开了
- 数据库不暴露
- fail2ban 装了
- SSH 用密钥
这类扫描对你的机器毫无威胁(除非针对性恶意的)。