生产环境排查异常监听端口需从服务归属、暴露面、业务依赖三层入手:先用ss -tulnpe确认真实监听状态,识别0.0.0.0绑定等高危配置;再结合服务类型与安全策略分级处置——优先改bind地址为127.0.0.1,其次停非关键服务并禁自启,最后用防火墙兜底;清理后须通过定时巡检和开机服务审查防复发。

生产环境排查异常监听端口,核心不是“看到谁在听”,而是快速判断“该不该听、谁让它听、能不能安全不让它听”。不建议直接 kill 或封端口,得从服务归属、暴露面、业务依赖三层入手。
一、先摸清真实监听情况,避开容器和假象
用 ss -tulnpe(比 netstat 更快更准)查全量监听,重点关注:
- Local Address 是 0.0.0.0:x 或 :::x:表示对公网/全网开放,必须确认是否有业务强需求
- State 是 LISTEN 且 Program name 显示 - 或无法解析:大概率是用户态脚本、恶意进程或未注册服务
- PID 对应 UID 非预期:比如普通用户进程监听 80/443,或 root 进程路径在 /tmp/ 或 /dev/shm/ 下
再交叉验证是否被容器占用:docker ps --format "{{.Names}} {{.Ports}}" | grep :端口。若存在,说明宿主机上没占,别关错地方。
二、识别高危端口要结合服务+配置+暴露面
以下端口本身不危险,但一旦配置失当就是突破口:
- 22/tcp:SSH 必须保留,但需检查 sshd_config 中 PermitRootLogin no、PasswordAuthentication no、ListenAddress 是否限制为内网IP
- 6379/tcp:Redis 若显示 bind 0.0.0.0 且 requirepass 为空,立刻停服务并改配置 bind 127.0.0.1
- 3306/27017:MySQL 或 MongoDB 监听 0.0.0.0 + 无密码/弱密码 = 数据裸奔,优先改 bind-address,其次加防火墙白名单
- 21/23/139/445:FTP、Telnet、Samba —— 生产环境原则上禁用,直接卸载包比关服务更彻底
验证是否真对外暴露:nc -zv 公网IP 端口(从跳板机或外网测),别只信 localhost 能通。
三、一键关闭≠粗暴杀进程,分三级操作
按安全优先级执行,避免误伤业务:
-
改配置(首选):编辑服务文件,把 bind 地址从 0.0.0.0 改为 127.0.0.1,然后 systemctl restart 服务名。例如:
• Redis → /etc/redis/redis.conf 中设 bind 127.0.0.1
• MySQL → /etc/mysql/my.cnf 中设 bind-address = 127.0.0.1 -
停服务+禁自启(次选):确认非关键服务后执行:
systemctl stop vsftpd && systemctl disable vsftpd && systemctl mask vsftpd
mask 可防被其他服务意外拉起 -
防火墙兜底(最后防线):仅限临时应急或无法改配置时使用:
Ubuntu:ufw deny 23/tcp && ufw reload
CentOS:firewall-cmd --permanent --remove-port=23/tcp && firewall-cmd --reload
注意:云服务器必须同步更新安全组规则
四、关完还要防复发
一次清理不能一劳永逸,需固化检查机制:
- 查开机自启服务:systemctl list-unit-files --type=service | grep enabled | grep -E "(ftp|telnet|rpcbind|samba)"
- 查可疑定时任务:crontab -l && sudo crontab -l | grep -E "(sh$|bash$|\/tmp|\/dev\/shm)"
- 每月自动巡检脚本示例(可加入 cron):
ss -tuln | awk '$4 ~ /:21$|:23$|:111$|:6379$|:27017$/ {print $0}' | tee /var/log/port-scan-$(date +%F).log










