随机端口生成器

在任意范围内生成随机 TCP 或 UDP 端口号,自动跳过知名服务和常被占用的端口,避免本地服务冲突。

一个你机器上别人多半不会来抢的端口号。 选择需要多少个端口以及抽取的范围。默认会跳过知名服务所占用的端口,因此得到的号码不太可能与已在运行的程序冲突。

挑一个不会冲突的端口号

端口空间是怎么划分的

TCP 或 UDP 端口是一个 16 位数字,可用范围为 0 到 65535。IANA 把这个空间分成三段。0 到 1023 是系统端口或知名端口,保留给 HTTP 的 80、SSH 的 22 等标准服务;在类 Unix 系统上绑定其中之一通常需要 root 权限或显式的 capability。1024 到 49151 是注册端口,按申请分配给特定应用,PostgreSQL 的 5432 和 MySQL 的 3306 就在这一段。49152 到 65535 是动态端口或临时端口范围,保留给客户端的临时分配。

对本地开发服务而言,最合适的位置是 1024 以上的注册端口段,既避开特权段也避开临时端口段。这正是本生成器把下界默认设为 1024 的原因。保持在 49152 以下比听上去更重要:每当程序发起对外连接时,操作系统都会从临时端口范围中取号,因此停放在那里的服务重启后可能发现端口已被占用。

跳过知名端口为什么有用

仅靠随机并不能避免冲突。一次随机抽取完全可能落在 3306、5432、6379 或 8080 上,而在一台正常工作的开发机上,这些恰恰是最可能已被占用的号码。这里使用的跳过列表覆盖了经典 Unix 服务、常见数据库与消息中间件,以及流行框架的默认端口,例如 Node 工具链的 3000 和本地 HTTP 服务器的 8000、8080。

跳过它们的代价几乎为零——候选池里仍有数万个号码——却能消除「端口已被占用」这类报错最常见的来源。如果你确实想要其中某个号码,关闭该选项即可恢复完整范围。

请注意这只是概率上的辅助,而不是预留。本工具无法检查你的机器,也就无从得知是否有程序正在监听。要确认端口确实空闲,请在本地检查:macOS 或 Linux 用 lsof -i :端口,较新的 Linux 用 ss -ltnp,Windows 用 netstat -ano | findstr :端口

容器与 CI 中的端口

容器和 CI 环境会改变这套算法。容器内部的端口空间通常是私有的,因此两个容器可以同时监听 8080 而互不冲突;冲突风险转移到宿主机一侧,那里发布出来的端口共享同一个命名空间。随机选一个宿主端口并映射到固定的容器端口,是并排运行同一服务多个副本的常见做法。

许多 CI 系统和编排工具用另一种方式解决问题:直接向内核要一个空闲端口——绑定到端口 0,操作系统会分配一个未被使用的端口并告诉你选中了哪个。这种方式没有竞态且永远正确,因此当你的程序可以在运行时被告知端口时应优先采用。而像这里生成的固定号码,则适合在任何程序启动之前,需要把一个稳定值写进配置文件、docker-compose 映射或团队文档的场景。

开源说明:使用原生 JavaScript 实现,不依赖第三方库。

常见问题

为什么范围默认从 1024 开始?
在类 Unix 系统上 1024 以下属于特权端口,绑定通常需要 root。从 1024 开始可以保证结果对普通用户账号也可用。
应该避开 49152 以上的端口吗?
对长期运行的服务通常应该避开。那一段是操作系统分配临时客户端端口的区域,停放在那里的服务重启后可能发现号码已被占用。
这个工具会检查端口是否真的空闲吗?
不会。页面完全在浏览器中运行,无法检查你的系统。确定号码之前请用 `lsof -i :端口`、`ss -ltnp` 或 `netstat -ano | findstr :端口` 验证。
跳过选项排除了哪些端口?
包括经典 Unix 服务,MySQL、PostgreSQL、Redis、RabbitMQ、MongoDB、Elasticsearch 等常见数据库与中间件,以及 3000、8000、8080、8443 这类流行框架默认端口。
随机性是密码学安全的吗?
浏览器提供 Web Crypto API 时会优先使用,并采用拒绝采样保证分布均匀;只有在 Crypto 不可用时才回退到 Math.random。
TCP 端口和 UDP 端口有什么区别?
它们是两个各含 65536 项的独立空间,因此 TCP 8080 与 UDP 8080 互不相干,可以被不同程序同时使用。本工具生成的号码对两者都适用。