欢迎,来自IP地址为:98.80.143.34 的朋友
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系统的网络命令,希望可以在实际处理网络故障时给予帮助。