Linux中网络管理与端口排查常用命令总结
在后端开发中,我们经常会遇到各种网络问题。例如,Spring Boot 项目启动失败,提示端口已经被占用;服务明明启动成功,但是浏览器无法访问;本地可以访问接口,其他机器却无法访问。
这些问题通常都与 Linux 网络配置、网络连通性和端口管理有关。
这一篇主要讲解 Linux 中常用的网络管理和端口排查命令,包括 ping、curl、ss、lsof、netstat 等,并结合 Spring Boot 项目部署场景,演示如何定位网络问题。

1. Linux 网络基础知识
在学习网络排查命令之前,我们先了解几个基本概念。
IP 地址: 用于标识网络中的设备,例如 192.168.1.100,可以理解为设备在网络中的地址。
端口(Port): 用于标识设备上具体的网络服务或应用程序。例如,Spring Boot 项目默认可能使用 8080 端口,MySQL 通常使用 3306 端口。
协议(Protocol): 规定网络设备之间如何进行通信。常见的有 TCP 和 UDP。
网卡(Network Interface): 计算机连接网络的接口,例如 eth0、ens33 等。
DNS: 域名系统,负责将域名解析为 IP 地址。例如,将 www.baidu.com 解析为对应的 IP 地址。
这里需要特别理解 IP 地址和端口之间的关系:
- IP 地址用于定位网络中的设备。
- 端口用于定位设备上的网络服务。
- TCP 和 UDP 则规定了数据如何传输。
例如,当我们访问 http://192.168.1.100:8080 时,实际上就是通过 IP 地址找到服务器,再通过 8080 端口访问对应的服务。
2. ping:测试网络连通性
ping 是 Linux 中最常用的网络排查命令之一,主要用于测试目标主机是否能够通过 ICMP 协议进行通信。
例如:
# 测试与百度服务器的网络连通性 ping www.baidu.com # 只发送 4 个数据包 ping -c 4 www.baidu.com # 设置发送间隔为 2 秒 ping -i 2 www.baidu.com # 设置超时时间 ping -W 2 www.baidu.com
执行后可能看到类似结果:
PING www.baidu.com (220.181.38.148) 56(84) bytes of data. 64 bytes from 220.181.38.148: icmp_seq=1 ttl=54 time=12.3 ms 64 bytes from 220.181.38.148: icmp_seq=2 ttl=54 time=11.9 ms --- www.baidu.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss
这里几个字段的含义:
| 字段 | 含义 |
|---|---|
icmp_seq | 数据包序号 |
ttl | 生存时间,表示数据包允许经过的最大路由跳数 |
time | 数据包往返时间 |
packet loss | 数据包丢失率 |
例如,time=12.3 ms 表示这次 ICMP 请求的往返时间约为 12.3 毫秒。
ping 有什么作用?
假设我们的 Spring Boot 服务无法访问,可以先通过 ping 测试服务器是否能够与目标设备进行基本的网络通信。
ping 192.168.1.100
如果能够收到响应,说明 ICMP 通信正常。
如果无法收到响应,也不一定代表目标服务器宕机,因为有些服务器或防火墙会禁止 ICMP 请求。
另外,ping 只能测试网络连通性,不能直接判断某个 TCP 端口是否开放。
3. curl:测试 HTTP 接口
curl 是一个非常常用的网络请求工具,可以通过命令行发送 HTTP、HTTPS 等请求。
对于后端开发来说,curl 尤其重要,因为我们可以直接在 Linux 服务器上测试接口是否正常。
3.1 发送 GET 请求
# 访问百度 curl https://www.baidu.com # 访问本地 Spring Boot 服务 curl http://localhost:8080
3.2 查看 HTTP 响应头
curl -I http://localhost:8080
-I 表示只获取响应头,可以快速查看 HTTP 状态码等信息。
例如:
HTTP/1.1 200 Content-Type: application/json
常见 HTTP 状态码:
| 状态码 | 含义 |
|---|---|
| 200 | 请求成功 |
| 301 | 永久重定向 |
| 302 | 临时重定向 |
| 400 | 请求参数错误 |
| 401 | 未认证 |
| 403 | 服务器拒绝访问 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
3.3 发送 POST 请求
在开发中,我们经常需要测试 POST 接口。
例如,Spring Boot 提供了一个用户创建接口:
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"zhangsan","age":20}' \
http://localhost:8080/user
这里:
-X POST:指定请求方法为 POST。-H:设置 HTTP 请求头。-d:指定请求体数据。
3.4 查看详细请求信息
如果请求失败,可以使用 -v 查看详细的请求和响应过程:
curl -v http://localhost:8080
这样可以帮助我们排查 DNS 解析、TCP 连接、TLS 握手以及 HTTP 请求等环节的问题。
4. ss、lsof、netstat:查看端口占用
在 Linux 中,服务启动时通常需要监听一个端口。
例如,Spring Boot 默认可能监听 8080 端口。
如果这个端口已经被其他程序占用,再启动一个使用相同 IP 和端口组合的服务,就可能出现端口绑定失败的问题。
常见报错:
Web server failed to start. Port 8080 was already in use.
这时就需要找到究竟是哪个进程占用了端口。
4.1 ss:查看网络连接和监听端口
ss(Socket Statistics)用于查看系统中的网络连接、Socket 状态和监听端口,是目前 Linux 中推荐使用的网络排查工具。
# 查看所有 TCP 和 UDP Socket ss -a # 查看 TCP 连接 ss -t # 查看 UDP 连接 ss -u # 查看监听状态的 TCP 端口 ss -lnt # 查看监听端口及对应进程 sudo ss -lntp # 查看所有 TCP 和 UDP 监听端口及对应进程 sudo ss -tulnp
常用选项:
| 选项 | 含义 |
|---|---|
-t | 显示 TCP Socket |
-u | 显示 UDP Socket |
-l | 只显示监听状态的 Socket |
-n | 以数字形式显示地址和端口,不进行名称解析 |
-p | 显示对应的进程信息 |
-a | 显示所有 Socket |
例如,查看 8080 端口:
sudo ss -lntp | grep 8080
可能得到:
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=1234,fd=45))
这说明:
LISTEN:当前端口处于监听状态。0.0.0.0:8080:监听所有 IPv4 网络接口上的 8080 端口。java:占用端口的进程名称。pid=1234:进程 ID 为 1234。
4.2 lsof:查看文件和端口对应的进程
lsof(List Open Files)用于查看系统中进程打开的文件。
在 Linux 中,网络 Socket 也可以通过文件描述符进行管理,因此 lsof 也可以用来查询端口占用情况。
# 查看 8080 端口被哪个进程占用 sudo lsof -i :8080 # 查看所有网络连接 sudo lsof -i # 查看指定进程打开的文件 sudo lsof -p 1234
例如:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1234 app 45u IPv4 ... 0t0 TCP *:8080 (LISTEN)
可以看到,PID 为 1234 的 Java 进程正在监听 8080 端口。
4.3 netstat:传统网络查看工具
netstat 也是常见的网络管理命令,可以查看网络连接、路由表以及端口监听情况。
# 查看所有网络连接和监听端口 netstat -an # 查看 TCP 监听端口 netstat -tln # 查看端口及对应进程 sudo netstat -tlnp
常用选项:
| 选项 | 含义 |
|---|---|
-a | 显示所有连接和监听端口 |
-n | 以数字形式显示地址和端口 |
-t | 显示 TCP |
-u | 显示 UDP |
-l | 显示监听状态 |
-p | 显示对应进程 |
需要注意:netstat 属于传统网络工具,在不少现代 Linux 发行版中需要额外安装 net-tools。现在更推荐使用 ss。
4.4 三者有什么区别?
| 命令 | 主要作用 | 适用场景 |
|---|---|---|
ss | 查看 Socket 和网络连接 | 网络连接、监听端口排查 |
lsof | 查看进程打开的文件和资源 | 查询端口对应的进程 |
netstat | 查看网络连接、端口和路由信息 | 传统网络排查 |
日常开发中,优先掌握 ss 和 lsof 就可以解决大部分端口排查问题。
5. 实战:解决 Spring Boot 端口被占用问题
假设我们启动 Spring Boot 项目时,出现:
Web server failed to start. Port 8080 was already in use.
说明当前需要使用的 8080 端口已经被占用。
可以按照下面的步骤进行排查。
第一步:查看端口占用情况
sudo lsof -i :8080
也可以:
sudo ss -lntp | grep 8080
第二步:获取占用端口的 PID
假设查询结果显示:
java 1234 app ... TCP *:8080 (LISTEN)
那么占用端口的进程 PID 就是 1234。
第三步:查看进程详细信息
ps -fp 1234
确认它究竟是什么程序,避免误杀其他重要服务。
第四步:结束进程
如果确认该进程可以停止,可以先尝试正常终止:
kill 1234
等待一段时间后再次检查:
sudo ss -lntp | grep 8080
如果进程仍然无法退出,再根据实际情况考虑使用:
kill -9 1234
第五步:重新启动 Spring Boot 项目
java -jar app.jar
这样就完成了端口占用问题的基本排查。
6. 查看 Linux 网络配置
除了端口排查,我们还需要了解如何查看服务器本身的网络配置。
6.1 ip addr:查看 IP 地址
ip addr
也可以简写为:
ip a
用于查看网卡名称、IP 地址、网络接口状态等信息。
例如:
2: eth0:
inet 192.168.1.100/24
表示当前网卡的 IPv4 地址为 192.168.1.100。
6.2 ip route:查看路由表
ip route
用于查看系统的路由信息。
例如:
default via 192.168.1.1 dev eth0
表示默认流量通过 192.168.1.1 这个网关转发,并通过 eth0 网卡发送。
6.3 hostname -I:查看本机 IP
hostname -I
可以快速查看当前机器配置的 IP 地址。
6.4 nslookup:查看 DNS 解析
nslookup www.baidu.com
用于查询域名对应的 IP 地址,可以帮助排查 DNS 解析问题。
例如,如果服务器可以通过 IP 访问目标机器,但是通过域名无法访问,就需要进一步检查 DNS 配置。
7. 防火墙与端口开放
有时我们发现 Spring Boot 服务已经正常启动,本机也可以通过 curl 访问,但是其他机器却无法访问。
这时除了检查服务监听地址,还需要检查防火墙规则。
Linux 中常见的防火墙管理工具有 firewalld 和 ufw。
7.1 firewalld
firewalld 在 CentOS、Rocky Linux 等发行版中比较常见。
# 查看防火墙状态 sudo systemctl status firewalld # 查看当前开放的端口 sudo firewall-cmd --list-ports # 开放 8080 TCP 端口(永久生效) sudo firewall-cmd --permanent --add-port=8080/tcp # 重新加载防火墙配置 sudo firewall-cmd --reload # 再次查看开放端口 sudo firewall-cmd --list-ports
7.2 ufw
ufw 在 Ubuntu 系统中比较常见。
# 查看防火墙状态 sudo ufw status # 开放 8080 TCP 端口 sudo ufw allow 8080/tcp # 删除开放规则 sudo ufw delete allow 8080/tcp
注意:开放端口之前,需要确认服务确实需要对外提供访问,不要随意开放不必要的端口。
另外,如果使用的是云服务器,还需要检查云平台的安全组规则。即使 Linux 本机防火墙已经放行,云服务器安全组没有放行对应端口,外部仍然可能无法访问。
8. 实战:Spring Boot 服务无法从外部访问
假设 Spring Boot 项目已经启动,端口为 8080,但是其他机器无法访问。
可以按照下面的流程排查。
第一步:确认服务是否正常运行
sudo systemctl status myapp
如果服务由 systemd 管理,可以先检查是否处于 active (running) 状态。
第二步:检查端口是否处于监听状态
sudo ss -lntp | grep 8080
如果没有结果,说明当前没有发现对应的 TCP 监听端口。
第三步:检查本机是否能够访问
curl http://127.0.0.1:8080
如果本机可以访问,说明服务至少能够通过本地回环地址提供响应。
第四步:检查监听地址
如果结果显示:
127.0.0.1:8080
说明服务只监听本地回环接口,其他机器无法直接通过服务器网卡 IP 访问。
如果需要对外提供访问,需要根据实际部署环境配置服务监听地址,例如让 Spring Boot 监听 0.0.0.0。
第五步:检查防火墙和云服务器安全组
确认 8080/tcp 是否已经在 Linux 防火墙以及云平台安全组中放行。
第六步:从其他机器测试
curl http://服务器IP:8080
通过上述步骤,就可以逐步判断问题出现在服务进程、监听地址、防火墙还是网络链路上。
9. 常用命令速查表
| 命令 | 作用 |
|---|---|
ping | 测试 ICMP 网络连通性 |
curl | 发送 HTTP 请求,测试接口 |
ss | 查看 Socket 和端口监听情况 |
lsof | 查看进程打开的文件和网络资源 |
netstat | 查看网络连接和端口信息 |
ip addr | 查看网卡和 IP 地址 |
ip route | 查看路由表 |
hostname -I | 查看本机 IP 地址 |
nslookup | 查询 DNS 解析 |
firewall-cmd | 管理 firewalld 防火墙 |
ufw | 管理 UFW 防火墙 |
总结
其中,ping 用于测试基本网络连通性,curl 用于测试 HTTP 接口,ss 和 lsof 用于查看端口监听和进程占用情况,而 ip addr、ip route、nslookup 则可以帮助我们排查网络配置和 DNS 问题。
对于后端开发来说,掌握这些命令非常重要。当 Spring Boot 项目出现端口冲突、接口无法访问或者网络连接异常时,我们就可以直接在 Linux 服务器上定位问题,而不必完全依赖图形化工具。
以上就是Linux中网络管理与端口排查常用命令总结的详细内容,更多关于Linux网络管理与端口排查命令的资料请关注脚本之家其它相关文章!
相关文章
CentOS 7.6 Telnet服务搭建过程(Openssh升级之战 第一任务备用运输线搭建)
这篇文章主要介绍了CentOS 7.6 Telnet服务搭建过程(Openssh升级之战 第一任务备用运输线搭建),本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧2019-10-10


最新评论