当前位置:首页 > Linux > 正文

如何查看linux 端口

使用 netstat -tulnss -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命令(进程级追踪)

通过文件描述符反向追踪端口占用。

典型场景:

如何查看linux 端口  第1张

# 查找占用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审计日志进行

0