iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

使用網路工具

在 Linux 是一個擁有強大網路功能的作業系統之一,有時候在我們進行問題排除、維護或檢測時會使用工具來確認網路是否如預期般的正確運作。

為了讓這些工作更加順利,Linux 提供了一系列專用的網路工具,這些工具各有其特點和用途。從基本的 ping 指令,用於測試網絡連接的穩定性,到更進階的 ethtool,用於深入檢查和調整網絡接口設定,Linux 的網路工具可以幫助管理員更好地理解和管理系統的網路環境。

以下,我們將詳細介紹幾個常用的網路工具,包括它們的主要用途、使用範例和輸出概覽。

當然,以下是各個網路工具的使用範例、簡化的輸出,以及它們的主要用途和說明。

ping

用於檢查與遠端主機的網路連接,在運作時我們使用 ping 傳送封包到目標主機,用來進行簡單的確認,它就像偵察兵一樣,讓管理員配出一個封包進行偵察以碓認目標狀況。

ping 使用 ICMP 封包進行測試,如果目標主機能夠接收與回覆,則發送端就能依這個回應得到下列的數據:

  • 目標主機名稱或 IP 地址: 正嘗試與哪個主機或 IP 地址建立連接。
  • ICMP Echo Request 和 Echo Reply: 表示發起方和接收方之間的請求和回應。每一個回應都會有一個相對應的 Echo Request。
  • TTL (Time to Live): 封包在網絡中最多能經過多少個中繼節點(通常是路由器或交換機)。
  • RTT (Round Trip Time): 封包從發出到返回所經過的總時間。
  • 封包丟失率: 表示了發送和接收數據包之間的差異,用以評估網絡的可靠性。
  • 統計摘要: 在 ping 指令完成後,會提供一個包括最小、最大和平均 RTT,以及其他相關統計資訊的摘要。

我們使用下列方式來測試連到 example.com 這個網路位置,因為在 Linux 中 ping 會一直不斷測試,所以我們加上 -c 4 參數代表測試 4 次就離開,然後 ping 會總結這 4 次的結果。

使用下列方式可以進行測試:

student$ sudo ping -c 4 example.com

結果如下:

PING example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=52 time=130 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=52 time=133 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=3 ttl=52 time=133 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=4 ttl=52 time=133 ms

--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 130.773/132.960/133.770/1.315 ms

由上列的輸出結果,可以看到 example.com 的 IP 為 93.184.216.34,且中間沒有遺失封包 (0% packet loss)。

因為 ping 使用 ICMP 封包進行傳送,有些防火牆不允許使用 ICMP 封包進行連線,這個時候 ping 就會失敗,因此使用 ping 無法直接證明目標主機是否正在運行,有時要配合其它工具來進一步確認。

在實務上如果是提供 web 的服務,但目標主機不允許 ICMP 封包的話,此時 ping 就會失敗,那麼我們就要使用如 curl 這類的網頁用戶端工具做進一步服務層級測試。

ss

ss 是用來檢查 Linux 系統上的 socket 狀態的一個工具,也是 netstat 工具的替代品,所以在一些發行版上(如 Enterprise Linux 7 開始)在最小安裝時會發現沒有 netstat 可以使用。ss 提供了更多的選項和更快速的性能。當我們需要監控或調試網絡連接和狀態時,ss 是一個非常實用的工具。

ss 可以用來查詢多種不同類型的網路連接,包括 TCP、UDP、Unix socket 等。它也支持多種過濾選項,例如按照連接埠號 (Port)、狀態或網路協定來過濾。

常用的參中數如下:

  • -t: 顯示 TCP socket。
  • -u: 顯示 UDP socket。
  • -l: 顯示正在監聽的 socket。
  • -n: 不解析服務名,直接顯示 IP 和 Port 號。
  • -p: 顯示行程資訊。

我們可以透過下列方式,列出現在主機上有哪些開啟的連接埠:

student$ sudo ss -ntulp
Netid  State      Recv-Q Send-Q    Local Address:Port   Peer Address:Port   
tcp    LISTEN     0      128                   *:22                *:*      users:(("sshd",pid=5351,fd=3))
tcp    LISTEN     0      100           127.0.0.1:25                *:*      users:(("master",pid=5822,fd=13))
tcp    LISTEN     0      128                  :::22               :::*      users:(("sshd",pid=5351,fd=4))
tcp    LISTEN     0      100                 ::1:25               :::*      users:(("master",pid=5822,fd=14))

透過上面輸出範例,我們可以得到主機的連接埠資訊:

  • Netid: 網絡識別碼,這裡是 tcp,代表這是 TCP 連接。
  • State: 這是 socket 的狀態。LISTEN 狀態表示 socket 正在等待來自遠端連接。
  • Recv-Q 和 Send-Q: 這些是接收和發送佇列。在這裡,它們都是 0,表示沒有正在排隊的資料。
  • Local Address:Port: 這是本地地址和 Port 號。* 表示綁定到所有的 IP 上。
  • Peer Address:Port: 這是遠程地址和 Port。在這個例子中,因為是 LISTEN 狀態,所以使用 *:*:::* 表示它會接受任何遠端 IP 的連接。
  • users: 這列顯示哪個行程正在使用這個 socket。例如 sshd 行程(PID 為 5351)在 Port 22 聆聽請求。

在資訊安全議題上,系統管理人員需要知道主機有哪些連接埠是對外(開在非本機 IP)開放的,這個資訊有助於我們對外來威脅的掌握度。

在另一方面,由於網路服務需要使用連接埠來提供服務,所以也可以使用這個方法確認啟用的服務是否有在正確的 Port 上運作。

除了查詢本機開啟的 Port 之外,我們有時候也會需要瞭解主機本身和誰連線,或是誰來連主機,在這種情況下只要去除 -p 參數就可以了。

下列方式查出和主機正在以 TCP 與 UDP 連線的資訊:

$ sudo ss -ntu
Netid  State      Recv-Q Send-Q     Local Address:Port     Peer Address:Port              
tcp    ESTAB      0      36         1.2.3.4:888            10.3.5.27:52658              
tcp    ESTAB      0      0          192.168.5.30:80        192.168.3.80:52667              
tcp    ESTAB      0      0          192.168.5.30:80        192.168.3.240:52668 

從上輸出可以看到目前有 3 個連線,與來原端 IP(Peer Address)資訊。

host

host 是一個簡單的命令行工具,用於進行 DNS 查詢。它是 BIND 套件(Berkeley Internet Name Domain)的一部分,用於解析網路名稱。這個工具在日常系統管理和排解網路問題中是非常實用的。

在 Enterprise Linux 中,host 被收錄在 bind-utils 套件中,如果沒有這個指令則可以使用下列方式安裝:

student$ sudo dnf install -y bind-utils

bind-utils 中也包含了常用的 nslookupdig,但筆者認為在大部份的情境下只是需要確認名稱與 IP 是否對應正確,所以使用 host 指令更為直觀且方便。由於 DNS 問題排出已超出本書設定,所以在此僅介紹 host 指令應用。

以下為一般情境的查詢方式:

  1. 查出 example.com 的 IPv4 與 IPv6 記錄

    student$ host example.com
    

    輸出可能會顯示 example.com 的 A 記錄(IPv4 地址)和 AAAA 記錄(IPv6 地址)。

    example.com has address 93.184.216.34
    example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
    
  2. 查詢 93.184.216.34 對應的名稱:

    student$ host 93.184.216.34
    

    顯示 IP 地址 93.184.216.34 相關的 PTR 記錄。

    34.216.184.93.in-addr.arpa domain name pointer example.com.
    

    由 IP 找出對應的完整名稱是 DNS 反解的流程,實務上並非所有 IP 都能查出其對應的主機名稱,所以有時候我們會得到 not found: 3(NXDOMAIN) 的字眼,代表這個 IP 沒有設定反向對應。

  3. 指定使用其它 DNS 主機查詢

    有時候我們需要驗證自己的 DNS 主機是否正確運作,會和外部 DNS 的查詢結果做比對,此時只要在指令最後方設定指定的 DNS 主機就可以了。

    下列示範使用 Google 的 8.8.8.8 公開 DNS 服務查詢 example.com 的結果:

    student$ host example.com 8.8.8.8
    example.com has address 93.184.216.34
    example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
    

traceroute

traceroute 是一個用於檢查封包從一台電腦到目標電腦之間經過的節點網絡診斷工具。它可以用於識別網路延遲的來源、找出封包損失的地方,或是瞭解封包需要經過哪些中間節點才能到達目的地。

traceroute 用法很簡單,通常只要在後方加入要測試的目標主機名稱或 IP 就可以了,也可以透過下列幾個常用選項來做運用:

  • -I: 使用 ICMP ECHO 請求而非預設的 UDP 或 TCP。
  • -T: 使用 TCP SYN 進行跟踪,這通常用於繞過防火牆。
  • -p: 指定要使用的連接埠號。
  • -n: 查詢結果只使用 IP 顯示。

若我們需要從主機到 example.com 的節點資訊,並希望只顯示 IP 位置而不要反解,那麼可以使用用 -n 參數。

參考實做方式如下:

student$ sudo traceroute -n example.com
traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets
 1  10.1.1.254  0.151 ms  0.164 ms  0.133 ms
 2  15.62.X.Y  4.738 ms  4.704 ms  4.641 ms
 3  168.34.A.B  12.276 ms  12.268 ms  12.235 ms
 4  220.128.5.14  2.567 ms 220.128.5.42  2.256 ms 220.128.9.242  2.215 ms
 5  220.128.9.126  2.222 ms 220.128.9.101  1.660 ms 220.128.9.126  2.155 ms
 6  220.128.9.101  1.626 ms 202.39.91.69  130.675 ms 220.128.9.97  1.824 ms
 7  202.39.91.69  130.652 ms  130.585 ms 62.115.162.86  130.849 ms
 8  62.115.162.86  130.830 ms  130.983 ms 213.248.67.111  137.363 ms
 9  213.248.67.111  137.355 ms  137.323 ms  137.283 ms
10  152.195.76.129  131.408 ms 93.184.216.34  130.682 ms 152.195.76.129  131.726 ms
11  93.184.216.34  130.779 ms  130.752 ms  130.767 ms

從輸出結果來看,我們可以判別要到 example.com 需要經過至少 10 個節點,這有助我們在做封包路徑的檢查,當然範例中的路徑不代表大家都是一樣的,依據使用者的網路提供者、區域等因素會有不同的路徑顯示。


上一篇
Day 23: 磁碟空間與掛載
下一篇
Day 25: 設定網路組態
系列文
Linux 升華:初學者的探索到專家的洞察30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言