ss -uln 基本就是排查 UDP 监听端口时最可靠的一条命令,三个参数通常需要一起使用:-u 表示只查看 UDP,-l 表示仅显示 LISTEN 状态,-n 则用于关闭 DNS 解析,这三项少了任何一个都不够完整;另外,如果想看到像 53 端口这类由 systemd socket 激活的服务,通常还需要配合 sudo 权限,否则结果可能不完整。至于 UNCONN 状态,一般可以先忽略;如果要用 grep :53 过滤,最好写成 \b:53\b,或者直接使用 awk '$4~/:53$/',这样才能避免误匹配。

ss -uln 是查看 UDP 监听端口最稳妥的命令
直接执行 sudo ss -uln,就可以列出当前 Linux 系统中所有处于 LISTEN 状态的 UDP 套接字。它不依赖额外安装的软件包,通常默认预装,执行速度快,而且还能看到由 systemd socket 激活的服务,例如 systemd-resolved 使用的 53 端口。
这三个参数需要同时带上:-u(只查看 UDP)、-l(仅显示 LISTEN)、-n(关闭 DNS 解析,避免卡顿、延迟或输出不完整)。缺少任何一个都会影响结果准确性——例如只运行 ss -un,看到的往往是已经收发过数据包的连接信息(如 DNS 响应),而不是 UDP 监听端口。
常见错误现象:
- 执行
ss -un却看不到 LISTEN 行:这是因为缺少-l,命令本身不会显示监听状态 - 输出里出现大量
UNCONN状态:这通常是未连接或未真正对外提供监听的 UDP socket(如 a vahi-daemon、chronyd),不一定是真正需要关注的监听端口,可先忽略 - 普通用户执行时看不到某些端口:例如
systemd-resolved的127.0.0.1:53,通常需要加上sudo才能完整查看
grep :53 容易误匹配 5353?建议使用更精确的过滤方式
如果要检查某个 UDP 端口是否正在监听,比如 DNS 常见的 53 端口,不建议直接使用 ss -uln | grep :53——因为它可能同时匹配到 :53 和 :5353,从而造成误判。
推荐两种更安全、更准确的写法:
- 使用单词边界:
ss -uln | grep 'b:53b'(b用于匹配端口边界) - 锚定列位置:UDP 监听结果中的端口通常位于 Local Address 列末尾,使用
awk '$4 ~ /:53$/ {print}'更可靠 - 如果只是想判断该端口是否存在监听,可以使用
ss -uln | awk '$1=="udp" && $4~/:53$/ {exit 0} END{exit 1}',这样在脚本里可直接根据退出码判断结果
netstat -uln 依然可以使用,但通常需要先安装 net-tools
如果你更习惯使用 netstat,那么执行 sudo netstat -uln 也能达到类似效果,参数含义同样一致:-u 表示仅查看 UDP、-l 表示筛选 LISTEN、-n 表示关闭名称解析。
不过在 Ubuntu 22.04+、Fedora 36+ 等较新的 Linux 发行版中,默认通常不再预装 net-tools,直接运行时可能会报错:bash: netstat: command not found。
补装方法:
- Debian/Ubuntu:
sudo apt install net-tools - RHEL/CentOS/Fedora:
sudo dnf install net-tools或sudo yum install net-tools
安装完成后再执行 netstat -uln,虽然输出字段名称相对更传统、也略显冗长(例如写 Proto 而不是 State),但整体语义直观,依然适合人工快速查看 UDP 端口监听情况。
看到 LISTEN 就代表端口真的在监听?要注意 UDP 的特殊性
UDP 本身属于无连接协议,从严格意义上来说,并不存在像 TCP 那样标准的“LISTEN”状态。之所以在 Linux 内核输出中会看到这个标记,更多是出于语义兼容:当某个 UDP socket 完成 bind(),并进入 recvfrom() 的接收准备状态后,内核就可能把它显示为 LISTEN。换句话说,看到 udp LISTEN,只能说明对应进程已经调用了 bind(),并做好了接收数据包的准备;但这并不意味着它此时一定正在实际处理请求。
容易被忽略的点:
ss -uln显示的0.0.0.0:123可能是 ntpd 或 chronyd 正在监听;但如果防火墙已经 DROP 了 UDP 123,外部主机依然无法访问该端口- 有些服务(例如 DHCP 客户端)会短暂绑定
0.0.0.0:68,此时ss -uln的输出可能一闪而过,通常需要配合watch -n1 'ss -uln'持续观察 - 在容器内部无法直接看到宿主机正在监听的 UDP 端口,除非进入 host network namespace,或者直接在宿主机上执行查询
