🎯 学习目标
完成本课程后,学习者将能够:
- 手动/自动配置IP参数与启动/关闭网络接口
- 网络服务主机沟通、节点分析、网络连接、 DNS问题定位
- 从Http请求、DNS解析、防火墙、服务监听全链路网络排错
当你满怀信心地敲下命令或打开浏览器,迎接你的却是一片红色的错误提示或无尽的加载动画时,这种挫败感想必每一位Linux用户都深有体会,提供和整理了一些排查网络通信的思路,思路决定思路,Let 's Go!
-
起点:从问题开始。
-
本地接口检查 (
ip addr
):- 首先使用
ip addr
(或ifconfig
) 命令确认自己的"网卡"是否UP
和"IP地址"是否正确。这是所有网络通信的基础。
- 首先使用
-
分层连通性检查 (
ping
&traceroute
):- 使用
ping 127.0.0.1
检查本机网络协议栈。 - 如果外网不通,使用
traceroute 8.8.8.8
(或mtr
) 命令精确定位网络中断的位置。
- 使用
-
DNS解析检查 (
dig
/host
):- 在能访问互联网的基础上,使用
dig <域名>
或host <域名>
命令检查域名解析服务是否正常。
- 在能访问互联网的基础上,使用
-
查询防火墙端口、云服务在检查安全组是否配置。
-
服务状态检查 (
ss
&nc
/telnet
):- 检查本地服务 :使用
ss -tulpn | grep <端口>
命令确认目标服务是否在本地正确监听。 - 测试远程端口 :使用
nc -zv <IP> <端口>
或telnet <IP> <端口>
命令测试到远程服务端口的TCP连接是否成功。
- 检查本地服务 :使用
一、手动/自动配置IP参数与启动/关闭网络接口
在我们查看本机IP网络的时候,最常用的就是ifconfig
这个命令首当其冲,用于配置和显示网络接口信息,是查看和配置网络接口的基础命令,服务器A (192.168.31.149),服务器B(192.168.31.151),禁用ens33接口后状态由之前的<UP,BROADCAST,RUNNING,MULTICAST>
变成了<BROADCAST,MULTICAST>
。
bash
[stark@bogon ~]$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.31.149 netmask 255.255.255.0 broadcast 192.168.31.255
[stark@bogon ~]$ sudo ifconfig ens33 down
[stark@bogon ~]$ ifconfig -a
ens33: flags=4098<BROADCAST,MULTICAST> mtu 1500
禁止掉端口后,服务器B(192.168.31.151)向 服务器A (192.168.31.149)也不能通信了
bash
$ ping 192.168.31.149
PING 192.168.31.149 (192.168.31.149) 56(84) bytes of data.
64 bytes from 192.168.31.149: icmp_seq=1 ttl=64 time=1.08 ms
$ ping 192.168.31.149
PING 192.168.31.149 (192.168.31.149) 56(84) bytes of data.
From 192.168.31.151 icmp_seq=10 Destination Host Unreachable
bash
# 显示所有网络接口信息
ifconfig -a
# 激活eth0接口
ifconfig eth0 up
# 禁用eth0接口
ifconfig eth0 down
# 为eth0设置IP地址和子网掩码
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
ifup/ifdown 用于启动和关闭网络接口,通常基于配置文件进行操作。
bash
# 启动eth0接口
ifup eth0
# 关闭eth0接口
ifdown eth0
二、修改网络中的路由 Route
route
是用于管理 Linux 系统内核路由表的命令行工具,它允许用户查看、添加、修改和删除网络路由规则。路由表是操作系统内核中的一个关键数据结构,两台主机之间一定要有路由才能够通信TCP/IP的协议,否则就无法进行连接。
bash
# 查看路由表
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.31.139 0.0.0.0 UG 100 0 0 ens33
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
# 添加默认网关
route add default gw 192.168.1.1
# 添加到10.0.0.0网段的路由
route add -net 10.0.0.0 netmask 255.255.255.0 gw 192.168.1.2
# 删除到10.0.0.0网段的路由
route del -net 10.0.0.0 netmask 255.255.255.0
ip
命令是,强大的网络配置工具,可替代 ifconfig 和 route 等命令,常用查询IP和路由。
bash
[stark@bogon ~]$ ip route show
default via 192.168.31.139 dev ens33 proto dhcp metric 100
192.168.31.0/24 dev ens33 proto kernel scope link src 192.168.31.151 metric 100
[stark@bogon ~]$ ip addr
三、网络的排错与查看
1、两台主机的两点沟通
还是服务器A (192.168.31.149),假设在服务器A上部署了Nginx的Web站点,我们在本地配置一个域名为www.work.com
的域名,这个时候请求和我们预期不付,第一步排错一定是从ping
这个操作开始的,首先要定位是否请求到服务器A 上,而不是请求到其他主机的ip上,这个是最常用的排查命令,没有之一,它主要验证的就是两台主机的两点沟通。
测试网络连通性的基本工具,通过 ICMP 协议发送回声请求,64 bytes 表示收到的 ICMP 应答数据包大小为 64 字节,icmp_seq=1 表示当前是第几个 ICMP 数据包的编号,ttl=64 TTL(Time To Live,生存时间)是 IP 协议中的一个字段,用于限制数据包在网络中的最大传输跳数(经过的路由器数量),time=0.632 ms表示从发送 ICMP 请求到收到应答的往返时间(RTT,Round-Trip Time),单位为毫秒(ms)。
bash
[stark@bogon ~]$ ping -c 3 192.168.31.149
PING 192.168.31.149 (192.168.31.149) 56(84) bytes of data.
64 bytes from 192.168.31.149: icmp_seq=1 ttl=64 time=0.632 ms
64 bytes from 192.168.31.149: icmp_seq=2 ttl=64 time=0.736 ms
64 bytes from 192.168.31.149: icmp_seq=3 ttl=64 time=0.533 ms
ping
命令的更多用法。
bash
# 测试到百度的连通性,发送4个包
ping -c 4 www.baidu.com
# 发送100字节的包,间隔2秒
ping -c 5 -s 100 -i 2 192.168.1.1
# 设置超时时间为3秒
ping -c 3 -W 3 8.8.8.8
2、两台主机间的节点分析
traceroute
是一款用于追踪网络数据包从本地主机到目标主机所经过的路由节点(路由器)的命令行工具,它能直观展示数据包在网络中的传输路径,是诊断网络延迟、定位网络故障点的核心工具。
实战排错场景:
- 定位网络中断点:
traceroute -n 8.8.8.8
: 若某一跳后全为*
,说明该节点或其后续链路故障,对比正常时段的追踪结果,可快速定位新增故障点 - 分析延迟瓶颈:
traceroute -q 5 -w 2 www.github.com
:多次探测(5 次)并缩短超时,观察哪一跳延迟突增,国内访问 GitHub 时,通常在跨国网关处延迟明显增大 - 穿透防火墙限制:部分防火墙会屏蔽 UDP 高端口,改用常用端口或协议可绕过
- 多出口网络测试:
traceroute -S 192.168.1.100 www.baidu.com # 指定源IP
:服务器多网卡场景下,验证不同出口的路由路径
3、查看本机的网络连接与后门
如果Mysql的服务已经启动了,但是就是无法进行连接,那应该怎么办?首页就是要查询服务器上监听的端口,来看看服务是否真的启动,并且字监听,有时候终端上的显示ok,不一定是真实有效的。
netstat
的本质是读取系统内核中的网络相关数据结构(如 TCP 连接表、UDP 监听表、路由表等),并以人类可读的格式输出。
场景 1:检查服务是否正常监听端口,确认 Nginx 服务(默认端口 80)是否已启动并监听。
bash
# 查看所有监听的 TCP 端口(数字格式,含进程)
sudo netstat -tlnp | grep 80
场景 2:定位占用端口的 "异常进程"
发现 3306 端口被占用,需找到对应的进程并结束,13520是3306端口占用的进程。
bash
[stark@bogon ~]$ sudo netstat -tlnp | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 13520/mysqld
sudo kill -9 13520
场景 3:查看所有已建立的 TCP 连接
查看当前服务器与外部的所有 TCP 连接(如 Web 服务的客户端连接)。
bash
sudo netstat -tnp | grep ESTABLISHED
场景 4:分析网络接口是否有丢包
判断 eth0 接口是否因网络故障导致丢包。
bash
# 查看所有接口的统计信息
$ netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
ens33 1500 9787204 0 0 0 9145522 0 0 0 BMRU
lo 65536 2686603 0 0 0 2686603 0 0 0 LRU
输出状态码解读(TCP 连接核心):
- LISTEN 监听中 ,服务已启动,等待客户端连接(如 Nginx 监听 80 端口)
- ESTABLISHED 已建立,客户端与服务器正常通信(如浏览器访问 Web 服务)
- TIME_WAIT 等待关闭,连接已断开,服务器等待确认(通常持续 1-4 分钟)
- CLOSE_WAIT 等待关闭,客户端已断开,服务器未关闭连接(可能是服务程序 bug)
- SYN_SENT 发送连接请求,客户端尝试连接服务器(若持续存在,可能是服务器未响应)
- SYN_RECV 接收连接请求,服务器收到连接请求,等待客户端确认(若堆积,可能是 SYN 攻击)
4、检测主机名与IP对应
轻量级 DNS 查询工具 host
命令以简洁直观的方式实现 DNS 记录查询,适合快速验证域名解析结果,输出格式简单易懂,是日常排查 DNS 问题的首选工具,通过 PTR 记录反向解析,8.8.8.8 对应域名 dns.google
(谷歌公共 DNS 服务器)。
bash
$ host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer dns.google.
查询邮件服务器(MX 记录),baidu.com
的邮件服务器优先级从高到低为 10、20、30、40(数值越小优先级越高)。
bash
$ host -t MX baidu.com
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
指定 DNS 服务器查询
bash
host www.baidu.com 8.8.8.8 # 使用谷歌 DNS 服务器
host www.baidu.com 114.114.114.114 # 使用国内 114 DNS 服务器
专业级 DNS 查询工具 dig
(Domain Information Groper)是功能更全面的 DNS 查询工具,支持复杂查询条件,能显示 DNS 响应的完整报文结构,适合深入分析 DNS 协议细节和复杂故障排查。
场景1、基础查询(默认输出详细结果)
bash
[stark@bogon ~]$ dig www.baidu.com
- HEADER 区 :显示查询状态(
NOERROR
表示成功)、查询 / 响应数量等。 - QUESTION 区 :显示查询的域名和类型(
IN A
表示 IPv4 地址)。 - ANSWER 区 :解析结果(同
host
的核心输出),1200
表示 TTL(缓存时间,单位秒)。 - 统计信息:查询耗时、使用的 DNS 服务器等。
场景2、追踪 DNS 解析全过程
从根服务器(.
)→ 顶级域名服务器(.com
)→ 权威服务器(baidu.com
)的完整解析链,可定位某一级服务器是否异常。
5、端口的连通性追踪
向目标主机的指定 TCP 端口发起连接请求,验证端口是否开放、服务是否响应。
场景 1:测试 TCP 端口是否开放(最常用)
验证目标主机的 80 端口(HTTP)、443 端口(HTTPS)、22 端口(SSH)是否开放,核心价值:快速判断 "服务不可用" 是因为端口未开放、防火墙拦截,还是服务未启动。
bash
# 测试百度的 80 端口(正常开放)
telnet www.baidu.com 80
Trying 180.101.50.242...
Connected to www.baidu.com.
Escape character is '^]'. # 提示按 Ctrl+] 退出会话
#连接失败输出
Trying 180.101.50.242...
telnet: connect to address 180.101.50.242: Connection refused # 端口拒绝连接
# 或显示 "Connection timed out"(超时,通常是防火墙拦截)
场景 2:模拟 HTTP 请求(调试 Web 服务)
向 Web 服务器发送手动构造的 HTTP 请求,验证服务是否正常处理请求。排查 Web 服务是否正确处理请求头、是否返回预期状态码(如 200、404、500 等)。
bash
# 连接目标服务器的 80 端口:
telnet www.baidu.com 80
#连接成功后,输入 HTTP GET 请求,(此处按两次回车)
GET / HTTP/1.1
Host: www.baidu.com
#服务器返回响应(部分输出):
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
...(省略响应头和 HTML 内容)
Connection closed by foreign host. # 服务器关闭连接