Linux 网络诊断工具
物理连接检查
ethtool
网络接口的物理连接可以简单地使用ethtool来检查网络接口的物理连接状态;
ethtool devie_name
通过Link detected字段可以否检测到了物理连接。如果显示“Link detected: yes”,那么表示物理连接是正常的;
网络连通性检查
ping
通过ping命令可以检查当前主机与另一台主机的网络连通性。
-
icmp_seq:本机发送的第几个数据包
-
ttl:Time To Live,当数据包经过一个路由器时,TTL会减1。当TTL为0时,数据包会被丢弃
-
time:数据包从发送端到目的地再返回到发送端的时间,一般在100ms内都是可以接收的。小于50ms就很好。
-
rtt:Round Trip Time,即往返时间
-
min: 最短的往返时间
-
avg: 平均的往返时间
-
max: 最长的往返时间
-
mdev: 往返时间的标准偏差,反映了网络的稳定性
说明:
-
在Linux中,使用ping命令的时候可以通过 -I(大写)参数来用指定的网络接口发送数据报文
-
在Windos中,使用ping命令可以通过 -S(大写)指定源地址,间接实现用指定的网络接口发送数据报文
tracepath
tracepath 和 traceroute一样,可以跟踪数据包从源到目的地经过的路径(从源地址到目标地址过程中所经过的一系列路由器或其他网络设备),每一跳代表要给网络设备。tracepath的使用比traceroute更简单,输出更简洁。
通过该工具,当某个特定的主机或服务无法访问时,可以通过它确定问题出现在哪个网络跃点。
例如:查看到达192.168.1.241所经过的路径
tracepath -n 192.168.1.241
说明:
-
1?: [LOCALHOST] pmtu 1500:表示首个检测点,即本地计算机
-
会发送多个数据包以获得更准确的结果,所以看到了给192.168.12.1发了两个数据包
-
no reply表示在特定的跳点处没有收到响应,可能是网络设备(路由器等)做了安全设置,不响应此类探测包
http/https连通性检查
通过wget和curl可以快速在命令行界面或shell脚本里面检查某个url是否是连通的。
wget检查连通性
wget 获取一个URL时,如果服务器正常响应,默认会下载该URL指向的内容,如果只是想检查连通性而不下载任何内容,可以使用 --spider 选项告诉 wget 不要下载任何内容, 还可以使用-S参数来查看服务器响应头。
wget和curl
这两个工具主要是用来检查http/https协议的连通性。
curl检查连通性:
使用curl检查某个curl的连通性时候,一般要使用 -I(大写)参数,通过这个参数告诉curl只请求HTTP头部信息,而不是完整的页面或资源内容。
可以加一个 -f 参数,这样curlcurl不会输出响应的主体内容,但它确实会输出一个简短的错误消息到标准错误输出
tcp/udp连通性检查
检查tcp/udp的连通性主要就是检查指定的端口是否是开放的,能否正常建立链接等。可以用nc、telnet、nmap等工具来进行检查;
nc(Netcat)
nc命令主要是用来检查TCP或UDP的连通性。
检查tcp的连通性:
一般需要通过 -z 参数使Netcat在扫描模式下运行,即只检查是否可以建立连接,而不发送任何数据。通过 -v 参数显示连接的详细信息
nc -zv remote_host port
检查udp的连通性:
使用nc来检查udp的连通性时,需要使用 -u 参数来表示使用UDP而不是默认的TCP。但是检查UDP连通性比检查TCP连通性略为复杂,因为UDP是无连接的。这意味着即使远程端口不可用,发送UDP数据包也不会返回错误。所以这个时候可以使用nc来发送和接收UDP数据包,检查UDP的连通性。
echo test | nc -uv remote_host port
说明:
-
没任何返回说明udp不连通
-
因为UDP是无连接的协议,nc没有简单的方法来判断“会话”何时结束,所以就是是连通的,仍然处于监听模式。需要手动使用Ctrl+C来中断nc命令
telnet
使用telnet也可以实现用来简单地检查TCP端口是否开放
telnet remote_hsot port
nmap
namap和nc工具一样,具有很多很强大的功能。可以用来进行端口扫描,检测操作系统等等。这个工具常规的Linux发行版系统中一般没带,需要自己进行手动安装。
例如:扫描目标IP地址192.168.0.104上的常用的1000个TCP端口
nmap 192.168.0.104
状态说明:
-
open:表示有一个服务正在监听该端口,并且准备响应进入的连接或数据
-
Closed:没有应用程序在该端口上监听
-
Filtered:不能确定端口是否开放,因为数据包过滤阻止了它的探测尝试
如果只是想扫描指定的端口有没有开放,通过-p(小写)参数来指定需要探测的端口号来实现
nmap -p port1,port2,... remote_host
有时候,某些端口可能因为防火墙规则而被过滤,可以通过 -sA 参数来确定目标机器的端口是否被防火墙或过滤器保护。是通过ACK扫描来实现的,但是ACK扫描不是为了确定端口是否开放,而是为了确定防火墙是否存在以及如何配置
例如:对对IP地址192.168.0.104进行ACK扫描
说明:
-
nfiltered"意味着nmap能够接收到从目标端口返回的RST数据包,说明该端口是开放的或关闭的,没有被防火墙或其他类型的过滤器阻止
-
如果是filtered状态表示nmap无法确定该端口的状态(开放或关闭),因为没有收到目标的任何响应。这通常是由于防火墙或其他类型的过滤器在中间进行了拦截。
本地网络连接检查:
netstat和ss
netstat 和 ss 主要用于查看本地系统上的网络连接和监听的套接字,而不是直接检查网络的连通性。通过这两个工具可以查看特定的端口或连接是否活动、是否有程序在特定端口上监听等。
例如:如果需要查看所有的网络连接,需要使用 -a 参数来实现(显示所有的活动网络连接(包括TCP和UDP)和监听的套接字)
netstat -a
例如:查看所有的tcp连接,通过 -t 参数就是查看tcp连接,然后再通过 -n 参数让他不要显示主机名,直接显示ip地址
netstat -tn
例如:查看所有的udp连接就需要 -u参数来指定了,一般也需要加 -n 参数来让显示的内容不解析为主机名
netstat -un
例如:如果想查看当前所有正在监听的套接字就需要通过 -l 参数来实现了
netstat -ln
例如:如果像查看哪个进程正在监听或使用特定的端口,就需要使用 -p(小写)参数了
# -tul 显示所有tcp和udp的连接
netstat -tulnp
ss命令的参数和netstat是一样的。
参数说明:
-
State:当前连接状态,
-
Recv-Q:当前在接收队列中等待被该进程读取的数据量(以字节为单位)
-
Send-Q:当前在发送队列中等待被发送到网络上的数据量(以字节为单位)
-
Local Address:Port:本地端
-
Peer Address:Port:远程端
-
Process:与该网络连接相关联的进程的信息
说明:netstat -an 和 netstat -tuln的区别
-
netstat -a是显示所有的活动网络连接(包括TCP和UDP)和监听的套接字。
-
netstat -tuln仅展示正在监听状态的TCP和UDP套接字,而不会显示已经建立的连接。
TCP连接的几种状态:
-
LISTEN(监听状态):机器上的某个服务程序正在该端口上监听,等待客户端的连接请求。当收到请求后,它会和客户端进行三次握手,以建立一个连接。
-
ESTABLISHED(已经建立连接):表示两台机器上的应用程序已经通过三次握手成功建立了连接。此状态下,双方都已确认连接已建立,并可以发送或接收数据。
-
SYN_SENT 和 SYN_RECV(建立简介的中间状态)
-
FIN_WAIT_1, FIN_WAIT_2, TIME_WAIT, CLOSE_WAIT, LAST_ACK 和 CLOSED(终止连接和关闭连接的相关状态)
三次握手建立TCP连接的过程
SYN和ACK是TCP头部的标志位(flags),平时一般称呼携带这些标志位的TCP段称为"SYN报文"、"ACK报文"。
-
SYN同步:客户端告诉服务器,“我想建立一个连接,我把我要使用的初始序列号给你(SYN)”
-
SYN + ACK(同步 + 确认):服务器收到 SYN 报文后,为了确认客户端的 SYN,会发送一个报文段回客户端。说:“我收到了你的连接请求,这是我要使用的序列号(SYN)”
-
客户端告诉服务器,“我已经收到了你的确认以及你的初始序列号”。
状态变化
客户端:
-
刚开始,客户端是CLOSED状态。当客户端发送SYN报文(带有自己的初始序列号)给服务端后,它进入SYN_SENT状态。
-
当客户端收到服务端的SYN+ACK报文,并对此报文发送ACK报文后,它进入ESTABLISHED状态。
服务端:
-
服务端起初是LISTEN状态。当它收到客户端的SYN报文时,服务端回复SYN+ACK报文(带有自己的初始序列号和对客户端SYN的确认)给客户端。此时,服务端进入SYN_RECV状态。
-
服务端收到客户端的ACK报文后,它进入ESTABLISHED状态。
三次握手原因
为了保证双方都知道彼此都准备好了数据传输,同时为了避免已经失效的连接请求突然传到了服务端,因为这些旧的连接请求可能导致不必要的错误。三次握手能够确保连接的可靠性。
DNS可用性检查
可以通过dis、host和nslookup等工具来检查系统dns是否可用。
例如:查询www.baidu.com在本机是否能正常解析
dig www.baidu.com
例如:使用dig工具的时候还呢可以指定dns来进行解析,通过 @DNs_server 的方式实现
dig www.baidu.com @180.76.76.76