如何查看linux 端口
- Linux
- 2025-08-17
- 5
使用
netstat -tuln
或
ss -tuln
查看所有监听端口;
lsof -i :PORT
可查特定端口进程;
ufw status
查看防火墙开放
在Linux系统中,查看端口状态是日常运维和故障排查的核心技能之一,以下从基础原理、主流工具、实战场景、高级技巧四个维度进行系统性解析,并提供完整操作指南与典型问题解决方案。
核心概念梳理
端口分类体系
类型 | 范围 | 特点 | 典型应用 |
---|---|---|---|
Well-Known | 0~1023 | 需特权权限启动 | HTTP(80), SSH(22) |
Registered | 1024~49151 | 用户级应用程序注册使用 | MySQL(3306), Tomcat(8080) |
Dynamic | 49152~65535 | 临时分配给客户端连接 | ephemeral ports |
关键关联要素
- 协议类型:TCP(可靠传输)/ UDP(快速无连接)
- 监听状态:LISTEN(持续接收新连接)/ ESTABLISHED(已建立连接)
- 进程绑定:通过PID可定位到具体运行的服务进程
主流检测工具详解
1. ss
命令(推荐)
新一代Socket统计工具,性能优于传统netstat
,支持更丰富的过滤选项。
基础用法:
# 查看所有TCP/UDP端口及对应进程 ss -tulnp # 仅显示监听中的TCP端口 ss -ltn 'sport = :[0-9]' # 按进程名筛选(如查找nginx) ss -tulnp | grep nginx
输出字段解析:
| 列名 | 含义 | 示例值 |
|————|———————————-|———————-|
| Recv-Q | 接收队列长度 | 0 |
| Send-Q | 发送队列长度 | 0 |
| Local Address | 本机地址:端口 | 192.168.1.100:80 |
| State | 连接状态 | LISTEN/ESTABLISHED |
| Process ID | 关联进程ID | 1234 |
| User | 进程所有者 | root/www-data |
| PID/Program name | 进程ID+程序名 | 1234/nginx |
2. netstat
命令(兼容性方案)
传统网络统计工具,多数系统仍预装。
常用组合:
# 显示所有监听端口 netstat -tuln | grep LISTEN # 查看特定端口占用情况(如3306) netstat -tunap | grep 3306
3. lsof
命令(进程级追踪)
通过文件描述符反向追踪端口占用。
典型场景:
# 查找占用8080端口的进程详情 lsof -i :8080 # 递归显示进程树(解决多进程嵌套问题) lsof -i :8080 -R
4. nmap
命令(安全扫描)
网络探测工具,可用于本地端口扫描。
轻量级扫描:
# 快速扫描全端口(需root权限) nmap -sTUP -O localhost # 精确检测单个端口状态 nmap -p 3306 --packet-trace localhost
进阶操作技巧
1. 动态端口监控
# 实时刷新端口变化(每2秒更新) watch -n 2 'ss -tulnp' # 结合日志分析异常连接 journalctl -u <service_name> --since "5 minutes ago" | grep connection
2. 防火墙联动验证
防火墙类型 | 查看规则命令 | 添加放行规则示例 |
---|---|---|
firewalld (RHEL) | firewall-cmd –list-all | firewall-cmd –add-port=8080/tcp –permanent |
ufw (Debian/Ubtu) | ufw status numbered | ufw allow 8080/tcp |
iptables | iptables -L -nv | iptables -A INPUT -p tcp –dport 8080 -j ACCEPT |
3. 容器环境特殊处理
# Docker容器内端口映射检查 docker ps | grep <container_id> # 进入容器内部查看真实端口 docker exec -it <container_id> ss -tulnp
常见错误应对策略
现象 | 可能原因 | 解决方案 |
---|---|---|
端口未监听但服务已启动 | 配置错误/权限不足 | systemctl status
|
端口被僵尸进程占用 | 未正常终止的旧进程 | kill -9
|
防火墙拦截合法请求 | 规则缺失/策略冲突 | iptables/firewalld规则校验 |
远程无法访问本地端口 | SELinux限制/网络分区 | semanage port -a; ifconfig br0 up |
相关问答FAQs
Q1: 为什么执行ss -tulnp
看不到某些已知服务的端口?
A: 可能原因包括:①服务未实际启动(仅自启动项存在);②使用非标准端口;③被超级守护进程托管(如systemd scope),建议依次执行以下命令排查:
systemctl list-unit-files | grep <service_name> # 确认服务单元存在 systemctl status <service_name> # 检查运行状态 ps aux | grep <service_executable> # 直接搜索进程
Q2: 如何永久禁用某个无用端口?
A: 根据服务类型选择合适方式:
- 停止服务:
systemctl stop <service> && systemctl disable <service>
- 防火墙封禁:
firewall-cmd --remove-port=<port>/<protocol> --permanent
- 修改配置文件:编辑
/etc/services
删除端口映射(谨慎操作) - SELinux策略:
semanage port -d -t http_port_t -p <port>
通过上述方法组合使用,可全面掌握Linux系统端口状态,实际工作中建议优先使用ss
命令获取实时数据,配合lsof
定位进程,最终通过systemctl
或防火墙规则进行管控,对于复杂场景,建议结合tcpdump
抓包分析和auditd
审计日志进行