端口:该开放哪些以及如何检查
典型服务需要哪些端口,如何查看机器正在监听什么,如何检查外部可达性,以及端口关闭时该怎么办。
更新于 2026年8月23日
端口是一个数字,它告诉系统应该由哪个服务来接收传入的连接。规则很简单:只开放您实际使用的端口。每一个额外开放的端口,都是别人用来试探弱点的另一扇门。
常见端口号
| 端口 | 服务 | 是否对外开放 |
|---|---|---|
| 22 | SSH | 是,最好按地址限制 |
| 80 | HTTP | 是,如果您有网站 |
| 443 | HTTPS | 是,如果您有网站 |
| 25、465、587 | 邮件 | 入站——仅当您自己运行邮件服务器时。出站在我们这边是关闭的,可按需申请开放 |
| 3306 | MySQL | 否,仅本地 |
| 5432 | PostgreSQL | 否,仅本地 |
| 6379 | Redis | 否,仅本地 |
| 27017 | MongoDB | 否,仅本地 |
| 25565 | Minecraft | 是,如果是游戏服务器 |
关于邮件的一点说明:入站连接不受限制,而出站连接在 25、465 和 587 端口上在节点层面是关闭的,直到您要求我们开放。机器内部的规则无法改变这一点——详情请参阅邮件服务器:为什么难,以及需要考虑什么。
数据库几乎从不对外暴露。如果您需要从工作电脑访问,正确的方式是 SSH 隧道,而不是开放端口:
ssh -L 5432:127.0.0.1:5432 artem@<address>
机器正在监听什么
ss -tulpn
ss -tlpn | grep 443
lsof -i -P -n | grep LISTEN
请看端口号前面的地址。127.0.0.1:5432 表示该服务只能从内部访问——无论您添加多少条规则,都无法从外部访问。0.0.0.0:5432 表示该服务在所有网络接口上开放,必须用防火墙加以保护。
从外部检查
在您的电脑上:
nc -vz <address> 443
curl -I http://<address>
用 ping 检查没有意义:ICMP 和 TCP 是两回事;端口可以正常工作而 ping 被屏蔽,反之亦然。
端口已关闭:分步排查
- 服务在运行吗?
systemctl status <service> - 它监听的是正确的地址吗?
ss -tulpn——不是127.0.0.1 - 防火墙允许它吗?
ufw status verbose或nft list ruleset - Docker 在干扰吗?已发布的容器端口会绕过 ufw
- 查看服务日志:
journalctl -u <service> -n 50
顺序很重要:大多数情况下问题出在第二步,而不是防火墙。
更改服务端口
例如,迁移 SSH:
sed -i "s/^#\?Port 22/Port 2222/" /etc/ssh/sshd_config
ufw allow 2222/tcp
sshd -t
systemctl restart ssh
请先在另一个窗口中确认能用新端口登录,然后再删除 22 端口的规则。详情请参阅 SSH 加固。
常见错误
| 现象 | 原因 | 解决方法 |
|---|---|---|
Connection refused | 服务未运行 | systemctl status,查看日志 |
Connection timed out | 数据包被防火墙丢弃 | 检查规则 |
| 本地可用,外部不可用 | 绑定到 127.0.0.1 | 在配置中更改地址 |
Address already in use | 端口被另一个服务占用 | ss -tulpn 并停止多余的服务 |
只有在确认是什么在响应端口之后,才开放该端口。旧实验遗留的端口是黑客入侵的典型入口;请参阅被入侵的迹象。