在Linux系统中,确认主机当前开放了哪些端口号是运维排查和网络配置的基础操作。端口是否处于监听状态,直接决定了外部能否通过该端口访问对应服务。除了防火墙策略之外,真正决定端口可用性的还是应用程序是否在对应地址上完成了bind和listen。

使用netstat命令查看监听端口
netstat是一个经典的网络统计工具,虽然在部分新发行版中被标记为弃用,但多数服务器仍可使用。它通过读取/proc/net下的信息来展示套接字状态。查看开放端口时,我们主要关注处于LISTEN状态的本地地址和端口。
常用命令为netstat -tulnp,其中-t表示tcp,-u表示udp,-l表示仅显示监听套接字,-n表示以数字形式显示地址和端口,-p表示显示进程信息。如果不加-n,端口可能显示为服务名如http而非80,不利于精确核对。
# 查看所有监听中的tcp和udp端口及对应进程 netstat -tulnp # 示例输出片段 # Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name # tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd # tcp6 0 0 :::80 :::* LISTEN 5678/nginx # udp 0 0 127.0.0.1:53 0.0.0.0:* 2345/dnsmasq
从输出可以看到,tcp的22和80端口分别在IPv4和IPv6上监听,udp的53仅绑定本地回环。若某服务配置为监听127.0.0.1:3306,则外部网络无法连接,这种端口虽开放但不对外可见。
netstat的缺点在于当连接数极大时,遍历socket信息较慢,且部分最小化安装的容器镜像未包含该命令。此时应优先考虑下面的ss命令。
使用ss命令高效查看端口
ss(socket statistics)来自iproute2套件,直接通过netlink接口向内核获取套接字信息,速度远快于netstat。它的参数设计与netstat类似,便于迁移使用习惯。
执行ss -tulnp即可得到与netstat结构相近的监听列表。此外,ss支持更灵活的过滤表达式,例如ss -tlnp 'sport = :80'可只看80端口的tcp监听。对于排查特定端口被谁占用非常高效。
# 查看tcp监听端口,数字显示并带进程 ss -tlnp # 仅查看udp监听 ss -uln # 过滤特定端口 ss -tlnp sport eq :443
在输出中,Local Address:Port列显示绑定地址,如0.0.0.0:22表示所有网卡均可访问,127.0.0.1:6379表示仅本机。State列对监听套接字显示为LISTEN,而udp无状态故为空。
相比netstat,ss还能展示更多内核级指标如拥塞控制、重传超时等,但在单纯查看开放端口场景下,其速度和默认可用性更具优势,推荐作为首选。
使用lsof从进程反查端口
lsof全称list open files,在Linux中一切皆文件,网络连接也以文件描述符存在。因此lsof能列出某进程打开了哪些网络端口,适合已知服务名但不确定其端口的场景。
命令lsof -iTCP -sTCP:LISTEN -Pn可列出所有处于监听的tcp端口,-P避免端口转服务名,-n避免主机名解析。也可针对进程查,如lsof -p 5678看nginx开了哪些端口。
# 列出所有监听的tcp端口 lsof -iTCP -sTCP:LISTEN -Pn # 查看指定pid打开的网络端口 lsof -p 5678 -i # 示例输出 # COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME # sshd 1234 root 3u IPv4 12345 0t0 TCP *:22 (LISTEN) # nginx 5678 root 6u IPv6 23456 0t0 TCP *:80 (LISTEN)
lsof的输出以进程为中心,能直接看到 COMMAND 和 PID,对定位陌生端口背后的程序很有帮助。例如发现某随机高端口监听,用lsof可立刻知道是否为恶意进程。
不过lsof需要足够权限,普通用户可能看不到其他用户的进程端口,通常需配合sudo使用。且在大负载下lsof遍历开销也不小,仅建议针对性排查时采用。
端口状态与防火墙的关系
通过上述命令看到端口处于LISTEN,仅代表服务在本机已开放监听,不代表外部一定能连通。中间可能经过iptables、nftables或云安全组拦截。因此需要分层确认。
可用iptables -L -n或nft list ruleset查看过滤规则,若某端口被DROP则外部不可达。另外,使用ss -tunp看到的是内核套接字层,而防火墙在更前置的netfilter钩子上起作用,二者互补而非替代。
# 查看iptables过滤规则(需root) iptables -L -n -v # 查看nftables规则 nft list ruleset
实践中有这样的情况:netstat显示0.0.0.0:3306 LISTEN,但远程连不上,最后发现是云厂商安全组未放行3306。因此排查连通性时,应先用本文命令确认监听,再用网络工具如telnet或nc从外部验证,最后查防火墙。
总结来说,Linux查看开放端口并非单一命令能全覆盖,netstat适合习惯兼容,ss适合高效首选,lsof适合进程关联。理解监听地址含义和防火墙层级,才能准确回答端口到底开没开。