網絡故障排查經常使用命令集

查詢路由表(route)

route命令能夠顯示你當前的路由表信息,包括你的默認網關。html

$ 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地址解析成主機名。web

ping網關(ping)

使用ping命令來確認可否與網關通訊:apache

$ 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正常通訊。ubuntu

查詢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地址,則須要在這個文件中添加一個域名服務器配置信息。tcp

檢查路由(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命令:.net

$ 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

相關文章
相關標籤/搜索