查询路由表(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故障排除