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: 往返时间的标准偏差,反映了网络的稳定性

说明:

  1. 在Linux中,使用ping命令的时候可以通过 -I(大写)参数来用指定的网络接口发送数据报文

  2. 在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

说明:

  1. 没任何返回说明udp不连通

  2. 因为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报文"。

  1. SYN同步:客户端告诉服务器,“我想建立一个连接,我把我要使用的初始序列号给你(SYN)”

  2. SYN + ACK(同步 + 确认):服务器收到 SYN 报文后,为了确认客户端的 SYN,会发送一个报文段回客户端。说:“我收到了你的连接请求,这是我要使用的序列号(SYN)”

  3. 客户端告诉服务器,“我已经收到了你的确认以及你的初始序列号”。

状态变化

客户端:

  1. 刚开始,客户端是CLOSED状态。当客户端发送SYN报文(带有自己的初始序列号)给服务端后,它进入SYN_SENT状态。

  2. 当客户端收到服务端的SYN+ACK报文,并对此报文发送ACK报文后,它进入ESTABLISHED状态。

服务端:

  1. 服务端起初是LISTEN状态。当它收到客户端的SYN报文时,服务端回复SYN+ACK报文(带有自己的初始序列号和对客户端SYN的确认)给客户端。此时,服务端进入SYN_RECV状态。

  2. 服务端收到客户端的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

posted on 2022-07-09 20:21  背对背依靠  阅读(563)  评论(0编辑  收藏  举报