AlmaLinux 查看外部暴露端口|ss 命令实践
背景
在服务器运维中,经常需要确认哪些端口正在监听,并且区分是仅本地可访问还是已暴露给外部网络。AlmaLinux 系统默认使用 ss 命令替代传统的 netstat,它更轻量、输出更规范。本文记录如何用 ss 准确筛选出对外监听的端口,并配合防火墙规则判断真正的“暴露”状态。
基础命令:查看所有监听端口
ss -tuln 是最常用的组合,列出所有 TCP/UDP 监听端口,并以数字形式显示地址和端口号,避免 DNS 解析延迟。
sudo ss -tuln输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:631 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*0.0.0.0:端口或[::]:端口表示绑定到所有网络接口(包括外网 IP)。127.0.0.1:端口或[::1]:端口表示仅绑定到本地环回,外部无法直接访问。
过滤出外部可访问的监听端口
要排除本地环回地址,可以使用 awk 或 grep -v 进行过滤。
方法一:使用 awk 保留表头
sudo ss -tuln | awk 'NR==1 || ($5 !~ /^127\.0\.0\.1:/ && $5 !~ /^\[::1\]:/)'NR==1保留第一行表头。$5是本地地址列,正则匹配排除127.0.0.1:和[::1]:。
方法二:使用 grep -v 取反(简洁)
sudo ss -tuln | grep -v "127.0.0.1:" | grep -v "\[::1\]:" | grep LISTEN这样只显示处于 LISTEN 状态且非环回的条目。
输出解读
过滤后可能看到:
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*这些端口确实监听在所有接口上,但并不等于外部一定能访问,还需要检查防火墙。
区分“监听”与“防火墙开放”
ss 展示的是服务进程层面的监听状态,而外部流量能否抵达,取决于防火墙(如 firewalld)或云平台安全组规则。
查看 firewalld 放行的端口
sudo firewall-cmd --list-all重点关注 ports: 部分:
ports: 80/tcp 443/tcp 22/tcp只有既在 ss 中监听,又在防火墙放行列表中的端口,才是真正对外暴露的。
补充:查看特定端口是否可访问
可以结合 grep 快速检查:
sudo ss -tuln | grep :80若返回结果,说明 80 端口在监听;再通过 firewall-cmd --list-ports 确认是否开放。
常见误区
- 误区一:
ss显示0.0.0.0:3306就认为所有人都能连。实际上如果防火墙没放行 3306,外部连接会超时或被拒绝。 - 误区二:只检查
ss而忽略防火墙,导致排查网络问题方向错误。 - 误区三:混淆
127.0.0.1与0.0.0.0,前者仅本机可访问,后者才是对外监听。
实用组合命令
一次性输出外部监听端口及其对应的进程信息(需 sudo):
sudo ss -tlnp | awk 'NR==1 || ($5 !~ /^127\.0\.0\.1:/ && $5 !~ /^\[::1\]:/)'添加 -p 可显示进程名和 PID,便于定位服务。
结论
- 使用
ss -tuln查看所有监听端口。 - 通过
awk或grep排除127.0.0.1和::1,得到对外绑定的端口列表。 - 结合
firewall-cmd --list-all确认防火墙放行情况,两者缺一不可,才能准确判断端口是否真正暴露给外部。
这套方法适用于任何基于 Linux 的发行版(CentOS、RHEL、AlmaLinux 等),是运维排障的基础技能。
