Network Troubleshotting

January 28, 2018

通常如果實體設備能正常工作,接下來會藉由一些網路相關的指令或工具進行網路上的除錯。像是確認 A 能否抵達 B 等。下面描述的是一些除錯的指令與工具。

ping

先前有提到過,這邊就不提了

DSN Troubleshotting

dig

dig 驗證 DNS 主機地址、MX 記錄和所有其他 DNS 記錄,方便了解 DNS 部署情況。

$ dig www.nkust.edu.tw

; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.nkust.edu.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 462
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; MBZ: 0005 , udp: 1280
;; QUESTION SECTION:
;www.nkust.edu.tw.              IN      A

;; ANSWER SECTION:
www.nkust.edu.tw.       5       IN      A       140.133.78.31

;; Query time: 220 msec
;; SERVER: 192.168.137.2#53(192.168.137.2)
;; WHEN: Sat Sep 07 09:52:09 CST 2019
;; MSG SIZE  rcvd: 61

針對 MX 紀錄

$ dig MX www.nkust.edu.tw

; <<>> DiG 9.10.3-P4-Ubuntu <<>> MX www.nkust.edu.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41967
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; MBZ: 0005 , udp: 1280
;; QUESTION SECTION:
;www.nkust.edu.tw.              IN      MX

;; AUTHORITY SECTION:
nkust.edu.tw.           5       IN      SOA     ns1.nkust.edu.tw. hostmaster. 876 900 600 86400 3600

;; Query time: 49 msec
;; SERVER: 192.168.137.2#53(192.168.137.2)
;; WHEN: Sat Sep 07 09:52:34 CST 2019
;; MSG SIZE  rcvd: 95

所有紀錄

$ dig ANY nkust.edu.tw

; <<>> DiG 9.10.3-P4-Ubuntu <<>> ANY nkust.edu.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34785
;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; MBZ: 0005 , udp: 1280
;; QUESTION SECTION:
;nkust.edu.tw.                  IN      ANY

;; ANSWER SECTION:
nkust.edu.tw.           5       IN      NS      ns4.nkust.edu.tw.
nkust.edu.tw.           5       IN      NS      ns3.nkust.edu.tw.
nkust.edu.tw.           5       IN      NS      ns2.nkust.edu.tw.
nkust.edu.tw.           5       IN      NS      ns1.nkust.edu.tw.
nkust.edu.tw.           5       IN      MX      10 ALT3.ASPMX.L.GOOGLE.COM.
nkust.edu.tw.           5       IN      MX      1 ASPMX.L.GOOGLE.COM.
nkust.edu.tw.           5       IN      MX      5 ALT1.ASPMX.L.GOOGLE.COM.
nkust.edu.tw.           5       IN      MX      5 ALT2.ASPMX.L.GOOGLE.COM.
nkust.edu.tw.           5       IN      MX      10 ALT4.ASPMX.L.GOOGLE.COM.

;; Query time: 46 msec
;; SERVER: 192.168.137.2#53(192.168.137.2)
;; WHEN: Sat Sep 07 09:53:21 CST 2019
;; MSG SIZE  rcvd: 231

反向搜尋獲取 DNS 資訊

$ dig -x 8.8.8.8

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -x 8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44451
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; MBZ: 0005 , udp: 1280
;; QUESTION SECTION:
;8.8.8.8.in-addr.arpa.          IN      PTR

;; ANSWER SECTION:
8.8.8.8.in-addr.arpa.   5       IN      PTR     dns.google.

;; Query time: 31 msec
;; SERVER: 192.168.137.2#53(192.168.137.2)
;; WHEN: Sat Sep 07 09:54:44 CST 2019
;; MSG SIZE  rcvd: 73

dig 利用 /etc/resolv.conf 中列出的 server 進行查詢。

host

很像 dig 的指令,可以用來針對 DNS 偵錯。

$ host -a nkust.edu.tw
Trying "nkust.edu.tw"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12012
;; flags: qr rd ra; QUERY: 1, ANSWER: 12, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;nkust.edu.tw.                  IN      ANY

;; ANSWER SECTION:
nkust.edu.tw.           5       IN      TXT     "v=spf1 ip4:140.127.113.0/24 ip4:140.133.78.0/24 ip4:163.18.1.10 ip4:120.119.140.0/24 ipv4:61.216.112.118 ip4:163.18.2.113 include:_spf.google.com ~all"
nkust.edu.tw.           5       IN      TXT     "google-site-verification=OhgxCcOmuGjTkMf_11whQSN4SYxrcEVJkbm6WFLDMZY"
nkust.edu.tw.           5       IN      MX      10 alt4.aspmx.l.google.com.
nkust.edu.tw.           5       IN      MX      1 aspmx.l.google.com.
nkust.edu.tw.           5       IN      MX      5 alt1.aspmx.l.google.com.
nkust.edu.tw.           5       IN      MX      5 alt2.aspmx.l.google.com.
nkust.edu.tw.           5       IN      MX      10 alt3.aspmx.l.google.com.
nkust.edu.tw.           5       IN      SOA     ns1.nkust.edu.tw. hostmaster. 876 900 600 86400 3600
nkust.edu.tw.           5       IN      NS      ns2.nkust.edu.tw.
nkust.edu.tw.           5       IN      NS      ns1.nkust.edu.tw.
nkust.edu.tw.           5       IN      NS      ns4.nkust.edu.tw.
nkust.edu.tw.           5       IN      NS      ns3.nkust.edu.tw.

Received 510 bytes from 192.168.137.2#53 in 50 ms
$ host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer dns.google.
$ host -T stu.edu.tw
stu.edu.tw has address 120.119.28.13
stu.edu.tw has address 120.119.28.14
stu.edu.tw has address 172.30.0.84
stu.edu.tw has IPv6 address 2001:e10:c41:1::13
stu.edu.tw has IPv6 address 2001:e10:c41:1::14
stu.edu.tw mail is handled by 5 alt2.aspmx.l.google.com.
stu.edu.tw mail is handled by 1 aspmx.l.google.com.
stu.edu.tw mail is handled by 10 aspmx2.googlemail.com.
stu.edu.tw mail is handled by 10 aspmx3.googlemail.com.
stu.edu.tw mail is handled by 30 aspmx4.googlemail.com.
stu.edu.tw mail is handled by 30 aspmx5.googlemail.com.
stu.edu.tw mail is handled by 5 alt1.aspmx.l.google.com.

traceroute

可以從此指令得知本地到目標要經過多少 hop。訊息中可以得知每一 hop 的設備名稱和標示甚至可以知道該延遲來自哪個設備。

$ traceroute www.google.com 
# -n 可避免 DNS 反查
# -I 傳 ICMP Packet
traceroute to www.google.com (216.58.200.228), 30 hops max, 60 byte packets
 1  192.168.137.2 (192.168.137.2)  0.416 ms  0.773 ms  0.640 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  *^C

mtr

算是比 traceroute 更先進,在預設中 ubuntu 並無 traceroute。有著即時的數據。

$ mtr www.nkust.edu.tw

ss

socket statistics 命令 ssnetstat 的取代未來可能會將 netstat 移除,它比 netstat 更快,並提供更多訊息。

ss 直接從 kernel 獲取其訊息,不是像 netstat 依賴 /proc

Netid  State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port
u_str  ESTAB      0      0       * 19250                 * 19251
u_str  ESTAB      0      0      /run/systemd/journal/stdout 22575                 * 22571
u_str  ESTAB      0      0       * 15802                 * 15803
u_str  ESTAB      0      0       * 15803                 * 15802
u_str  ESTAB      0      0      /run/systemd/journal/stdout 15935                 * 15868
u_str  ESTAB      0      0       * 15512                 * 15514
u_str  ESTAB      0      0       * 22571                 * 22575
u_str  ESTAB      0      0      /run/systemd/journal/stdout 15936                 * 15930
u_str  ESTAB      0      0       * 12423                 * 13118
u_str  ESTAB      0      0       * 19603                 * 19604
u_str  ESTAB      0      0       * 15930                 * 15936
u_str  ESTAB      0      0      /run/systemd/journal/stdout 13118                 * 12423
u_str  ESTAB      0      0      /run/systemd/journal/stdout 17241                 * 17240
u_str  ESTAB      0      0      /run/systemd/journal/stdout 15514                 * 15512
u_str  ESTAB      0      0       * 15868                 * 15935
u_str  ESTAB      0      0      /run/systemd/journal/stdout 17640                 * 17461
u_str  ESTAB      0      0      /run/containerd/containerd.sock 19604                 * 19603
u_str  ESTAB      0      0       * 17240                 * 17241
u_str  ESTAB      0      0      /run/systemd/journal/stdout 13120                 * 12543
u_str  ESTAB      0      0       * 16127                 * 16130
u_str  ESTAB      0      0      /run/systemd/journal/stdout 16130                 * 16127
u_str  ESTAB      0      0       * 19251                 * 19250
u_str  ESTAB      0      0       * 15448                 * 15450
u_str  ESTAB      0      0      /run/systemd/journal/stdout 15450                 * 15448
u_str  ESTAB      0      0       * 12543                 * 13120
u_str  ESTAB      0      0       * 14588                 * 14619
u_str  ESTAB      0      0      /run/systemd/journal/stdout 15754                 * 15734
u_str  ESTAB      0      0      /run/systemd/journal/stdout 16129                 * 16066
u_str  ESTAB      0      0       * 16066                 * 16129
u_str  ESTAB      0      0       * 15734                 * 15754
u_str  ESTAB      0      0       * 15741                 * 15804
u_str  ESTAB      0      0      /run/systemd/journal/stdout 17834                 * 17819
u_str  ESTAB      0      0       * 19599                 * 19600
u_str  ESTAB      0      0       * 19410                 * 19411
:

顯示 TCP sockets 使用 -t,UPD 使用 -u,unix socket 使用 -x

$ ss -at
State       Recv-Q Send-Q                                                     Local Address:Port                                                                      Peer Address:Port
LISTEN      0      128                                                                    *:ssh                                                                                  *:*
LISTEN      0      128                                                            127.0.0.1:mysql                                                                                *:*
LISTEN      0      128                                                                    *:http                                                                                 *:*
ESTAB       0      0                                                        192.168.137.142:ssh                                                                      192.168.137.1:11326
LISTEN      0      128                                                                   :::ssh                                                                                 :::*
LISTEN      0      128                                                                   :::http                                                                                :::*

查看已建立的 TCP socket

$  ss -t4 state established
Recv-Q Send-Q                                                          Local Address:Port                                                                           Peer Address:Port
0      308                                                           192.168.137.142:ssh                                                                           192.168.137.1:11326

arp

IP 位址對應的 MAC 位址,稱為 ARP table。如果連接到 IP 位址,路由器將檢查 MAC 位址。如果已被緩存,則不使用 ARP table。

$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.137.2            ether   00:50:56:ef:e2:19   C                     ens33
192.168.137.254          ether   00:50:56:ef:fe:84   C                     ens33
192.168.137.1            ether   00:50:56:c0:00:08   C                     ens33

tcpdump

可用來蒐集流量並分析,但功能似乎沒 wireshark 齊全。

$ tcpdump -i <Iface>
$ tcpdump -i <Iface> tcp # 針對 TCP 蒐集
$ tcpdump -i <Iface> port 80 # 針對 port 80 蒐集
$ tcpdump -i <Iface> src <IP> # 針對來源 IP 抓取
$ tcpdump -c <Num> -i <Iface> # -c 表示要抓取的 packet 數量
$ tcpdump -w [PATH] -i <Iface>  # -w 存檔
$ tcpdump -r [PATH] # -r 讀檔