端口分几段?哪些可以随便用?
IANA 把 65536 个端口分三段:(1) 0–1023 系统端口(Well-Known),需 root 才能 bind,由 IANA 严格分配;(2) 1024–49151 用户端口(Registered),开发者可向 IANA 申请正式登记,本表大部分中间端口都属此段;(3) 49152–65535 动态端口(Ephemeral / Private),操作系统给客户端连接随机分配。自己开服务:避开常用号(本表收录的)和 0–1023(除非你要绑 80/443),从 49152 以上挑或用 6 位以上的 8443 / 9090 / 51820 等惯例号即可。
同一个端口号 TCP 和 UDP 算两个端口吗?算。TCP/53 和 UDP/53 是两套独立监听,可以由不同进程持有。本表中标 TCP+UDP 的(如 53、5060、3478)表示该协议两边都用,需要同时开放。最常见的细节坑:DNS 默认走 UDP/53,但响应超过 512 字节(DNSSEC、大记录)会自动 fallback 到 TCP/53——只放行 UDP/53 会出现"有时不通"的诡异故障。
「公网高危」是什么意思?真有那么严重?真有。本表打 ⚠ 标记的端口都对应过历史性大事件:(1) MongoDB 27017 默认无认证 + 暴露公网 → 2017–2020 间数万实例被勒索,索要比特币;(2) Redis 6379 同上 → 大量服务器被植入挖矿木马(CONFIG SET dir + RDB 写入 ~/.ssh/authorized_keys 是经典姿势);(3) Docker 2375 明文 API → 等于公开 root,被攻陷分钟级;(4) Memcached UDP 11211 → 2018 年 GitHub 被反射放大打到 1.35 Tbps。操作建议:所有数据库 / 中间件端口默认 bind 到内网,对外通过应用层访问;公有云直接关安全组比配 iptables 安全。
80 和 443 一定要走标准端口吗?不强制,但偏离会有副作用。技术上你可以让 nginx 监听 8080 / 4443,浏览器访问 :8080 / https://example.com:4443 也能通。但你会丢掉:(1) 不带端口的 URL 美感(https://example.com/ 这种);(2) 某些防火墙 / 公司代理的白名单(很多企业网络只放行 80/443 出方向);(3) HSTS preload 等浏览器预置策略的便利。实操:对外公网服务一律 80→443;需要绕开 ISP 限制的小流量服务可以用 8443,但准备好被部分用户吐槽。
我 telnet ip port 通了就代表服务好了吗?只代表 TCP 三次握手成功——端口在监听、防火墙放行、对方进程接收了 SYN。不代表:(1) 服务能正确响应业务协议(telnet 80 通了,但后端可能正在崩溃返回 502);(2) UDP 服务可达(telnet 不能测 UDP,要用 nc -u -v);(3) 性能 / 延迟可接受。正确分层验证:tcp 通 → 协议握手通(curl / mysql / redis-cli)→ 业务逻辑通(实际发个请求看返回)。测 UDP 可达:端口扫描器(nmap -sU)经常假通假断,最准的还是直接发协议包看回应。
容器把端口映射到宿主机后,外面还连不上?最常见的三个坑:(1) 容器内服务 bind 到 127.0.0.1——只有容器内能访问,docker -p 映射不到。改成 0.0.0.0 或 ::;(2) docker -p 80:80 实际是宿主 0.0.0.0 暴露——会绕过 ufw / firewalld 防火墙规则(docker 直接改 iptables FORWARD 链)。要限制可绑 127.0.0.1:80:80;(3) 云安全组未放行——容器层和操作系统层都通了,但云控制台的安全组没改。三层独立配置,缺一个都不通。
同号冲突的端口(9000、9090、9093 等)实际怎么共存?只能选其一。本表中你会看到 9000 同时是 ClickHouse Native / Flask / SonarQube;9090 同时是 Prometheus / Cortex;9093 同时是 Kafka TLS / Alertmanager。这些不是规范冲突,而是各社区习惯——一台机器上同号服务只能跑一个。运维实操:(1) 单机部署多个相关组件时,给每个改非默认端口(如 Prometheus 8090、Alertmanager 9093);(2) 容器化时通过 -p 映射隔离,容器内仍用默认端口;(3) 文档里固定写出"我们用 X:Y"避免下个人猜测。
怎么查我本机哪个进程占用了某端口?Linux/macOS:lsof -i :3000 或 ss -tlnp \| grep :3000(需 sudo 看到进程名)。Windows:netstat -ano \| findstr :3000,拿到 PID 后 tasklist /FI "PID eq 1234" 查进程名。杀掉:kill -9 <PID>(Linux)/ taskkill /F /PID 1234(Windows)。生产环境慎用 -9——优雅关闭信号是 SIGTERM(15),大部分服务会清理资源;-9 是 SIGKILL,进程没机会写完盘上数据。