端口扫描本身非攻击但暴露端口是高危起点;最常误开的是22、3306、5432、6379、27017及80/443外web端口;自查用ss/netstat命令查监听ip,重点识别0.0.0.0绑定;修复需限定bind_addr、加固防火墙与云安全组、容器限制本地转发,并建立日常巡检习惯。

Linux服务器端口扫描本身不是攻击,但它是发现暴露端口的第一步;真正风险在于那些本不该对外开放、却因配置疏忽而监听在0.0.0.0或公网IP上的服务端口。
哪些端口最常被误开?
以下端口在生产环境中高频出现暴露问题,尤其当管理员未限制监听地址时:
- 22(SSH):默认允许密码登录、未启用fail2ban、未改默认端口,极易被暴力破解
- 3306(MySQL)、5432(PostgreSQL):数据库直接暴露公网,可被枚举账号、爆破弱口令甚至远程执行(如MySQL UDF提权)
- 6379(Redis):无认证且监听外网时,攻击者可写入SSH公钥、反弹shell或加密勒索
- 27017(MongoDB):老版本默认无认证,可未授权访问全部数据
- 80/443以外的Web端口(如8080、8888、9000):常用于测试环境或管理后台,易被扫描发现并绕过主站防护
如何快速自查端口暴露情况?
无需第三方工具,在服务器本地执行几条命令即可定位风险:
-
ss -tuln | grep ':.*:'— 查看所有监听端口及绑定IP(重点关注0.0.0.0和公网IP) -
ss -tuln | grep '0.0.0.0:'— 筛出监听在任意地址的端口(高危信号) -
netstat -tulnp 2>/dev/null | grep -v '127.0.0.1\|::1'— 排除仅本地监听的服务 - 从公网视角验证:
curl -s http://myip.ipip.net获取本机公网IP,再用另一台机器运行nmap -sS -p- your_public_ip模拟外部扫描
暴露端口的典型成因与修复建议
问题往往不出在“开了什么服务”,而出在“怎么开的”:
-
服务配置未限定bind_addr:如Nginx默认不监听、但某些一键脚本把
listen 80;写成listen 0.0.0.0:80;;Redis配置中bind 127.0.0.1被注释或删掉 → 应显式指定bind 127.0.0.1,禁用protected-mode no -
防火墙未生效或策略宽松:UFW默认禁用、firewalld zone设为public且未限制端口 → 启用后只放行必需端口,例如:
ufw allow OpenSSH && ufw enable - 云平台安全组覆盖本地防火墙:即使iptables禁止了3306,若阿里云/腾讯云安全组开放了该端口,仍等同于暴露 → 必须同步收紧云平台网络ACL
-
容器或Docker暴露过度:运行容器时用了
-p 3306:3306却没加--network=host限制或前置反向代理 → 改用-p 127.0.0.1:3306:3306仅限本地转发
日常运维中的轻量级防护习惯
不依赖复杂设备,靠几个小动作就能大幅降低被盯上的概率:
- 新装服务后第一件事:查
ss -tuln,确认监听地址是否符合预期 - 将
ss -tuln | grep '0.0.0.0:'加入每日巡检脚本,有输出即告警 - 对非必要管理端口(如phpMyAdmin、Adminer、Portainer),统一走Nginx反代+基础认证+IP白名单
- 定期用
ps aux | grep -E '(redis|mysql|postgres|mongod)'核对进程启动参数,防止被恶意修改配置重启










