👁 16

开场:现在从”漏洞公开”到”有人来打你”,可能只有几个小时
以前折腾服务器,大家对安全的印象是”离我很远”——我又不是什么大公司,谁闲着没事攻击我?
这个想法在 2026 年基本不成立了。
原因不是坏人变多了,是成本变了。以前找一个能打的目标要手工扫、手工试;现在是爬虫 7×24 小时扫全网,扫描结果进数据库,漏洞公告一发布,自动化工具几小时内就能覆盖一遍。再叠上大模型:读一遍补丁 diff、写个 PoC、批量投递,全程不需要人盯着。
所以现在的现实是:你的机器不需要得罪谁,只要有一个端口露在公网上,就会自动进入别人的待办清单。
这篇写给刚买 VPS、刚装 NAS、刚在云上开了台小鸡、刚给路由器开了远程管理的人。不讲高深原理,讲能立刻动手的减法。
一、”我的 IP 没人知道”是最危险的错觉
先破除一个常见误解。
IPv4 一共 43 亿个地址,对自动化扫描来说,全网过一遍是”几小时”级别的事,不是”几年”。而且扫出来的结果还被做成了可搜索的数据库——Shodan、Censys、FOFA、ZoomEye 这类平台,输入一个关键词就能列出全世界所有开着某端口的机器,连 SSH 的版本 banner 都给你标好。
也就是说:你以为的”隐藏”,只是”还没被搜到”;而搜索是自动的。
一台全新装的机器,只要 22 端口对公网开着,日志里通常 24 小时内就会出现成百上千条失败登录。这不是针对你,是流水线作业。
AI 时代真正改变的,是从”发现”到”利用”的时间差:
- 过去:漏洞披露 → 有人研究 → 写工具 → 开始扫,周期以周计
- 现在:漏洞披露 → 自动化平台几小时内覆盖 → 大模型辅助改写利用代码,周期以小时计
- 结果:很多机器不是”被盯上了”,而是”刚好在名单里”
所以正确的默认假设是:我已经在名单里了。 剩下的问题只有一个——门锁没锁。
二、做减法之前,先看清自己开了哪些门
安全的第一步不是装软件,是盘点。你得先知道自己暴露了什么。
在服务器上跑:
ss -tulpn
重点看两列:监听地址和进程名。同样是开端口,含义完全不同:
| 监听地址 | 含义 | 风险 |
|---|---|---|
127.0.0.1:3306 | 只有本机能连 | 低,正确姿势 |
10.10.10.5:8080 | 只有组网/内网能连 | 低,推荐 |
0.0.0.0:8080 | 所有 IPv4 网卡都能连 | 公网可达,高危 |
[::]:8080 | 所有 IPv6 网卡都能连 | 公网可达,高危 |
很多人以为”我防火墙没放行就没事”,但云厂商的安全组、容器自己的端口映射、甚至 IPv6 的默认放行,都可能绕过你以为的那层防护。看到 0.0.0.0 和 [::] 就要问一句:这个真的需要给全世界看吗?
然后再从外部视角扫一次自己(在另一台机器、手机热点或云主机上跑,别在本机):
nmap -Pn -sT --top-ports 1000 你的公网IP
本机看是”内部视角”,外部扫才是别人看到的样子。两个结果对不上,说明中间还有一层你没算进去的东西(NAT、安全组、CDN、容器网络)。
下面这些端口,除非你非常清楚在做什么,否则都不该出现在公网上:
| 端口 | 服务 | 常见后果 |
|---|---|---|
| 3306 / 5432 | MySQL / PostgreSQL | 弱口令爆破、拖库 |
| 6379 | Redis | 未授权写入 SSH 公钥、植入挖矿 |
| 27017 | MongoDB | 历史未授权重灾区 |
| 9200 | Elasticsearch | 数据裸奔、被勒索 |
| 2375 / 2376 | Docker API | 等同于把 root 交出去 |
| 8080 / 8888 / 9000 | 各类面板、管理后台 | 默认口令、历史漏洞 |
| 6443 | Kubernetes API | 集群接管 |
三、SSH:先把最容易被敲的门挪走
公网 SSH 是被爆破最多的服务,没有之一。三件事按顺序做,收益最大。
1. 改端口
新建一个配置片段(不要直接改主配置,升级时容易丢):
sudo tee /etc/ssh/sshd_config.d/10-port.conf >/dev/null <<'EOF'
Port 22222
EOF
放行新端口,再重载:
# firewalld
sudo firewall-cmd --permanent --add-port=22222/tcp && sudo firewall-cmd --reload
# ufw
sudo ufw allow 22222/tcp
sudo sshd -t # 先校验语法,别直接重启
sudo systemctl reload sshd
两个坑必须提醒:
- SELinux 开着的系统(CentOS / RHEL / Alma / Rocky)还要加端口标签,否则 sshd 起不来:
sudo semanage port -a -t ssh_port_t -p tcp 22222
- 改端口时千万别关掉当前会话。先
ssh -p 22222另开一个窗口确认能进,再关旧的。
说句实话:换端口不是安全边界。会打你的人照样能扫全端口。它真正的作用是——把 99% 只扫 22 的无脑脚本挡在门外,让日志干净下来,让你能看清真正值得关注的访问。这是"降噪",不是"上锁"。
2. 只认密钥,不认密码
密码是可以被猜的,密钥不能(在你没泄漏私钥的前提下)。改完端口,把密码登录关掉:
sudo tee /etc/ssh/sshd_config.d/20-auth.conf >/dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
EOF
sudo sshd -t && sudo systemctl reload sshd
先确认自己的公钥已经写进 ~/.ssh/authorized_keys 并且能免密登录,再关密码,顺序反了就把自己锁外面了。
如果还要更严一点,加一行 AllowUsers 你的用户名,只允许指定账户登录,其他账户连尝试的机会都没有。
3. 真锁死了怎么办
提前记住自己云厂商的救援入口:控制台 VNC、串口登录、救援模式、快照回滚。在动手改 SSH 之前先确认这条路能用,比出事之后再找客服快得多。
四、fail2ban:让敲门的人付出代价
改端口 + 密钥能挡掉大部分,但日志里还是会有人试。fail2ban 干的事很简单:盯着日志,同一个 IP 短时间内失败次数超阈值,就直接在防火墙上封掉一段时间。
安装:
sudo apt install fail2ban # Debian / Ubuntu
sudo dnf install fail2ban # RHEL / Alma / Rocky / Fedora
不要改 jail.conf(升级会被覆盖),新建 /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1d
findtime = 10m
maxretry = 3
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.0.0/16
# 屡犯递增:1d → 2d → 4d …最多 4 周
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 4w
[sshd]
enabled = true
port = 22222
backend = systemd
几个参数的含义,别抄完不知道在干嘛:
| 参数 | 作用 |
|---|---|
maxretry | 失败几次开始封 |
findtime | 多长时间内的失败才计数 |
bantime | 封多久 |
ignoreip | 白名单,永远不封 |
bantime.increment | 屡犯时间翻倍,专治反复试的 |
ignoreip 一定要写自己的组网网段和内网网段。 我见过最冤的情况不是被攻击,是自己手滑输错几次密码,把自己家整个网段封了,然后以为服务器挂了。
启动并验证:
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
输出里能直接看到当前封了哪些 IP、总共封过多少。想看它是不是真生效,故意用错密码登一次,再回来看列表——别只看配置文件写对了就认为它在工作。
最后必须说清楚它的边界:fail2ban 只防"猜密码"这一种行为。 它防不了应用层漏洞、防不了 0day、也拦不住端口扫描本身。它是补丁,不是铠甲。
五、真正的降维:管理面根本不要对公网开
前面都是"把门锁好"。但更彻底的做法是——这扇门根本不该开在临街。
想清楚一件事:你的服务器上,哪些服务是必须给陌生人访问的?
通常只有一个:网站(80/443)。剩下的 SSH、面板、数据库、监控、NAS 管理页、下载器 WebUI,全都是只给你自己看的。
那它们为什么要暴露在公网上?
组网方案怎么选
把管理面塞进一个虚拟局域网,你人在外面也能访问,但公网扫不到。常见四种:
| 方案 | 特点 | 适合谁 |
|---|---|---|
| WireGuard | 内核级、轻、快,配置全手动 | 愿意折腾、追求性能 |
| Tailscale | 基于 WireGuard,登录即用,打洞成功率高 | 想省事的人 |
| ZeroTier | 二层网络,像插了根网线 | 需要广播/组播的场景 |
| EasyTier | 国内网络友好,去中心化 | 家宽/多机房互联 |
选哪个都行,思路是一样的:先组网,再让服务只监听组网地址。
三种落地姿势
姿势 A:服务只绑内网地址
# 只监听组网网卡的地址
listen 10.10.10.1:8080;
姿势 B:端口还在,但只有组网能进
# firewalld
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.10.10.0/24 port port=8080 protocol=tcp accept'
sudo firewall-cmd --reload
# ufw
sudo ufw allow from 10.10.10.0/24 to any port 8080
姿势 C:连 SSH 都只走组网
把公网 SSH 端口直接关掉,只在组网内开。安全性最高,代价是没有组网就进不去,所以必须保留一个应急入口(云控制台 VNC / 救援模式 / 独立带 2FA 的跳板)。
面板类服务,正确姿势长这样
宝塔、x-ui、phpMyAdmin、Portainer 这类东西,默认就是"给公网看的",这是历史遗留设计。正确做法:
1. 监听地址改成 127.0.0.1
2. 外面套一层 Nginx,只监听组网地址
3. 能开 2FA 就开,能改默认路径就改
4. 定期看它的更新公告——面板类组件是漏洞高发区,因为它本身就跑在最高权限上
组网也不是万能钥匙:节点私钥等于你家钥匙,别到处发;控制台账号必须开两步验证;离职/换设备记得踢掉节点。
六、容器和数据库:新手最容易"自己开门"
这是这几年最常见的事故来源,因为一行配置就决定了全世界能不能连。
# 错的:映射到所有网卡,公网可达
ports:
- "3306:3306"
# 对的:只给本机
ports:
- "127.0.0.1:3306:3306"
docker run -p 3306:3306 和 -p 127.0.0.1:3306:3306 的区别,就是"拖库"和"没事"的区别。
几个经典剧本,几乎每年都在重演:
- Redis 未授权:默认无密码 + 公网可达 → 攻击者写入你的
authorized_keys,或直接写 crontab 挖矿 - Docker API 2375:不用登录就能起容器 → 挂载宿主机根目录 → 直接 root
- 数据库默认口令:
root/root、admin/admin,扫描器字典里排前几 - 对象存储/MinIO 匿名读写:数据被人当免费网盘
原则:一个 compose 里,只有反向代理需要对外,其他服务全部走内部网络。 需要调试时临时开,调完立刻关。
七、还有几件小事,成本低、收益高
- 自动安全更新:
unattended-upgrades(Debian 系)或dnf-automatic(RHEL 系),只装安全补丁,别整天手动apt upgrade - 弱口令清理:路由器、NAS、摄像头、打印机——Mirai 这类僵尸网络到今天还在扫这些
- 两步验证:面板、云账号、GitHub,能开就开,成本一分钟
- 日志和告警:
journalctl -u sshd、lastb看失败登录;再挂个 uptime 监控,机器被关机/重装你能第一时间知道 - 备份:3-2-1 原则(3 份、2 种介质、1 份异地)。勒索软件第一个找的就是"唯一那份备份"
- 最小权限:日常用普通用户 +
sudo,别什么都 root;容器别随便--privileged
八、照着做的一张清单
不用一次全做完,按顺序来,一周能搞定:
| 检查项 | 目标状态 | 怎么验证 | ||
|---|---|---|---|---|
| 公网端口 | 只留业务必需 | ss -tulpn + 外部 nmap | ||
| SSH 端口 | 已改,非 22 | `sshd -T | grep -i port` | |
| SSH 认证 | 仅密钥,禁 root 密码 | `sshd -T | grep -Ei 'passwordauth | permitrootlogin'` |
| 防火墙 | 默认拒绝,按需放行 | firewall-cmd --list-all | ||
| fail2ban | 运行中且有白名单 | fail2ban-client status sshd | ||
| 管理面 | 仅组网可达 | 公网 curl 应超时 | ||
| 数据库/缓存 | 只绑 127.0.0.1 | `ss -lntp | grep 3306` | |
| 系统更新 | 自动装安全补丁 | unattended-upgrade --dry-run | ||
| 备份 | 有异机副本,且真能恢复 | 实际恢复一次 |
收尾
安全这件事,最反直觉的地方在于:它主要不是"装什么",而是"关什么"。
装十个防护软件,不如关掉一个不该开的端口。因为每一个暴露在公网的服务,都是一份要长期维护的责任:要跟版本、要看公告、要防配置漂移。少开一个,就少一份负债。
被扫描是常态,不用慌,全世界每台机器都在被扫。真正该怕的是那种"开了三年、自己都忘了、还跑着老版本"的门。
从今天开始,打开 ss -tulpn,从上往下问自己一句:这个,真的需要让全世界看见吗?
💖 打赏支持
如果这篇文章帮到了你,欢迎打赏支持
微信扫一扫,赞赏支持
发表回复