Network 之四 常用 Linux 网络命令及网络调试工具介绍
網(wǎng)絡(luò)互連模型
主要就是值得 OSI 參考模型與 TCP/IP 五層模型:
下面再來(lái)一張?jiān)敿?xì)點(diǎn)的(來(lái)源于科來(lái)網(wǎng)絡(luò)):
網(wǎng)絡(luò)命令
??目前,我們常用的網(wǎng)絡(luò)相關(guān)的命令有兩大類:net-tools 和 iproute2。其中,net-tools 是前輩,iproute2 則是后起之秀。作為網(wǎng)絡(luò)配置工具的一份子,iproute2 的出現(xiàn)旨在從功能上取代 net-tools。同時(shí),一些 Linux 發(fā)行版比如 Arch Linux 和 CentOS/RHEL 7 則已經(jīng)完全拋棄了 net-tools,只支持 iproute2。下圖列舉了一個(gè)兩者功能對(duì)比:
??此外,在我們查閱一些命令的說(shuō)明文檔或者看某些 Linux 書(shū)的時(shí)候,常會(huì)看到 ifconfig(8)、conect(2)、select(2) 等等這樣的寫(xiě)法。后面的這個(gè)括號(hào)及數(shù)字其實(shí) man 手冊(cè)的標(biāo)準(zhǔn)要求(表示 man 的章節(jié)號(hào))。不同的數(shù)字表示命令的類型。使用 man man 可以進(jìn)行查看:
- 1: 可執(zhí)行程序或者 shell 命令。又叫用戶命令, 可由任何人使用
- 2: 系統(tǒng)調(diào)用, 即由內(nèi)核提供的函數(shù)
- 3: 庫(kù)函數(shù)
- 4: 設(shè)備及特殊文件(/dev目錄下)
- 5: 文件格式描述, 例如 /etc/passwd
- 6: 游戲等
- 7: 雜項(xiàng), 例如宏命令包、慣例等
- 8: 系統(tǒng)管理員工具, 只能由 root 啟動(dòng)
- 9: 內(nèi)核例程, 用來(lái)存放內(nèi)核例行程序的文檔。
- n: 新文檔, 可能要移到更適合的領(lǐng)域。
- o: 老文檔, 可能會(huì)在一段期限內(nèi)保留。
- l: 本地文檔,與本特定系統(tǒng)有關(guān)的。
在使用 man 查詢這些命令的時(shí)候, 可以用下面這樣的格式:$man 數(shù)字 命令。例如 : $man 1 kill 表示命令kill 、$man 2 kill 表示系統(tǒng)調(diào)用 kill。
??這些編號(hào)的歷史可以追溯到 1971 年 Thompson 和 Ritchie 編寫(xiě)的 Unix Programmer’s Manual (Unix 程序員手冊(cè)),如今來(lái)看,其已經(jīng)有了一些變化。如下是部分截圖:
在實(shí)際使用中還會(huì)有一些非標(biāo)準(zhǔn)的編號(hào):
net-tools
??net-tools 起源于 BSD 的 TCP/IP 工具箱,后來(lái)成為老版本 Linux 內(nèi)核中配置網(wǎng)絡(luò)功能的工具。但自 2001年起,Linux社區(qū)已經(jīng)對(duì)其停止維護(hù)。 net-tools 通過(guò) procfs(/proc) 和 ioctl 系統(tǒng)調(diào)用去訪問(wèn)和改變內(nèi)核網(wǎng)絡(luò)配置。這套工具主要包括:arp、hostname、ifconfig、ipmaddr、iptunnel、mii-tool、nameif、netstat、plipconfig、rarp、route、slattach。
目前,我們可以從 https://sourceforge.net/projects/net-tools/ 獲取到源代碼。
mii-tool
??mii-tool 是配置網(wǎng)絡(luò)設(shè)備協(xié)商方式的工具。它一個(gè)較老的程序,執(zhí)行與 ethtool 類似的功能。從 2003 年開(kāi)始,被認(rèn)為是過(guò)時(shí)的,并被 ethtool 取代。下圖是 mii-tool 的用法及參數(shù)說(shuō)明:
iproute2
??iproute2 是一個(gè)使用 GPLv2 協(xié)議開(kāi)源的開(kāi)源軟件,源代碼可以通過(guò) Github 或者 kernel.org gitweb 來(lái)查看及獲取。對(duì)應(yīng)的官方網(wǎng)站介紹是:https://wiki.linuxfoundation.org/networking/iproute2。根據(jù)官網(wǎng)介紹,iproute2 原作者是 Alexey Kuznetsov,目前由 Stephen Hemminger 維護(hù)。
??iproute2 就是通過(guò) netlink 套接字接口與內(nèi)核通訊的一些列小工具的集合。這些工具包括:arpd、bridge、ctstat、dcb、devlink、ip、lnstat、nstat、rdma、routef、routel、rtacct、rtmon、rtstat、ss、tc、tipc。其中的核心就是 ip 這個(gè)命令。
ethtool
??ethtool 用于查看和修改網(wǎng)絡(luò)設(shè)備(尤其是有線以太網(wǎng)設(shè)備)的驅(qū)動(dòng)參數(shù)和硬件設(shè)置。可以根據(jù)需要更改以太網(wǎng)卡的參數(shù),包括自動(dòng)協(xié)商、速度、雙工和局域網(wǎng)喚醒等參數(shù)。默認(rèn)情況下,大多數(shù)系統(tǒng)上應(yīng)該已經(jīng)安裝了 ethtool。如果沒(méi)有,可以從發(fā)行版的官方版本庫(kù)中安裝。
??ethtool 由內(nèi)核空間和用戶空間兩部分,一個(gè)是 Linux 內(nèi)核中的 API,NIC 的驅(qū)動(dòng)程序軟件可以使用該 API 發(fā)送和接收參數(shù),另一個(gè)是基于 Linux SIOCETHTOOL Ioctl 機(jī)制的用戶空間 API,應(yīng)用程序程序可以使用該 API 與內(nèi)核通信以發(fā)送和接收 NIC 和 NIC 驅(qū)動(dòng)程序參數(shù)。下圖是 ethtool 在 Linux 中的實(shí)現(xiàn)框架:
??ethtool 的命令的基本格式是:ethtool [選項(xiàng)] 網(wǎng)絡(luò)接口名。其中,[選項(xiàng)] 是可選的。要配置網(wǎng)絡(luò)接口,首先就需要檢查 Linux 上的可用網(wǎng)絡(luò)接口,這里就可以上面我們介紹的命令(ip 或 ifconfig)來(lái)實(shí)現(xiàn)。如下圖所示:
??舊的 Linux 發(fā)行版通常使用的是 eth[X] 格式。例如,RHEL 6 和它們的舊版本。現(xiàn)代的 Linux 發(fā)行版使用 enp[XXX] 或 ens[XXX] 格式。例如, RHEL 7、Debian 10、Ubuntu 16.04 等大多數(shù)現(xiàn)代 Linux 發(fā)行版都使用這種格式。
??獲取了網(wǎng)絡(luò)接口名字之后,重點(diǎn)就是 ethtool 的各個(gè)選項(xiàng)的含義了。ethtool 的選項(xiàng)非常多,下面我列出了一些常用的參數(shù)以及在我的系統(tǒng)上的一些示例:
- 無(wú):當(dāng)不使用任何參數(shù)的時(shí)候,默認(rèn)將列出指定網(wǎng)絡(luò)接口的配置信息。
- -a: 查看網(wǎng)卡中 接收模塊 RX、發(fā)送模塊 TX 和 Autonegotiate 模塊的狀態(tài):啟動(dòng) on 或 停用 off。
- -A: 修改網(wǎng)卡中 接收模塊 RX、發(fā)送模塊 TX 和 Autonegotiate 模塊的狀態(tài):啟動(dòng) on 或 停用 off。
- -c: 顯示指定以太網(wǎng)卡的 Coalesce 信息
- -C: 更改指定以太網(wǎng)卡的 Coalesce 設(shè)置
- -g: 顯示指定以太網(wǎng)卡的 RX/TX 環(huán)參數(shù)信息
- -G: 更改指定以太網(wǎng)卡的 RX/TX 環(huán)設(shè)置。
- -i: 顯示網(wǎng)卡驅(qū)動(dòng)的信息,如驅(qū)動(dòng)的名稱、版本等。
- -d: 顯示 register dump 信息, 部分網(wǎng)卡驅(qū)動(dòng)不支持該選項(xiàng)。
- -e: 顯示 EEPROM dump 信息,部分網(wǎng)卡驅(qū)動(dòng)不支持該選項(xiàng)。
- -E: 修改網(wǎng)卡 EEPROM byte。
- -k: 顯示網(wǎng)卡 Offload 參數(shù)的狀態(tài):on 或 off,包括rx-checksumming、tx-checksumming等。
- -K: 修改網(wǎng)卡 Offload 參數(shù)的狀態(tài)。
- -p: 用于區(qū)別不同 網(wǎng)卡名字 對(duì)應(yīng)網(wǎng)卡的物理位置,常用的方法是使網(wǎng)卡 port 上的 led 不斷的閃;N 指示了網(wǎng)卡閃的持續(xù)時(shí)間,以秒為單位。
- -r: 如果 auto-negotiation 模塊的狀態(tài)為 on,則 restarts auto-negotiation。
- -S: 顯示 NIC(Network Interface Card)- and driver-specific 的統(tǒng)計(jì)參數(shù),如網(wǎng)卡接收/發(fā)送的字節(jié)數(shù)、接收/發(fā)送的廣播包個(gè)數(shù)等。
- -t: 讓網(wǎng)卡執(zhí)行自我檢測(cè),有兩種模式:offline or online。
- -s: 修改網(wǎng)卡的部分配置,包括網(wǎng)卡速度、單工/全雙工模式、mac 地址等。
??在系統(tǒng)重啟后,你使用 ethtool 所做的更改將被默認(rèn)恢復(fù)。要使自定義設(shè)置永久化,需要更新網(wǎng)絡(luò)配置文件中的值。根據(jù)不同的 Linux 發(fā)行版,需要將修改的值更新到正確的文件中。
分析與調(diào)試
pcap
??pcap 是用于捕獲網(wǎng)絡(luò)流量的應(yīng)用程序編程接口 。類 Unix 系統(tǒng)在 libpcap 庫(kù)中實(shí)現(xiàn) pcap,對(duì)于 Windows,有一個(gè)名為 WinPcap(已不在維護(hù)),后來(lái)有人在此基礎(chǔ)上開(kāi)發(fā)了 Win10Pcap,也沒(méi)再更新過(guò),還有一個(gè)名為 Npcap,目前用的比較多。
-
WinPcap: WinPcap是一個(gè)用于 Win32 平臺(tái)的包捕獲和網(wǎng)絡(luò)分析的開(kāi)源庫(kù)。官網(wǎng)是 https://www.winpcap.org/,官網(wǎng)上有詳細(xì)的文檔 。
??在 2013 年 3 月 8 日發(fā)布 4.1.3 版本之后就再也沒(méi)有更新過(guò),下載地址:https://www.winpcap.org/install/default.htm。其源代碼可以在如下地址下載到 https://www.winpcap.org/devel.htm -
Win10Pcap: Win10Pcap 與 WinPcap 完全兼容(安裝后的 dll 同名(wpcap.dll、Packet.dll)),官網(wǎng)是 http://www.win10pcap.org/,根據(jù)官網(wǎng)介紹,Win10Pcap 是基于 NDIS(Network Driver Interface Specification) 6.x 驅(qū)動(dòng)模型實(shí)現(xiàn)的,以更好的工作在 Windows 10 系統(tǒng),而 WinPcap 是基于 NDIS 5.x 驅(qū)動(dòng)模型的。
??在 2015 年 10 月 8 日發(fā)布了 10.2.5002 版本之后就再也沒(méi)有更新,下載地址:http://www.win10pcap.org/download/。源代碼托管于 Github。根據(jù)官網(wǎng)介紹,這就是一個(gè)個(gè)人改進(jìn)的小眾版本,估計(jì)后續(xù)也不怎么更新了!網(wǎng)絡(luò)驅(qū)動(dòng)程序接口規(guī)范(Network Driver Interface Specification,NDIS)是微軟所提供的網(wǎng)絡(luò)接口卡(NIC)API
-
Npcap: 這其實(shí)也是個(gè) WinPcap 的改進(jìn)版,只不過(guò)改進(jìn)比較徹底,很多功能都進(jìn)行了重寫(xiě)!官網(wǎng)是 https://npcap.com/,官網(wǎng)的文檔也很詳細(xì)(其文檔就是照抄的 WinPcap 然后改的)。Npcap 也將驅(qū)動(dòng)模型升級(jí)到了 NDIS 6.x,以更好的用于 Win7 及以上系統(tǒng)。
??Npcap 有免費(fèi)版和商業(yè)版兩種,免費(fèi)版的使用限制比較多。于 2021 年 10 月 7 日發(fā)布 1.60 版本,下載地址:https://npcap.com/#download。源代碼同樣托管于 Github。 -
libpcap: Unix/Linux 平臺(tái)下的網(wǎng)絡(luò)數(shù)據(jù)包捕獲函數(shù)庫(kù)。它是一個(gè)獨(dú)立于系統(tǒng)的用戶層包捕獲的 API 接口,為底層網(wǎng)絡(luò)監(jiān)測(cè)提供了一個(gè)可移植的框架。官網(wǎng)是 https://www.tcpdump.org/,文檔也非常詳細(xì)!
??目前,最新版是 2021 年 6 月 9 日發(fā)布的 1.10.1 版本,可以直接下載預(yù)編譯的可執(zhí)行程序。源代碼托管于 Github。
strace
??strace 是一個(gè)用于 Linux 的診斷、調(diào)試和教學(xué)的用戶空間實(shí)用程序。它用于監(jiān)視和篡改進(jìn)程和 Linux 內(nèi)核之間的交互,包括系統(tǒng)調(diào)用(包括參數(shù),返回值,執(zhí)行消耗的時(shí)間)、信號(hào)傳遞和進(jìn)程狀態(tài)的更改。
??strace 的操作是由稱為 ptrace 的內(nèi)核特性實(shí)現(xiàn)的。源代碼可以在 Github 獲取:https://github.com/strace/strace,官方網(wǎng)站是:https://strace.io/ 。
??strace 的用法很簡(jiǎn)單,主要有兩種模式。一種是通過(guò)它啟動(dòng)要跟蹤的進(jìn)程。用法很簡(jiǎn)單,在原本的命令前加上 strace 即可。例如:strace ethtool -g ens160,輸出內(nèi)容如下:
zcshou@ZCShou:~$ strace strace: must have PROG [ARGS] or -p PID Try 'strace -h' for more information. zcshou@ZCShou:~$ strace ethtool -g ens160 execve("/sbin/ethtool", ["ethtool", "-g", "ens160"], 0x7ffc2822d1d0 /* 57 vars */) = 0 brk(NULL) = 0x5570315f4000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=180943, ...}) = 0 mmap(NULL, 180943, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcb69fc5000 ------------------------省略一大部分---------------- +++ exited with 0 +++另外一種運(yùn)行模式,是跟蹤已經(jīng)在運(yùn)行的進(jìn)程,在不中斷進(jìn)程執(zhí)行的情況下,理解它在干嘛。 這種情況,給 strace 傳遞個(gè) -p pid 選項(xiàng)即可。例如:strace -p 12313。
iperf
??Iperf 是一個(gè)廣泛使用的網(wǎng)絡(luò)性能測(cè)量和調(diào)整工具。我們需要注意的是當(dāng)前存在 Iperf2 和 Iperf3 這兩個(gè)不同的版本 ,這兩個(gè)版本是相互獨(dú)立的,默認(rèn)我們使用的就是 Iperf2;Iperf3 則是重新實(shí)現(xiàn)的,與 Iperf2 并不兼容。目前這兩個(gè)版本都在積極開(kāi)發(fā)中!以下是兩個(gè)的功能對(duì)比:
- Iperf2 源代碼托管于 https://sourceforge.net/projects/iperf2/ ;Iperf3 源代碼托管于 https://github.com/esnet/iperf
- Iperf2 最初由 NLANR/DAST 開(kāi)發(fā);Iperf3 由 ESnet / Lawrence Berkeley National Laboratory 開(kāi)發(fā),并在 BSD 協(xié)議下開(kāi)源
- Iperf2 官方網(wǎng)站:https://iperf2.sourceforge.io/iperf-manpage.html;Iperf3 則是參考 https://software.es.net/iperf
- Iperf3 使用了 Iperf2 的部分代碼,他們的部分開(kāi)發(fā)者同時(shí)參與了這兩個(gè)版本的開(kāi)發(fā),具體見(jiàn) https://iperf.fr/
- 截止發(fā)文時(shí)間,Iperf2 最新版為 2.1.6,Iperf3 最新版為 3.11
- Iperf2 支持 Windows、Linux、MacOS;Iperf3 僅支持 Linux(Vivien Guéant 曾在 2016 年編譯過(guò) Windows 版本,但后來(lái)沒(méi)有再維護(hù)過(guò))
??默認(rèn)情況下,Linux 系統(tǒng)沒(méi)有安裝 Iperf,Debian 系列直接使用 sudo apt install iperf 安裝即可。注意,這里安裝的其實(shí)是 Iperf2,如果要安裝 Iperf3 則需要顯示指明:sudo apt install iperf3。如下圖所示:
??要是用 Iperf,必須在測(cè)試的兩臺(tái)計(jì)算機(jī)上同時(shí)安裝 Iperf,其中一個(gè)作為服務(wù)器,另一個(gè)作為服務(wù)端。 我這里就以 Iperf2 為例,在我的 Window 11 與 Ubuntu 兩臺(tái)電腦之間簡(jiǎn)單測(cè)試如下:
??下面就來(lái)簡(jiǎn)單說(shuō)一下 iperf 的用法。基本用法有以下四種:iperf -s [options]、iperf -c server [options]、iperf -u -s [options]、iperf -u -c server [options],其中,-s 表示服務(wù)器模式;-c server 表示以客戶端模式連接到指定 server;默認(rèn)是 TCP 協(xié)議,使用 -u 表示指定為 UDP 協(xié)議。至于 [options] 就比較多了,如下圖我截取了一部分:
至于每個(gè)參數(shù)的具體使用,需要對(duì)照手冊(cè)說(shuō)了來(lái)!
Wireshark
??Wireshark 默認(rèn)并沒(méi)有提供 Linux 的安裝包,如果選擇使用源代碼進(jìn)行安裝,則要考慮各種依賴關(guān)系,非常麻煩。而且 Ubuntu 的 Universe 存儲(chǔ)庫(kù)中的 Wireshark 版本又太低,因此,我選擇了使用 Wireshark 開(kāi)發(fā)者提供了一種官方 PPA 方式來(lái)進(jìn)行安裝(目前來(lái)看,PPA 上也不是官網(wǎng)最新的)。具體步驟如下:
debian 存儲(chǔ)庫(kù)中有更新的版本:https://packages.qa.debian.org/w/wireshark.html
??安裝時(shí),系統(tǒng)會(huì)詢問(wèn)你是否允許非超級(jí)用戶捕獲數(shù)據(jù)包。使用 Tab 鍵選擇 “Yes” 允許,選擇“No” 限制非超級(jí)用戶捕獲數(shù)據(jù)包,如下圖所示,按 回車確定,最后完成安裝。
??允許非超級(jí)用戶捕獲數(shù)據(jù)包,還需要將使用 Wireshark 的用戶添加到 wireshark 組。使用 usermod 命令將自己添加到 wireshark 組:sudo usermod -aG wireshark $(whoami),否則無(wú)法啟動(dòng)抓包。
??如果在安裝完成時(shí)不小心選擇了 “No”,則以 root 用戶身份運(yùn)行以下命令:sudo dpkg-reconfigure wireshark-common,然后按 tab 鍵并使用回車鍵選擇 “YES”。
??注意:Windows 系統(tǒng)中,Wireshark 依賴于 Npcap,在安裝時(shí)默認(rèn)就會(huì)安裝 Npcap;Linux 系統(tǒng)中,Wireshark 依賴于 libpcap。
xcap
??xcap 是一個(gè)基于 Windows 的數(shù)據(jù)包生成和發(fā)送工具,你可以使用它來(lái)創(chuàng)建一個(gè)數(shù)據(jù)包,然后通過(guò)計(jì)算機(jī)上指定的接口發(fā)送它。官網(wǎng)是 http://xcap.weebly.com/。目前最新版是 2021年 5月 4 日 發(fā)布的1.3.0 版本。
??注意,xcap 依賴 WinPcap,但是 WinPcap 已經(jīng)不在更新,后來(lái)出了個(gè)基于 WinPcap 的 Win10Pcap ,主要用于 Win7 及以上系統(tǒng),可以直接用它來(lái)代替 WinPcap。
??xcap 使用起來(lái)還是挺簡(jiǎn)單,xcap 的基本操作流程就是:網(wǎng)絡(luò)接口(首先啟用接口) —> 報(bào)文組(新建報(bào)文組) —> 報(bào)文(在報(bào)文組中添加多條報(bào)文)----> 發(fā)送(在啟用的接口上發(fā)送選定的報(bào)文)。xcap 采用自下而上的方式一步一步來(lái)構(gòu)造報(bào)文。
Tcpreplay
??Tcpreplay (第一個(gè)字母大寫(xiě))是一系列工具的總稱,用于編輯和重放以前由 tcpdump 和 Wireshark 等工具捕獲的網(wǎng)絡(luò)流量。目前在 GPLv3 協(xié)議下開(kāi)源,源代碼可以在 https://github.com/appneta/tcpreplay 獲取,官方網(wǎng)站是 https://tcpreplay.appneta.com/。主要工具如下所示:
- 網(wǎng)絡(luò)重放工具:
- tcpreplay: 在網(wǎng)絡(luò)上以任意速度重放 pcap 文件,并可以選擇用任意 IP 地址重放
- tcpreplay-edit: 在網(wǎng)絡(luò)上以任意速度重放 pcap 文件,有許多選項(xiàng)可以在動(dòng)態(tài)中修改數(shù)據(jù)包
- tcpliveplay: 以遠(yuǎn)程服務(wù)器將響應(yīng)的方式,在現(xiàn)網(wǎng)中重播存儲(chǔ)在 pcap 文件中的 TCP 網(wǎng)絡(luò)流量
- Pcap 文件編輯器及實(shí)用工具:
- tcpprep:多通道 pcap 文件預(yù)處理器,它決定數(shù)據(jù)包作為客戶端或服務(wù)器,并將它們分割成輸出文件供 tcpreplay 和 tcprewrite 使用
- tcprewrite: PCAP 文件編輯器,主要用來(lái)修改數(shù)據(jù)包的 2 層,3 層,4 層報(bào)文頭,即MAC 地址,IP 地址和端口等
- tcpcapinfo: Pcap 文件分析器用于調(diào)試損壞的 Pcap 文件
- tcpbridge: 用 tcprewrite 功能橋接兩個(gè)網(wǎng)段
??默認(rèn)情況下,系統(tǒng)可能并沒(méi)有安裝 Tcpreplay,Debian 系列可以直接使用 sudo apt install tcpreplay 命令進(jìn)行在線安裝(可能不是最新版),其他系統(tǒng)自行搜索對(duì)應(yīng)的安裝命令即可。Tcpreplay 的使用主要分為三步:
示例
??在 Windows 11 上使用 xcap 構(gòu)造了一個(gè) icmp-ping 的報(bào)文,然后發(fā)給 Ubuntu,Ubuntu 上打開(kāi) Wireshark 監(jiān)控通信報(bào)文,將報(bào)文保存 到本地,然后使用 tcpreplay 進(jìn)行回放。具體環(huán)境如下:
操作過(guò)程如下:
注意,由于我使用了 VNC 遠(yuǎn)程 Ubuntu,因此會(huì)導(dǎo)致多了很多 TCP 報(bào)文。
參考
總結(jié)
以上是生活随笔為你收集整理的Network 之四 常用 Linux 网络命令及网络调试工具介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Network 之一 国际标准组织介绍、
- 下一篇: Network 之五 TCP/IP 协议