ss -uln 是查 udp 监听端口最稳的命令,必须同时带 -u(udp)、-l(listen 状态)、-n(禁 dns 解析)三个参数,缺一不可;sudo 权限才能看到 systemd socket 激活的服务如 53 端口,unconn 状态可忽略,grep :53 需用 \b:53\b 或 awk '$4~/:53$/’ 避免误匹配。

ss -uln 是查 UDP 监听端口最稳的命令
直接运行 sudo ss -uln,就能列出当前系统所有处于 LISTEN 状态的 UDP 套接字。它不依赖额外包、默认预装、响应快,且能看见 systemd socket 激活的服务(比如 systemd-resolved 的 53 端口)。
必须带齐三个参数:-u(只查 UDP)、-l(只显示 LISTEN)、-n(禁 DNS 解析,避免卡顿或漏行)。缺一不可——比如只跑 ss -un,看到的是已收包的连接(如 DNS 回复),不是监听态。
常见错误现象:
- 执行
ss -un却没输出 LISTEN 行:缺-l,它根本不会显示监听态 - 输出里有大量
UNCONN状态:那是未绑定的 UDP socket(如 avahi-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:53\b'(\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+ 等新发行版默认不带 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),但语义清晰,适合人工快速扫读。
看到 LISTEN 就代表端口真在监听?注意 UDP 的特殊性
UDP 是无连接协议,严格来说没有“LISTEN”状态——Linux 内核为兼容语义,把绑定并调用 recvfrom() 的 UDP socket 标记为 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,或在宿主机上查











