IP Address: 54.198.55.167



Linux系统一旦网络设备正常工作,接下来的工作就是是通过Linux命令来排查网络故障,以保证可以正常使用网络。本文将重点关注如何使用Linux系统相关的网络命令来排查网络问题。

使用ping命令来检测网络的通断

ping命令是Linux系统检测网络最为有用的命令,通过该命令,可以查看某个IP地址是否可达。

ping命令的工作原理是通过向特定IP发送ICMP报文来判断网络的连通性。命令示例如下:

# ping www.daehub.com

上图显示了一个成功的ping结果,表示我们的主机同”www.daehub.com”具有网络可达性。可以看到,在命令结束时会显示命令的执行结果统计信息。如果没有收到响应,则可能由于以下原因的一种或几种:

  • 网络本身存在硬件故障
  • 网络地址存在问题
  • ping请求被目标主机屏蔽
  • 网络路由存在问题(比较典型的就是GFW)

以上的ping命令是不会自动停止的,如果想停止的话需要按”Ctrl + C”键来强制停止。如果想要设定发送请求包的数量,可以使用”-c”参数,ping命令会在完成指定次后自动停止。

# ping -c 5 www.daehub.com

ping 命令有几点注意事项,了解了这些事项后,就会明白ping的结果为什么会存在差异。

首先,本机到目标主机的距离决定了ping命令的耗时。

你要明白,ping命令是真真正正的向目标主机发送了数据,并且在收到响应报文后才完成一次交互,目标主机实际距离的远近决定了收到报文的时间。可以想像从中国ping美国的服务器当然不如ping位于中国的服务器耗时短。

其次,网络连接速度也会对ping命令产生影响。

再次,到达目标主机的跳数也是ping结果的影响因素。这个问题也很好举例子,国内两大运营商只在北京、上海和广州有互联节点,这让其它城市的用户访问异网服务器时会绕行互联节点,无故增加响应时长。比如服务器位于四川电信机房,而成都联通的用户想要访问这台服务器,数据报文会首先发送到北京联通互联节点,然后再由北京电信互联节点将请求发送至四川电信服务器,服务器响应也会经过同样的路由,当然耗时要久一点。

使用dig和host命令获取DNS记录信息

可以使用dig命令来获得DNS服务器对应的IP地址、MX记录等多种信息,这有助于理解DNS的基本原理。dig命令也被设计成可以取代nslookup命令的更为方便的命令工具。典型示例如下:

# dig www.daehub.com

dig命令默认查找域名的A记录,可以通过域名后加记录类型方式来查看特定类型的记录。例如查看MX记录就可以使用如下命令:

# dig daehub.com MX

可以看到,”daehub.com”域名下存在一条MX记录。当然,如果对于DNS记录类型不熟悉的话,可以使用ANY参数将域名下的所有记录统一显示出来,如下所示:

# dig daehub.com ANY

dig命令同样可以查看反向DNS记录,也就是通过IP地址来查看对应的域名。命令示例如下:

dig -x 149.28.51.159

dig命令默认向”/etc/resolv.conf”中配置的服务器查询相关信息,可以修改配置文件内容来指定其它DNS服务器。

host命令可以达到同dig命令类似的效果,示例如下:

# host -a www.daehub.com

当然,也可以使用host命令进行反向查询:

# host 149.28.51.159

可以看到,两条命令都可以进行DNS记录查询,但是dig命令可以提供更多的选项。

使用traceroute命令检测网络时延

traceroute命令是Linux系统最为有用的网络命令,通过该命令,可以查看本机到目标主机的路由以及时延情况,traceroute命令可以帮助完成以下工作:

  • 显示路由中的相关设备名称
  • 显示路由中各设备的时延情况

命令示例如下:

# traceroute www.rultr.com

可以看到,该命令显示了主机信息、包信息以及经过路由的IP地址信息,命令的默认检查跳数为30跳,其中包含了DNS查询信息,如果想要省略DNS查询,则使用如下命令:

# traceroute -n www.rultr.com

通过使用traceroute命令,可以很容易的找到网络传输的瓶颈。出现”*”(星号)的部分表明潜在的网络故障因素,其意义是指此节点不能响应ICMP报文,当然某些设备关闭响应并不影响IP包的正常转发,只不过不想暴露设备的IP地址信息。

tarceroute命令默认发送UDP报文,当然可以通过命令参数来指定发送UDP、TCP或ICMP报文。如果想要发送ICMP报文,则使用如下命令:

# traceroute -I www.rultr.com

也可以使用”-T”参数来指定发送TCP报文,运行结果如下图所示:

可以看到,三次traceroute命令的执行结果不尽相同,这是因为路由中的某些设备会屏蔽不同的协议所致。

mtr命令(实时跟踪)

mtr命令是traceroute命令的另一选择,可以实时显示到目标主机的路由跟踪信息。

# mtr www.rultr.com

另外,可以给mtr命令添加”–report”参数,这样mtr会向到目标主机的每一跳都发送10个数据包,来检测每一跳的连通情况。命令示例如下:

# mtr --report www.rultr.com

mtr命令显示了本机到目标主机的路由全程详细信息,对于分析查找网络故障十分有用,如果运行该命令时提示权限不足,则需要使用sudo或者切换到具备权限的用户。

使用ss命令查看网络性能

ss是socket statistics的简写,这条命令比netstat命令运行更加快速,并且可以提供更为详细的信息。ss命令会直接从内核中提取信息,而不像netstat命令那样需要读取”/proc”目录中的内容。命令示例如下:

# ss | less

ss命令会输出所有的TCP、UDP以及UNIX socket连接情况,使用”| less”命令可以使输出看起来更为整齐。ss命令可根据参数来区分显示不同的连接,”-t”表示TCP;”-u”表示UDP;”-x”表示UNIX socket,每种方式都可以加入”-a”参数用于详细显示。例如

# ss -ta | more

如果想要查看所有已建立的IPv4连接,则使用如下命令:

# ss -t4 state established

显示所有已经关闭的连接用如下命令:

# ss -t4 state closed

也可以使用ss命令显示本机同目标主机的所有连接信息:

# ss dst XXX.XXX.XXX.XXX

当然,也可以指示特定端口:

# ss dst XXX.XXX.XXX.XXX:22

arp命令

系统中存在着一张IP地址同网络设备MAC地址的对应关系表,这个表被称为ARP查询表。如果想要连接某个主机的IP地址,那么路由器会首先检测你的MAC地址,如果存在缓存信息,则不会使用ARP表。可以直接使用arp命令来查看本的ARP表信息:

# arp

arp命令默认显示主机名,如果想要显示主机的IP地址,则使用如下命令:

# arp -n

如果想要删除ARP表中的某条信息,则使用如下命令:

# arp -d HWADDR

使用tcpdump命令进行数据包分析

tcpdump命令是Linux系统最为重要的网络命令,该命令常常用于抓取通过本机网络接口的数据流量。

tcpdump命令是一种深度的数据名检测工具,常常用于网络故障分析。典型命令格式如下:

# tcpdump -i  eth0 //network_device

命令中的network_device信息可以通过如下命令获得:

# ifconfig

tcpdump命令有如下几种用法,用于筛选特定的端口或IP地址:

# tcpdump -i <network_device> tcp
# tcpdump -i <network_device> port 80
# tcpdump -c 20 -i <network_device>
# tcpdump -c 20 -i <network_device> src XXX.XXX.XXX.XXX

当然,你也可以使用”-w”参数将抓取的数据包写入指定文件,然后使用”-r”参数读取,示例如下:

# tcpdump -w /path/file.name -i <network_device>
# tcpdump -r /path/file.name

以上就是Linux系统的网络命令,希望可以在实际处理网络故障时给予帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注