网络故障排查常用命令集

查询路由表(route)

route命令可以显示你当前的路由表信息,包括你的默认网关。

$ sudo route -n 
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 
10.1.1.0 * 255.255.255.0 U 0 0 0 eth0 
default 10.1.1.1 0.0.0.0 UG 100 0 0 eth0 

我们需要重点关注的是最后一行,即以default开始的那一行。这一行显示主机的网关是10.1.1.1。注意route命令后面跟着-n选项,这样route命令不会尝试将这些IP地址解析成主机名。

ping网关(ping)

使用ping命令来确认能否与网关通信:

$ ping -c 5 10.1.1.1 
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data. 
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=3.13 ms 
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=1.43 ms 
64 bytes from 10.1.1.1: icmp_seq=3 ttl=64 time=1.79 ms 
64 bytes from 10.1.1.1: icmp_seq=5 ttl=64 time=1.50 ms --- 10.1.1.1 ping statistics --- 5 packets transmitted, 4 received, 20% packet loss, time 4020ms rtt min/avg/max/mdev = 1.436/1.966/3.132/0.686 ms 

正如你所见,我们能够成功地ping通网关,这意味着,我们至少可以与网关10.1.1.0正常通信。

查询DNS服务器(dig)

apt-get install dnsutils
root@e82ce1ff2b8d:/# dig sina.com

; <<>> DiG 9.9.5-3ubuntu0.9-Ubuntu <<>> sina.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20004
;; flags: qr rd ad; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;sina.com.            IN    A

;; ANSWER SECTION:
sina.com.        300    IN    A    111.13.129.31
sina.com.        300    IN    A    111.13.129.36
sina.com.        300    IN    A    111.13.129.34
sina.com.        300    IN    A    211.179.180.75
sina.com.        300    IN    A    211.179.180.77
sina.com.        300    IN    A    111.13.129.32
sina.com.        300    IN    A    111.13.129.37
sina.com.        300    IN    A    111.13.129.35
sina.com.        300    IN    A    211.179.180.76
sina.com.        300    IN    A    111.13.129.33
sina.com.        300    IN    A    111.13.129.38

;; Query time: 18 msec
;; SERVER: 10.0.2.3#53(10.0.2.3)
;; WHEN: Sun Oct 16 12:21:51 UTC 2016
;; MSG SIZE  rcvd: 202

查询DNS解析(nslookup)

使用nslookup检查DNS是否可以将域名web1解析成IP:

$ nslookup web1 
Server: 10.1.1.3 Address: 10.1.1.3#53 Name: web1.example.net Address: 10.1.2.5 

在这个例子中,DNS正常工作。Web1的主机名扩展为web1.example.net,解析到地址10.1.2.5。 没有配置域名服务器或无法访问域名服务器如果看到下面的错误,这表明要么你的主机没有配置域名服务器,或者无法访问域名服务器。

$ nslookup web1 ;; connection timed out; no servers could be reached 

无论是哪种情况,你都需要检查配置文件/etc/resolv.conf中是否配置了域名服务器。如果没有配置任何IP地址,则需要在这个文件中添加一个域名服务器配置信息。

检查路由(traceroute)

apt-get install traceroute 

traceroute是用来测试路由问题的最好的工具之一。只需要提供给traceroute一台主机的名称,它就可以测试你和这台主机间的每一跳路由。例如,在dev1与web1间的一个成功的路由信息看起来像是这样:

$ traceroute 10.1.2.5 
traceroute to 10.1.2.5 (10.1.2.5), 30 hops max, 40 byte packets 1 10.1.1.1 (10.1.1.1) 5.432 ms 5.206 ms 5.472 ms 2 web1 (10.1.2.5) 8.039 ms 8.348 ms 8.643 ms 

从上面的信息中可以看到,数据包先从dev1到网关(10.1.1.1),然后路由下一跳到web1。这意味着10.1.1.1可能同时是这两个子网的网关。 如果在输出信息中看到星号,则说明问题出在网关。你需要检查这条线路,排查不能在两个网络中传递数据包的原因。

root@e82ce1ff2b8d:/# traceroute -n www.baidu.com
traceroute to www.baidu.com (111.13.100.91), 30 hops max, 60 byte packets
 1  172.17.0.1  0.039 ms  0.012 ms  0.012 ms
 2  10.0.2.2  0.263 ms  0.248 ms  0.218 ms
 3  * * *
 4  * * *
 5  120.197.47.245  10.753 ms  11.182 ms 120.197.47.209  12.555 ms
 6  221.183.24.145  10.320 ms  9.789 ms 221.183.24.141  10.761 ms
 7  221.176.21.114  10.861 ms 221.176.15.209  40.284 ms 221.176.21.114  10.791 ms
 8  * 221.183.19.54  40.254 ms *
 9  * * 111.13.188.69  49.446 ms
10  111.13.98.253  48.990 ms 111.13.98.249  52.568 ms 111.13.98.253  48.478 ms
11  * 111.13.108.26  61.761 ms 111.13.108.1  67.219 ms

检查远程端口是否开放(telnet/nmap)

验证该端口是否已经开放。有许多不同的方法可以做到这一点。首先,你可以尝试telnet命令:

$ telnet 10.1.2.5 80 Trying 10.1.2.5... 
telnet: Unable to connect to remote host: Connection refused 

如果你看到Connection refused,那要么是端口没有开启(比如远程服务器上的apache服务没有启动或者没有监听端口),要么是防火墙的限制。

比起telnet,我更喜欢使用nmap来测试端口,因为它经常可以检测到防火墙的存在。如果没有安装nmap,使用你的软件管理包来安装nmap。

apt-get install nmap

要测试web1,请输入以下内容:

$ nmap -p 80 10.1.2.5 
Starting Nmap 4.62 ( http://nmap.org ) at 2009-02-05 18:49 PST Interesting ports on web1 (10.1.2.5): PORT STATE SERVICE 80/tcp filtered http 

nmap真是足够聪明,它通常可以分辨出端口关闭的真正原因,是真正的关闭还是端口被防火墙阻挡。通常情况下,一个端口真正关闭时,nmap将声明其为关闭。 这里它的状态为过滤。这告诉我们某个防火墙阻挡了数据包的通过并抛弃了这些数据包。你需要检查网关(10.1.1.1)和web1上的防火墙规则,确认80端口是否被阻挡。

检查本地(服务端)端口监听(netstat)

测试80端口是否被监听。netstat-lnp命令可以列出所有正在被监听的端口以及打开这些端口的进程。可以仅运行这个命令,然后通过解析输出得到获取监听80端口的所有信息,或者可以通过使用grep命令仅显示与监听80端口有关的信息。

$ sudo netstat -lnp | grep :80 
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 919/apache 

第一列告诉你端口所使用的网络协议。第二列和第三列显示接受和发送的队列(这里均设置为0)。你需要注意的是第四列,它列出了主机监听的本地地址。这里0.0.0.0:80告诉我们主机监听所有ip的80端口流量。

查看防火墙规则(iptables)

使用iptables命令可以列出所有防火墙规则,如果你的防火墙被禁用,那么输出看起来就像这样:

$ sudo /sbin/iptables -L 
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 

注意,默认的规则是接收(ACCEPT)。不过,即使任何规则都没有,防火墙也很可能默认丢弃收到的所有数据包。如果是那样的话,你看到的输出可能与下面的类似:

$ sudo /sbin/iptables -L 
Chain INPUT (policy DROP) target prot opt source Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination 

另一方面,如果存在一个限制80端口的防火墙规则,输出可能看起来像这样:

$ sudo /sbin/iptables -L -n 
Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 reject-with icmp-port-unreachable 
Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source dest

查看网络带宽使用(iftop)

apt-get install iftop

iftop本身不关心进程,而是列出了主机与远程IP之间占用大部分带宽的网络连接。 在iftop屏幕最上方一行显示了接口的整体流量状况。在它的正下方,第一列是源IP地址,紧接着是目标IP地址,它们之间的箭头显示它们之间是否正在传输数据,是从你的主机发出的还是从远端主机接收的。这些列后面的三列分别表示2s、10s、40s时两个主机之间的数据传输速率。就像平均负载一样,你可以看到带宽是从现在开始飙升,还是在过去的一段时间飙升的。在屏幕最下方,你可以看到发送数据(TX)和接收数据(RX)的统计以及数据传输总计。与top类似,接口会定期更新。 默认情况下,iftop会试图将IP地址解析成主机名。这么做的一个缺点是,当一个远程DNS服务器响应很慢的时候,它可能减缓报表的输出速度。另一个缺点是iftop中的DNS解析增加了额外的网络流量。若想要禁用网络解析,只需运行带有-n选项的iftop命令。 可通过按S或D键切换分别只显示源主机或目标主机的端口。当你在服务器上运行iftop时,只显示源端口十分奏效。

抓取数据包(tcpdump)

限于tcpdump的工作机制,你必须在root权限下使用它。默认情况下,它会通过扫描网络接口,选择第一个可用接口,然后将捕获、解析并输出它看到的数据包信息。执行命令tcpdump -n(不将IP解析为主机名,所以不会降低速度)。 每次抓取数据包完毕,只需按Ctrl-C组合键来退出tcpdump程序。当tcpdump退出时,它会告诉你抓到多少数据包,内核丢弃了多少数据包。

例如,如果想排除主机与主机名为web1的服务器之间的故障,可以告诉tcpdump,只显示到达该主机或从该主机发送的报文:

$ sudo tcpdump -n host web1 

如果想要做相反的事情,即显示web1之外的所有流量,你可以用:

$ sudo tcpdump -n not host web1 

还可以过滤特定端口的流量。比如,如果只想看到DNS的流量(端口53),可以输入:

$ sudo tcpdump -n port 53 

如果想捕捉到所有流经端口80或端口443的Web流量,可以输入:

$ sudo tcpdump -n port 80 or port 443 

可以使用命令行重定向把tcpdump的输出保存到文件中:

$ sudo tcpdump -n host web1 > outputfile 

保存原始数据包转储最简单的方法是运行带有-w选项的tcpdump命令:

$ sudo tcpdump -w output.pcap 

如果你想在文件达到10MB后将文件分卷,你可以输入:

$ sudo tcpdump -C 10 -w output.pcap 

你可以将它限制为最多创建5个分卷文件:

$ sudo tcpdump -C 10 -W 5 -w output.pcap 

你可以使用tcpdump的-r选项进行数据包实时重播。只需要指定原始数据包输出文件作为参数。可以指定过滤器和-n等其他选项,就像使用tcpdump对实时流量进行监控:

$ sudo tcpdump -n -r output.pcap

docs

  • ubuntu/debian下安装使用dig

  • DevOps故障排除

你可能感兴趣的:(网络故障排查常用命令集)