深入理解網路分層架構是進行有效網路診斷的關鍵。本文從 OSI 模型出發,闡述各層級的功能和相互關係,並著重介紹在 Linux 環境下,如何利用 nmcli 管理網路介面、使用 arp 命令分析 ARP 表,以及 TCP 和 UDP 協定在埠號管理和通訊流程中的重要性。這些工具和技術的熟練運用,能大幅提升工程師在網路故障排除時的效率。
使用 Linux 和 Linux 工具進行網路診斷
本章節將介紹如何使用 Linux 工作站進行網路故障排除。完成本章後,您應該具備故障排除本地和遠端網路服務的能力,以及能夠「清點」您的網路及其服務。
網路基礎 – OSI 模型
討論網路和應用程式概念時,使用層級模型很方便,每一層大致負責更高層次和更抽象的功能,以及更底層的原始功能。以下圖表描述了 OSI 模型的大致內容:
此圖示描述 OSI 模型的層級結構及其功能描述。
在實際使用中,層級通常由下往上編號。因此,第 2 層的問題通常涉及 MAC 位址和交換機,並且侷限於該工作站所在的 VLAN(通常意味著本地子網路)。第 3 層的問題則涉及 IP 位址、路由或封包(因此會涉及路由器和相鄰子網路或更遠的網路)。
如同任何模型一樣,總是有混淆的空間。例如,第 6 層和第 7 層之間長期存在模糊性。第 5 層和第 6 層之間也是如此,雖然 IPSEC 明確屬於加密範疇,因此屬於第 6 層,但它也可以被視為隧道協定(取決於您的觀點和實作方式)。即使在第 4 層,TCP 也具有會話的概念,因此似乎有一腳踏入第 5 層 – 儘管連線埠的概念使其牢牢地屬於第 4 層。
圖表說明
此圖示呈現 OSI 模型的七個層級及其相互關係。
使用 nmcli 組態網路介面
nmcli 命令允許我們以互動式或命令列方式調整多個介面引數。命令列介面尤其允許我們在指令碼中調整網路設定,從而能夠擴充套件到同時調整數十、數百或數千台工作站的設定。
常見的 Ethernet 設定選項
802-3-ethernet.port: –802-3-ethernet.speed: 0802-3-ethernet.duplex: –802-3-ethernet.auto-negotiate: no802-3-ethernet.mac-address: –802-3-ethernet.mtu: auto
常見的 IPv4 設定選項
ipv4.method: autoipv4.dns: –ipv4.dns-search: –ipv4.gateway: –ipv4.routes: –
程式碼範例:使用 nmcli 檢視介面設定
nmcli connection show
內容解密:
- 命令功能:
nmcli connection show用於顯示目前的網路連線設定。 - 輸出內容:輸出包括連線的 UUID、介面名稱、連線型別等詳細資訊。
- 實用價值:此命令對於檢查和故障排除網路組態非常有用。
網路診斷工具
本章節將介紹多種網路診斷工具,包括原生 Linux 命令和安裝的應用程式,如 netcat 和 nmap。
使用原生 Linux 命令進行遠端連線埠列舉
# 範例命令
nc -vz example.com 80
內容解密:
- 命令功能:
nc -vz example.com 80用於測試與 example.com 的第 80 連線埠的連線。 nc命令引數:-v表示詳細輸出,-z表示僅測試連線埠是否開啟。- 實用價值:此命令可用於檢查遠端主機的特定連線埠是否開放。
無線網路操作與故障排除基礎
本章節將介紹無線網路操作和故障排除的基礎知識。如果您沒有無線網路卡,可能需要使用 Wi-Fi 介面卡來完成相關範例。
使用Linux和Linux工具進行網路診斷(四十六)
當然,總有空間讓幽默登場——常見的智慧/笑話是,人們在這個模型中形成了第8層。因此,第8層問題可能涉及幫助台電話、預算討論,或與您組織的管理階層會面以解決問題!
我們在下圖中看到的概念,是在使用這個模型時要牢記的最重要概念。當資料被接收時,它會沿著堆積疊向上移動,從最原始的結構封裝到越來越抽象/高階的結構(例如,從位元到幀到封包到API到應用程式)。傳送資料則是將資料從應用層向二進製表示移動(從上層到下層)。
第1-3層通常被稱為媒體或網路層,而第4-7層通常被稱為主機或應用層: 圖3.2 – 沿著OSI堆積疊上下移動,封裝和解封裝
這個概念使得供應商能夠製造出能夠與來自其他供應商的網路卡互動的交換器,例如,也使得交換器能夠與路由器一起工作。這也是我們的應用生態系統的動力來源——在大多數情況下,應用程式開發人員不必擔心IP地址、路由或無線和有線網路之間的差異,所有這些都被照顧好了——網路可以被視為一個黑盒子,您在其中一端傳送資料,並且可以肯定它會在另一端以正確的位置和格式出現。
現在我們已經建立了OSI模型的基礎,讓我們透過探索arp命令和本地ARP表來詳細瞭解資料鏈路層。
第2層 – 使用ARP關聯IP和MAC地址
隨著OSI模型的建立,我們可以看到到目前為止圍繞IP地址的討論都集中在第3層。這是一般人,甚至許多IT和網路人員,傾向於認為網路路徑停止在他們的理解中的地方——他們可以沿著那條路走那麼遠,並認為其餘的是黑盒子。但作為網路專業人員,第1層和第2層非常重要——讓我們從第2層開始。
理論上,MAC地址是燒錄到每個網路介面中的地址。雖然這通常是正確的,但它也很容易更改。那麼,MAC地址是什麼?它是一個12位數(6位元組/48位元)的地址,通常以十六進位制顯示。在顯示時,每個位元組或雙位元組通常用.或-分隔。因此,典型的MAC地址可能是00-0c-29-3b-73-cb或9a93.5d84.5a69(顯示兩種常見的表示形式)。
在實踐中,這些地址用於在同一VLAN或子網中的主機之間進行通訊。如果您檢視封包捕捉(我們將在後面的章節中討論,在第11章,Linux中的封包捕捉和分析),在TCP對話開始時,您將看到傳送站傳送廣播(傳送到子網中所有站的請求)ARP請求,詢問“誰擁有IP地址x.x.x.x”。擁有該地址的主機的ARP回覆將包括“是我,我的MAC地址是aaaa.bbbb.cccc”。如果目標IP地址位於不同的子網,傳送者將“ARP for”該子網的閘道(通常是預設閘道,除非定義了本地路由)。
往後,傳送者和接收者使用MAC地址進行通訊。兩個主機所連線的交換器基礎架構僅在每個VLAN中使用MAC地址,這是交換器比路由器快得多的原因之一。當我們檢視實際封包時(在封包捕捉的章節中),您將看到每個封包中既有傳送和接收MAC地址,也有IP地址。
ARP請求被快取在每個主機的ARP快取或ARP表中,可以使用arp命令顯示:
$ arp -a
? (192.168.122.138) at f0:ef:86:0f:5d:70 [ether] on ens33
? (192.168.122.174) at 00:c3:f4:88:8b:43 [ether] on ens33
? (192.168.122.5) at 00:5f:86:d7:e6:36 [ether] on ens33
? (192.168.122.132) at 64:f6:9d:e5:ef:60 [ether] on ens33
? (192.168.122.7) at c4:44:a0:2f:d4:c3 [ether] on ens33
_gateway (192.168.122.1) at 00:0c:29:3b:73:cb [ether] on ens33
內容解密:
此輸出顯示了主機上的ARP表,將第3層IP地址對映到第2層MAC地址和第1層網路介面卡(NIC)。MAC地址表項通常是從流量中“學習”的——既包括ARP請求,也包括回覆。它們會過期——通常,如果一段時間內沒有看到來自或去往某個MAC地址的流量,該表項將被清除。您可以使用/proc目錄中的檔案檢視超時值:
$ cat /proc/sys/net/ipv4/neigh/default/gc_stale_time
60
$ cat /proc/sys/net/ipv4/neigh/ens33/gc_stale_time
60
注意,既有預設值(以秒為單位),也有每個網路介面卡的值(這些通常比對)。這可能看起來很短——交換器上的比對MAC地址表(通常稱為CAM表)通常為5分鐘,而路由器上的ARP表通常為14,400秒(4小時)。這些值都與資源有關。總體而言,工作站有足夠的資源頻繁傳送ARP封包。交換器從流量中學習MAC地址(包括ARP請求和回覆),因此將該計時器設定為比工作站計時器稍長是有意義的。同樣,在路由器上設定較長的ARP快取計時器可以節省其CPU和NIC資源。路由器上的ARP快取超時預設值很長,因為在過去,路由器的頻寬和CPU資源相比網路上的其他裝置要有限得多。雖然現代情況已經改變,但路由器上ARP快取超時的預設值仍然很長。在路由器或防火牆遷移過程中,這是一個容易被遺忘的事情——我曾參與過很多這樣的維護視窗,在正確的路由器上執行clear arp命令後,一切都“神奇地”正常了。
我們還沒有討論過Linux中的/proc目錄——這是一個“虛擬”目錄,包含了當前Linux主機上各種事物的設定和狀態。這些不是“真實”的檔案,但它們被表示為檔案,以便我們可以使用相同的命令:cat、grep、cut、sort、awk等。您可以檢視網路介面錯誤和值,例如在/proc/net/dev中,例如(注意這些值如何不能正確對齊):
$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
第二層網路:使用ARP關聯IP與MAC位址
在網路診斷中,瞭解如何操作和管理網路介面的MAC位址是非常重要的。Linux提供了多種工具和方法來檢視和修改網路介面的MAC位址。
檢視網路介面資訊
首先,我們可以使用ip link show命令來檢視網路介面的資訊,包括其MAC位址。
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:33:2d:05 brd ff:ff:ff:ff:ff:ff
內容解密:
ip link show命令用於顯示網路介面的資訊。lo是本地回環介面,通常用於本機通訊。ens33是乙太網路介面,link/ether後面跟著的是其MAC位址。
我們也可以使用ifconfig命令來檢視網路介面的資訊。
$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1400
inet 192.168.122.22 netmask 255.255.255.0 broadcast 192.168.122.255
inet6 fe80::1ed6:5b7f:5106:1509 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:33:2d:05 txqueuelen 1000 (Ethernet)
RX packets 384968 bytes 256118213 (256.1 MB)
RX errors 0 dropped 671 overruns 0 frame 0
TX packets 118956 bytes 12022334 (12.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
內容解密:
ifconfig命令用於顯示和組態網路介面。ether後面跟著的是網路介面的MAC位址。
修改MAC位址
要修改MAC位址,可以使用ip link set命令。首先,需要將網路介面關閉。
$ sudo ip link set dev ens33 down
$ sudo ip link set dev ens33 address 00:88:77:66:55:44
$ sudo ip link set dev ens33 up
內容解密:
sudo ip link set dev ens33 down用於關閉網路介面ens33。sudo ip link set dev ens33 address 00:88:77:66:55:44用於將ens33的MAC位址修改為00:88:77:66:55:44。sudo ip link set dev ens33 up用於啟用網路介面ens33。
另外,也可以使用圖形化介面來修改MAC位址。在網路設定中,可以找到相關的選項來修改MAC位址。
ARP表操作
ARP(Address Resolution Protocol)是用於將IP位址解析為MAC位址的協定。我們可以檢視和修改ARP表。
$ arp -a | grep 192.168.122.200
? (192.168.122.200) at 00:11:22:22:33:33 [ether] PERM on ens33
內容解密:
arp -a命令用於顯示ARP表。grep 192.168.122.200用於過濾出特定IP的ARP記錄。
要新增一個靜態ARP記錄,可以使用以下命令:
$ sudo arp -s 192.168.122.200 00:11:22:22:33:33
內容解密:
sudo arp -s命令用於新增一個靜態ARP記錄。192.168.122.200是IP位址,00:11:22:22:33:33是對應的MAC位址。
要刪除一個ARP記錄,可以使用以下命令:
$ sudo arp -i ens33 -d 192.168.122.200
內容解密:
sudo arp -i ens33 -d命令用於刪除指定介面上的ARP記錄。ens33是網路介面名稱,192.168.122.200是要刪除的IP位址。
網路診斷中的Layer 2與Layer 4:從MAC地址到TCP/UDP通訊
在網路診斷的世界中,瞭解OSI模型的各個層級是至關重要的。本文將探討Layer 2(資料鏈路層)與Layer 4(傳輸層)的運作原理,特別是如何使用ARP協定將IP位址與MAC地址進行對映,以及TCP和UDP協定如何利用埠號實作通訊。
Layer 2:ARP協定與MAC地址
在Layer 2,ARP(位址解析協定)扮演著至關重要的角色。它負責將IP位址對映到對應的MAC地址,使得資料能夠在區域網路內正確傳輸。以下是組態靜態MAC地址的範例:
## 網路介面設定檔範例
ens33:
dhcp4: true
match:
macaddress: b6:22:eb:7b:92:44
內容解密:
ens33是網路介面的名稱。dhcp4: true表示該介面將使用DHCPv4自動取得IP位址。match區塊用於根據特定條件比對網路介面。macaddress指定了該介面的MAC地址,用於識別網路介面卡。
此外,透過編輯 /etc/udev/rules.d/75-mac-spoof.rules 檔案,可以在系統啟動時執行特定的命令來更改MAC地址:
## 設定MAC地址變更規則
ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="XX:XX:XX:XX:XX:XX", RUN+="/usr/bin/ip link set dev ens33 address YY:YY:YY:YY:YY:YY"
內容解密:
ACTION=="add"表示該規則在網路介面被新增時觸發。SUBSYSTEM=="net"指定了該規則適用於網路子系統。ATTR{address}=="XX:XX:XX:XX:XX:XX"比對具有指定MAC地址的網路介面。RUN+="/usr/bin/ip link set dev ens33 address YY:YY:YY:YY:YY:YY"在比對的介面上執行命令,將其MAC地址更改為YY:YY:YY:YY:YY:YY。
MAC地址的OUI值
MAC地址的前幾個位元組被稱為OUI(組織唯一識別碼),用於標識網路介面卡的製造商。OUI由IEEE維護,並公開發布在 http://standards-oui.ieee.org/oui.txt。Wireshark專案也提供了更完整的OUI列表。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Linux網路診斷核心技術剖析
package "機器學習流程" {
package "資料處理" {
component [資料收集] as collect
component [資料清洗] as clean
component [特徵工程] as feature
}
package "模型訓練" {
component [模型選擇] as select
component [超參數調優] as tune
component [交叉驗證] as cv
}
package "評估部署" {
component [模型評估] as eval
component [模型部署] as deploy
component [監控維護] as monitor
}
}
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml
此圖示說明瞭MAC地址如何分為OUI和裝置唯一識別碼兩部分。
圖示內容解密:
- MAC地址由OUI和裝置唯一識別碼組成。
- OUI用於標識製造商。
- 裝置唯一識別碼用於區分同一製造商的不同裝置。
Layer 4:TCP與UDP協定
在Layer 4,TCP(傳輸控制協定)和UDP(使用者資料報協定)是兩種主要的通訊協定。它們利用埠號實作應用程式之間的通訊。
TCP的三次握手
TCP協定透過三次握手建立連線,確保資料傳輸的可靠性。以下是TCP連線建立的過程:
- 使用者端傳送SYN包給伺服器。
- 伺服器回應SYN-ACK包給使用者端。
- 使用者端傳送ACK包給伺服器,確認連線建立。