一、常用端口对照
| 端口 | 服务 |
|---|---|
| 22 | SSH |
| 21 | FTP |
| 25 / 465 / 587 | SMTP(发信) |
| 53 | DNS |
| 80 / 443 | HTTP / HTTPS |
| 3306 | MySQL |
| 5432 | PostgreSQL |
| 6379 | Redis |
| 27017 | MongoDB |
| 9200 / 9300 | Elasticsearch |
| 5672 / 15672 | RabbitMQ(服务 / 管理台) |
| 8080 / 8000 / 3000 | 常见应用端口 |
| 11211 | Memcached |
0–1023 是系统端口,普通用户绑定需要 root 或 CAP_NET_BIND_SERVICE;1024–49151 是注册端口;49152 以上是动态端口。
二、查看谁占了端口
# Linux(推荐 ss,比 netstat 快)
ss -lntp | grep 8080
lsof -i :8080
# macOS
lsof -nP -iTCP:8080 -sTCP:LISTEN
# Windows
netstat -ano | findstr :8080
tasklist | findstr <PID>
输出里关注三件事:监听地址、进程 PID、进程名。ss 的 -p 需要 root 才能看到别人的进程。
三、127.0.0.1 与 0.0.0.0 的区别
这是「本地能访问、外网不行」的头号原因:
| 监听地址 | 含义 |
|---|---|
127.0.0.1:8080 | 只接受本机回环连接 |
0.0.0.0:8080 | 接受所有网卡的连接 |
[::]:8080 | IPv6 全部地址(通常也包含 IPv4) |
203.0.113.10:8080 | 只监听该网卡 |
开发时为了安全常绑 127.0.0.1,部署到服务器忘了改,外部自然连不上。Nginx、Node、Python 的 --host 参数都有类似的默认值差异,部署时显式指定。
四、端口不通的排查顺序
从内到外,逐层验证:
- 进程在不在:
ps aux | grep 服务名。 - 有没有监听:
ss -lntp | grep 端口,看监听地址。 - 本机能不能连:
curl -v http://127.0.0.1:端口/,telnet 127.0.0.1 端口。 - 本机内网 IP 能不能连:
curl http://内网IP:端口/(排除只绑回环)。 - 防火墙:
iptables -L -n、firewall-cmd --list-all、ufw status。 - 云安全组:控制台里入方向规则是否放行该端口(这是最容易被忘的一层)。
- 外层设备:SLB/负载均衡的健康检查、WAF 拦截。
- DNS/域名:确认解析到的是这台机器。
telnet 或 nc -zv host port 能快速判断「TCP 层通不通」。curl 报 Connection refused 说明端口没监听或被拒绝;Connection timed out 多半是防火墙/安全组丢弃。
五、端口冲突怎么办
# 找到占用进程并确认是什么
lsof -i :8080
# 正常停止
kill <PID>
# 不响应再强制
kill -9 <PID>
kill -9 会跳过清理逻辑,可能留下锁文件或未落盘数据,优先用 kill(SIGTERM)让进程优雅退出。
换端口是最简单的规避方式,但要注意:改完记得同步 Nginx 反代配置、防火墙规则、监控探针。
六、安全建议
- 数据库、Redis、MongoDB 不要暴露公网,只监听内网或
127.0.0.1。 - SSH 改端口只能减少扫描噪音,真正的防护是禁密码 + 禁 root + fail2ban。
- 对外只开 80/443,其余通过跳板机或 VPN 访问。
- 定期检查监听列表:
ss -lntup,看有没有意料之外的服务。
七、快速核对
不确定某个端口对应什么服务,用 端口对照查询;确认域名解析到的 IP 是否正确用 域名/IP 检测;判断两台机器是否同网段用 CIDR 计算。
小结
ss -lntp 看监听,lsof -i :端口 看占用;127.0.0.1 只允许本机,对外要用 0.0.0.0;排查按「进程 → 监听 → 本机连通 → 防火墙 → 安全组」逐层验证。