端口号参考表

按用途分组的常见服务默认端口,标清 TCP / UDP 和是否容易撞端口。公共 DNS 服务器地址单独列在最后,那是 IP 不是端口,别混着填。

显示 74 / 74 条|全部 74 条里,有 26 条属于常见冲突项

使用说明

表里列的是各服务的默认端口,也就是「照官方文档装完不动配置」时的样子。默认端口的价值在于排查方便——看到 3306 就知道多半是 MySQL、看到 6379 多半是 Redis;但生产环境里把它们照搬到公网是很危险的。改默认端口只能降低被自动扫描撞上的概率,全端口扫描几分钟就能扫完,改端口改变的只是「被顺手扫到」和「被认真扫到」的区别。真正决定安全的是认证、授权和网络边界:服务有没有设强密码、有没有做最小权限、安全组有没有只放行必要来源。

有几个端口值得单独点名。6379 的 Redis、27017 的 MongoDB、9200 的 Elasticsearch,在很多部署里默认不设认证或者认证很弱,只要监听地址是 0.0.0.0 且安全组放行,就等于把数据直接给了公网:Redis 未授权可以写文件,接着写 SSH 公钥或计划任务拿到 shell;MongoDB 和 Elasticsearch 未授权会被整库拖走或加密勒索,这类事故几乎每年都在发生。2375 更特殊,它是未加密的 Docker API,连上就能起一个挂载了主机根目录的容器,等于跳过所有认证直接接管主机;需要远程操作 Docker 时应该用 2376 配双向证书,而且仍然只开在内网。相比之下,把数据库和缓存绑到 127.0.0.1、只让本机的应用连,比改端口有用得多。

连不上时按四层排查最省时间:第一层看服务有没有真的在监听,用 ss -lntp 看地址和端口;第二层看监听地址是不是 127.0.0.1,如果只监听本机,外部怎么放行都没用;第三层看本机防火墙(firewalld、ufw、iptables);第四层看云主机的安全组和网络 ACL。四层都通了还不通,再考虑运营商封端口,家宽的 25、80、443 经常被封。另外绑定 1024 以下的端口需要 root 或 CAP_NET_BIND_SERVICE 能力,容器里还被内核参数限制,所以开发服务不要直接绑 80,让反向代理去接低端口更省事。

端口冲突大多出在开发环境。Grafana 和大量 Node 脚手架都用 3000,Python 自带的 http.server 和旧版 Docker Registry 都用 5000,PHP-FPM、MinIO、ClickHouse 抢 9000,Hadoop YARN 和别的服务又都爱用 8088。给项目留一个环境变量覆盖端口的口子,比事后挨个改配置文件快得多;要给本地服务挑一个不容易撞的号,可以用随机端口生成避开这份表里的默认值。部署到云上之前,先确认安全组只放行了真正要对外的那几个端口,用子网划分计算把内网段规划清楚,再照着Docker 命令速查把容器的端口映射写明白。

最后说清公共 DNS 那一栏为什么要和端口分开。8.8.8.8、1.1.1.1 这些是解析服务器的 IP,填在系统或路由器的 DNS 设置里表示「用谁家来解析」;而端口是查 DNS 时用的传输通道:最基础的查询走 UDP 53,响应过长或做区域传送时切到 TCP 53,DoT 把查询包在 TLS 里固定走 853,DoH 把查询伪装成普通 HTTPS 请求走 443。三者的区别是「怎么问」:普通 DNS 明文可被窥探和篡改,DoT 和 DoH 都做了加密,DoH 因为走 443,在只放行 443 的网络里也能用。把 IP 和端口写成一栏,就等于把「找谁问」和「怎么问」混成了一件事。

常见问题

把默认端口改掉,能提高安全性吗?

只能降低被自动扫描撞上的概率,不算安全措施。全端口扫描几分钟就能跑完,改端口只是把「顺手被扫到」变成「被认真扫到」,攻击者一旦连上,该没密码还是没密码。真正起作用的是认证、授权和网络边界:绑内网地址、安全组只放行必要来源、给服务设强密码和最小权限。改端口可以做,但要当成「减少噪音」,不是「上了道锁」。

为什么说 6379、27017、9200、2375 这几个端口最危险?

因为对应的服务在很多部署里默认不设认证或认证很弱。Redis 未授权时可以写文件,进而写 SSH 公钥或计划任务拿到 shell;MongoDB 和 Elasticsearch 未授权会被整库拖走或加密勒索;2375 是未加密的 Docker API,连上就能起一个挂载主机根目录的容器,等于直接接管主机。它们的共同点是:只要监听在 0.0.0.0 且安全组放行,就等于把数据和控制权交给公网。

监听 127.0.0.1 和监听 0.0.0.0 有什么区别?

127.0.0.1 只接受本机发起的连接,外网和同内网的其他机器都连不上;0.0.0.0 表示在所有网卡上监听,能不能被连到就只剩防火墙和安全组这一道防线了。数据库、缓存、管理界面这类没有跨机需求的服务,一律绑 127.0.0.1 或具体的内网地址,这一步比改端口有用得多。

两个服务端口撞了,报 address already in use,怎么查?

先用 ss -lntp(或 lsof -i :端口)看是谁占着,再决定改哪一边。脚手架默认端口尤其容易撞:Grafana 和大量 Node 项目都用 3000,Python 自带的 http.server 和旧版 Docker Registry 都用 5000,PHP-FPM、MinIO、ClickHouse 抢 9000。所以项目一开始就把端口写成环境变量,留出覆盖的口子,比事后挨个改配置省事。

绑定 1024 以下的端口为什么直接报权限错误?

因为 0 到 1023 是特权端口,Linux 上绑定它需要 root 或 CAP_NET_BIND_SERVICE 能力,容器里还常被内核参数 net.ipv4.ip_unprivileged_port_start 拦着。用开发服务器直接绑 80 报错是正常的,标准做法是让服务跑在高位端口,前面放一个反向代理接 80 和 443,而不是给服务加 root。

端口开着,外面就是连不上,该按什么顺序排查?

按四层查:服务有没有真的在监听(ss -lntp 看地址和端口);监听地址是不是 127.0.0.1(只监听本机时外部必然连不上);本机防火墙(firewalld、ufw、iptables)有没有放行;云主机的安全组和网络 ACL 有没有放行。如果四层都通了还不行,再考虑运营商封端口——家宽的 25、80、443 经常被封,公司网络的出口也可能做了限制。

表里协议写成 TCP/UDP 是什么意思?

表示这个服务在两种传输层协议上都可能监听。DNS 最典型:普通查询走 UDP 53,响应过长或做区域传送时切到 TCP 53;NFS 和 Memcached 也是两种都支持。排查时如果只放行了 TCP,就容易出现「部分请求正常、部分请求卡住」的怪现象,这时候记得把 UDP 也放行。

公共 DNS 那一栏为什么没有端口号?

因为 8.8.8.8、1.1.1.1 这些是解析服务器的 IP 地址,不是端口。你在系统或路由器里填的是「用谁家来解析」;端口是查 DNS 时的传输通道:普通查询走 53,DoT 走 853,DoH 走 443。把 IP 和端口写在一栏里,等于把「找谁问」和「怎么问」混成一件事了。

相关:随机端口生成Docker 命令速查子网划分计算