👁 11

新手安全入门:端口收敛与组网访问

开场:现在从”漏洞公开”到”有人来打你”,可能只有几个小时

以前折腾服务器,大家对安全的印象是”离我很远”——我又不是什么大公司,谁闲着没事攻击我?

这个想法在 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 / 5432MySQL / PostgreSQL弱口令爆破、拖库
6379Redis未授权写入 SSH 公钥、植入挖矿
27017MongoDB历史未授权重灾区
9200Elasticsearch数据裸奔、被勒索
2375 / 2376Docker API等同于把 root 交出去
8080 / 8888 / 9000各类面板、管理后台默认口令、历史漏洞
6443Kubernetes 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,全都是只给你自己看的。

那它们为什么要暴露在公网上?

公网 边界 你的内网 / 组网 任何人 扫描器 / 爬虫 只放行业务端口 例如 443 / 业务 API 组网隧道 WireGuard / Tailscale SSH · 面板 · 数据库 · NAS 管理页 只监听 127.0.0.1 或组网地址 ✗ 管理口直接暴露公网 公网扫不到,人才进得来;少开一个口,就少一份长期负债

组网方案怎么选

把管理面塞进一个虚拟局域网,你人在外面也能访问,但公网扫不到。常见四种:

方案特点适合谁
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 'passwordauthpermitrootlogin'`
防火墙默认拒绝,按需放行firewall-cmd --list-all
fail2ban运行中且有白名单fail2ban-client status sshd
管理面仅组网可达公网 curl 应超时
数据库/缓存只绑 127.0.0.1`ss -lntp grep 3306`
系统更新自动装安全补丁unattended-upgrade --dry-run
备份有异机副本,且真能恢复实际恢复一次

收尾

安全这件事,最反直觉的地方在于:它主要不是"装什么",而是"关什么"。

装十个防护软件,不如关掉一个不该开的端口。因为每一个暴露在公网的服务,都是一份要长期维护的责任:要跟版本、要看公告、要防配置漂移。少开一个,就少一份负债。

被扫描是常态,不用慌,全世界每台机器都在被扫。真正该怕的是那种"开了三年、自己都忘了、还跑着老版本"的门。

从今天开始,打开 ss -tulpn,从上往下问自己一句:这个,真的需要让全世界看见吗?