IP 端口范围是多少?0–65535 的三段划分与常用端口
端口号是 TCP、UDP 报文头里的 16 位字段,所以 IP 端口范围是 0–65535,共 65536 个。IANA 把它分成三段:0–1023 知名端口、1024–49151 注册端口、49152–65535 动态端口。端口 0 保留不用,TCP 和 UDP 的同号端口互不相干;查本机监听用 ss 或 netstat,查远程端口用 nc、telnet 或 Test-NetConnection。
IP 端口范围是 0–65535。端口号写在 TCP 和 UDP 的报文头里,字段长度 16 位,2¹⁶ = 65536,所以最小是 0、最大是 65535。严格地说端口属于传输层,IP 报文头里并没有端口,“IP 端口”是把“IP 地址 + 端口”连在一起说的习惯叫法。IANA 按 RFC 6335 把这 65536 个号分成三段:0–1023 知名端口(也叫系统端口),1024–49151 注册端口(用户端口),49152–65535 动态端口(私有端口)。下面先讲三段的区别和几个容易误解的地方,再给常用端口表,最后是查本机端口和测远程端口的命令。
三段端口有什么区别
| 范围 | 名称 | 怎么分配 | 实际用途 |
|---|---|---|---|
| 0–1023 | 知名端口(System Ports) | 须经 IETF 审核或 IESG 批准,由 IANA 分配 | SSH 22、HTTP 80、HTTPS 443 等基础服务;Linux 上普通用户默认不能监听 |
| 1024–49151 | 注册端口(User Ports) | 厂商或项目向 IANA 申请登记 | MySQL 3306、RDP 3389、Redis 6379 等应用;登记不等于独占,任何程序都能用 |
| 49152–65535 | 动态端口(Dynamic/Private Ports) | IANA 不分配 | 客户端发起连接时,由系统临时分配作源端口 |
几个常被问到的细节:
- 端口 0 是保留号,不作为服务端口使用。程序调用 bind 时把端口写成 0,意思是“让系统随便给一个空闲端口”,并不是真的用了 0 号端口。
- TCP 和 UDP 各有一套 0–65535。TCP 53 和 UDP 53 是两个不同的端口,防火墙要分别放行;DNS 两个都用,NTP 只用 UDP 123。
- ICMP 没有端口。ping 用的是 ICMP,所以“ping 得通”和“端口通不通”没有必然关系:服务器禁 ping 时端口照样可能是通的,ping 得通的机器端口也可能被防火墙拦着。
- 低于 1024 的端口在 Linux 上需要特权。普通用户启动的程序监听 80 端口会报 Permission denied,要用 root 启动、给程序加
CAP_NET_BIND_SERVICE能力,或者调低net.ipv4.ip_unprivileged_port_start(内核 4.11 起提供,默认值 1024)。Windows 没有这条限制。 - 同一个 IP 上,同一协议的同一端口同一时间只能被一个程序监听,特意开启端口复用的情况除外。服务器有多个 IP 时,可以在不同 IP 上分别监听同一个端口;程序监听在 0.0.0.0,表示占用本机所有 IPv4 地址上的这个端口。
系统实际用的临时端口范围
RFC 6335 建议用 49152–65535 作临时端口,但各系统的默认值并不一样:
| 系统 | 默认临时端口范围 | 查看命令 |
|---|---|---|
| Linux | 32768–60999 | sysctl net.ipv4.ip_local_port_range |
| Windows Vista、Windows Server 2008 及以后的版本 | 49152–65535 | netsh int ipv4 show dynamicport tcp |
Linux 的默认范围有一大半(32768–49151)落在注册端口段里,会带来一个实际问题:如果你把某个服务配在 40000 端口,它重启的那一刻,这个端口可能正被某个对外连接临时占用,服务就会启动失败,而且只是偶尔出现,很难复现。解决办法是把服务端口加入保留列表,系统分配临时端口时会跳过它们(以 root 执行):
sysctl net.ipv4.ip_local_port_range # 查看,默认是 32768 到 60999
sysctl -w net.ipv4.ip_local_reserved_ports=40000-40010 # 立即生效
echo 'net.ipv4.ip_local_reserved_ports = 40000-40010' > /etc/sysctl.d/90-reserved-ports.conf # 重启后保持
netsh int ipv4 show dynamicport tcp # Windows:显示 TCP 临时端口的起点和数量
临时端口范围也决定了无状态 ACL 怎么写。机房边界的 ACL 不跟踪连接状态时,服务器主动访问外部(例如下载系统更新)的回包,目的端口落在这段临时端口里,规则里要放行,否则会出现“对外提供的服务正常,服务器自己却上不了网”。Linux 和 Windows 服务器混在同一个网段时,两种默认范围合起来是 32768–65535,按这个区间放行回包。
常用端口号一览
下表是各服务的默认端口。服务都可以改端口,所以“某个端口开着”不代表一定是这个服务,以实际监听的进程为准。
| 端口 | 协议 | 服务 | 说明 |
|---|---|---|---|
| 20、21 | TCP | FTP | 21 是控制连接,20 是主动模式的数据连接;被动模式的数据连接用服务器指定的高位端口 |
| 22 | TCP | SSH、SFTP、SCP | Linux 和网络设备的远程登录 |
| 23 | TCP | Telnet | 明文传输,交换机上建议关闭 |
| 25 | TCP | SMTP | 邮件服务器之间投递,不少云平台默认封禁出方向的 25 端口 |
| 53 | TCP、UDP | DNS | 普通查询走 UDP,区域传送和较大的响应走 TCP |
| 67、68 | UDP | DHCP | 67 是服务端,68 是客户端,PXE 装机也要用 |
| 69 | UDP | TFTP | PXE 装机、网络设备配置备份 |
| 80 | TCP | HTTP | 网页 |
| 110、995 | TCP | POP3、POP3S | 收信 |
| 123 | UDP | NTP | 时间同步 |
| 143、993 | TCP | IMAP、IMAPS | 收信 |
| 161、162 | UDP | SNMP | 161 接收查询,162 接收 Trap |
| 179 | TCP | BGP | 路由器之间的 BGP 会话 |
| 443 | TCP、UDP | HTTPS | UDP 443 用于 HTTP/3(QUIC) |
| 445 | TCP | SMB | Windows 文件共享,不要对公网开放 |
| 465、587 | TCP | SMTP 提交 | 邮件客户端发信,465 为隐式 TLS |
| 514 | UDP | Syslog | 设备日志 |
| 623 | UDP | IPMI | BMC 带外管理 |
| 873 | TCP | rsync | 文件同步 |
| 1433 | TCP | SQL Server | 数据库 |
| 1521 | TCP | Oracle | 数据库 |
| 2049 | TCP、UDP | NFS | 网络文件系统 |
| 3306 | TCP | MySQL、MariaDB | 数据库 |
| 3389 | TCP | RDP | Windows 远程桌面 |
| 5432 | TCP | PostgreSQL | 数据库 |
| 5900 | TCP | VNC | 第二个显示是 5901,依此类推 |
| 6379 | TCP | Redis | 默认不设密码,只应在内网监听 |
| 8080、8443 | TCP | 备用 HTTP、HTTPS | 常见于 Java 应用和各类管理后台 |
| 9100 | TCP | node_exporter | Prometheus 采集主机指标 |
| 10050、10051 | TCP | Zabbix | 10050 是 agent,10051 是 server |
| 27017 | TCP | MongoDB | 数据库 |
看到一个陌生端口号,想知道它一般对应什么服务,可以查本机的服务名数据库。Linux 用 getent services 3306,输出 mysql 3306/tcp;Windows 的同名文件在 C:\Windows\System32\drivers\etc\services。这只是“约定俗成用这个号”的列表,不代表本机真的开着这个服务。
查本机在监听哪些端口
Linux 上一条命令列出所有 TCP、UDP 监听端口和对应进程,用 root 执行才能看到全部进程名:
ss -tulnp
看 Local Address:Port 这一列就能判断端口对谁开放:0.0.0.0:22 和 [::]:22 表示本机所有地址都在监听,防火墙放行时外部就能连;127.0.0.1:6379 只接受本机连接,外部永远连不上;10.40.66.12:6789 只在这一个地址上监听,从服务器的其他 IP 进来是连不上的。
Windows 有三种查法:
netstat -ano | findstr LISTENING
Get-NetTCPConnection -State Listen | Sort-Object LocalPort | Select-Object LocalAddress, LocalPort, OwningProcess
Get-NetUDPEndpoint | Sort-Object LocalPort | Select-Object LocalAddress, LocalPort, OwningProcess
netstat -ano 的最后一列和 PowerShell 输出里的 OwningProcess 都是进程号,再用 Get-Process -Id 进程号 或 tasklist /FI "PID eq 进程号" 查出是哪个程序。UDP 没有“监听”状态,所以第一条命令只列出 TCP,UDP 要用第三条看。
查远程 IP 的端口通不通
测 TCP 端口,Linux 和 Windows 各有顺手的工具:
nc -zv -w 3 203.0.113.10 443 # -z 只测能否建立连接,-w 3 最多等 3 秒
timeout 3 bash -c '</dev/tcp/203.0.113.10/443' && echo open || echo closed # 没装 nc 时用 bash 自带的功能
telnet 203.0.113.10 443
Test-NetConnection 203.0.113.10 -Port 443 # 看结果里 TcpTestSucceeded 是 True 还是 False
nc 有 OpenBSD 版、传统版和 Nmap 附带的 ncat 等几种实现,提示文字略有不同,判读方法一样。Windows 默认不带 telnet 客户端,需要在“启用或关闭 Windows 功能”里勾选,所以优先用 Test-NetConnection。
结果怎么读,关键是分清“立刻被拒绝”和“等了很久超时”:
| 现象 | 含义 | 下一步 |
|---|---|---|
| 成功:nc 显示 succeeded 或 Connected,telnet 显示 Connected to,TcpTestSucceeded 为 True | 三次握手完成,端口上有程序在监听 | 网络层没问题,排查应用本身 |
| 立刻失败:Connection refused | 包到达了目标主机,但端口上没有程序监听,或者防火墙用拒绝(REJECT)方式回了 RST 或 ICMP 端口不可达 | 在服务器上用 ss 或 netstat 看服务是否在运行、监听在哪个地址 |
| 等待后超时:timed out,telnet 一直停在 Trying | 包在路上被丢弃:安全组或防火墙用丢弃(DROP)方式拦截,或者主机不在线、路由不通 | 从近到远查:服务器防火墙、安全组或机房 ACL、中间链路 |
| 连上后马上断开 | 端口在监听,但应用主动关闭了连接,常见于来源 IP 不在白名单、连接数已满。nc -z 和 Test-NetConnection 遇到这种情况也显示成功,要用 telnet 或不加 -z 的 nc 连上去才看得出来 |
查服务自身的访问控制和日志 |
UDP 没有握手,nc -zvu 发出去没有回应,既可能是端口开着但应用不回包,也可能是被防火墙丢了,结论不可靠;只有收到 ICMP 端口不可达,才能确定端口没开。测 UDP 服务要用应用自己的请求:DNS 用 dig @203.0.113.53 example.com,SNMP 用 snmpget -v2c -c 团体名 203.0.113.20 SNMPv2-MIB::sysUpTime.0,IPMI 用 ipmitool -I lanplus -H 地址 -U 用户 -P 密码 mc info,收到正常应答才算通。
查一个 IP 开放了哪些端口
想知道一台服务器对外暴露了哪些端口,用 nmap 从外部扫一遍,比登录上去看监听列表更接近攻击者看到的样子,因为它把防火墙和安全组的效果也算进去了:
nmap -Pn 203.0.113.10 # 默认扫最常用的 1000 个 TCP 端口
nmap -Pn -p- 203.0.113.10 # 扫全部 1–65535
sudo nmap -Pn -sU -p 53,123,161,623 203.0.113.10 # UDP 慢,只扫指定端口,需要 root
-Pn 表示不先探测主机是否在线,适合禁 ping 的服务器。结果里的 open 是有程序在监听,closed 是能到达但没有程序监听,filtered 是被防火墙丢弃、无法判断,UDP 常见的 open|filtered 表示没有收到任何回应。只扫描自己管理或已获授权的地址:对别人的服务器做端口扫描,可能违反服务商的使用条款和相关法规。
IP 端口和交换机端口不是一回事
在机房里,“开端口”“关端口”至少有三种意思,工单里说不清楚很容易做错:
| 说法 | 指的是 | 在哪里操作 |
|---|---|---|
| TCP/UDP 端口,如 3389 | 逻辑编号,标识服务器上的某个服务 | 系统防火墙、安全组、机房 ACL |
| 交换机端口,如 GigabitEthernet0/0/12 | 交换机面板上的物理网口 | 交换机上开启、关闭,修改 VLAN 和限速 |
| BMC 管理口 | 服务器上专门接 BMC 的物理网口,BMC 自己再监听 UDP 623、TCP 443 等端口 | 管理网交换机,BMC 的网络和服务设置 |
欠费停机、被攻击时临时断网,关的通常是交换机物理端口。Toplink DCIM 的交换机管理按厂商指令集远程开关端口、修改 VLAN、设置进出方向的限速,不用逐台登录交换机敲命令。BMC 那一侧的 623、443 和控制台端口,也不必对每个运维人员的电脑放行:部署在各机房的从节点接入管理网、就近连接 BMC,运维人员只访问 DCIM 后台,在浏览器里打开 IPMI 远程管理的控制台即可。
常见问题
端口号能超过 65535 吗?
不能。端口字段只有 16 位,65535 是最大值。配置文件或防火墙规则里出现 65536 以上的数字,要么会被拒绝,要么是填错了,应当改正。
一台服务器最多能有多少个连接,是不是受 65535 限制?
不是。一个连接由协议、源 IP、源端口、目的 IP、目的端口五项共同确定,服务端监听一个端口就能接受来自不同客户端的大量连接,上限取决于内存和文件描述符。受端口数限制的是主动向外连接的一方:从同一个源 IP 连同一个目标 IP 和端口时,可用的源端口数就是临时端口范围的大小。
自己的服务应该用哪个端口?
从 1024–49151 里挑一个不和常用服务冲突的。在 Linux 上还要避开 32768–60999 这段临时端口范围,或者用 net.ipv4.ip_local_reserved_ports 把它保留下来,否则服务重启时可能碰上端口正被某个对外连接临时占用。