Shell 網(wǎng)絡(luò)操作

2018-10-26 16:46 更新

前言

前面章節(jié)已經(jīng)介紹了Shell編程范例之?dāng)?shù)值、布爾值、字符串、文件、文件系統(tǒng)、進(jìn)程等的操作。這些內(nèi)容基本覆蓋了網(wǎng)絡(luò)中某個(gè)獨(dú)立機(jī)器正常工作的“方方面面”,現(xiàn)在需要把視角從單一的機(jī)器延伸到這些機(jī)器通過(guò)各種網(wǎng)絡(luò)設(shè)備和協(xié)議連接起來(lái)的網(wǎng)絡(luò)世界,分析網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)、網(wǎng)絡(luò)工作原理、了解各種常見(jiàn)網(wǎng)絡(luò)協(xié)議、各種常見(jiàn)硬件工作原理、網(wǎng)絡(luò)通信與安全相關(guān)軟件以及工作原理分析等。

不過(guò),因?yàn)榫W(wǎng)絡(luò)相關(guān)的問(wèn)題確實(shí)太復(fù)雜了,這里不可能介紹具體,因此如果想了解更多細(xì)節(jié),還是建議參考相關(guān)資料。但Linux是一個(gè)網(wǎng)絡(luò)原理學(xué)習(xí)和實(shí)踐的好平臺(tái),不僅因?yàn)樗旧韺?duì)網(wǎng)絡(luò)體系結(jié)構(gòu)的實(shí)現(xiàn)是開(kāi)放源代碼的,而且各種相關(guān)的分析工具和函數(shù)庫(kù)數(shù)不勝數(shù),因此,如果你是學(xué)生,千萬(wàn)不要錯(cuò)過(guò)通過(guò)它來(lái)做相關(guān)的實(shí)踐工作。

網(wǎng)絡(luò)原理介紹

我們的網(wǎng)絡(luò)世界

在進(jìn)行所有介紹之前,來(lái)直觀地感受一下那個(gè)真真實(shí)實(shí)存在的網(wǎng)絡(luò)世界吧。當(dāng)我在 Linux 下通過(guò) Web 編輯器寫這篇 Blog 時(shí),一邊用 mplayer 聽(tīng)著遠(yuǎn)程音樂(lè),累了時(shí)則打開(kāi)蘭大的網(wǎng)絡(luò) TV 頻道開(kāi)始看看鳳凰衛(wèi)視……這些“現(xiàn)代化”的生活,我想,如果沒(méi)有網(wǎng)絡(luò),將變得無(wú)法想象。

下面來(lái)構(gòu)想一下這樣一個(gè)網(wǎng)絡(luò)世界的優(yōu)美圖畫:

一邊盯著顯示器,一邊敲擊著鍵盤,一邊掛著耳機(jī)。

主機(jī)電源燈燦爛得很,發(fā)著綠光,這時(shí)很容易想象主機(jī)背后的那個(gè)網(wǎng)卡位置肯定有兩個(gè)不同顏色的燈光在閃爍,它顯示著主機(jī)正在與計(jì)算機(jī)網(wǎng)絡(luò)世界打著交道。

就在實(shí)驗(yàn)室的某個(gè)角落,有一個(gè)交換機(jī)上的一個(gè)網(wǎng)口的網(wǎng)線連到主機(jī)上,這個(gè)交換機(jī)接到了一個(gè)局域網(wǎng)的網(wǎng)關(guān)上,然后這個(gè)網(wǎng)關(guān)再接到了信息樓的某個(gè)路由器上,再轉(zhuǎn)接到學(xué)校網(wǎng)絡(luò)中心的另外一個(gè)路由器上……

期間,有一個(gè)路由器連接到了這個(gè) Blog 服務(wù)器上,而另外一個(gè)則可能連到了那個(gè)網(wǎng)絡(luò) TV 服務(wù)器上,還有呢,另外一些則連接到了電信網(wǎng)絡(luò)里頭的某個(gè)音樂(lè)服務(wù)器上……

下面用 dia 繪制一個(gè)簡(jiǎn)單的“網(wǎng)絡(luò)地圖”:

Network Architecture

該圖把一些最常見(jiàn)的網(wǎng)絡(luò)設(shè)備和網(wǎng)絡(luò)服務(wù)基本都呈現(xiàn)出來(lái)了,包括本地主機(jī)、路由、交換機(jī)、網(wǎng)橋,域名服務(wù)器,萬(wàn)維網(wǎng)服務(wù),視頻服務(wù),防火墻服務(wù),動(dòng)態(tài) IP 地址服務(wù)等。其中各種設(shè)備構(gòu)成了整個(gè)物理網(wǎng)絡(luò),而網(wǎng)絡(luò)服務(wù)則是構(gòu)建在這些設(shè)備上的各種網(wǎng)絡(luò)應(yīng)用。

現(xiàn)在的網(wǎng)絡(luò)應(yīng)用越來(lái)越豐富多樣,比如即時(shí)聊天(IM)、 p2p 資源共享、網(wǎng)絡(luò)搜索等,它們是如何實(shí)現(xiàn)的,它們?nèi)绾螛?gòu)建在各種各樣的網(wǎng)絡(luò)設(shè)備之上,并且能夠安全有效的工作呢?這取決于這背后逐步完善的網(wǎng)絡(luò)體系結(jié)構(gòu)和各種相關(guān)網(wǎng)絡(luò)協(xié)議的開(kāi)發(fā)、實(shí)現(xiàn)和應(yīng)用。

網(wǎng)絡(luò)體系結(jié)構(gòu)和網(wǎng)絡(luò)協(xié)議介紹

那么網(wǎng)絡(luò)體系結(jié)構(gòu)是怎么樣的呢?涉及到哪些相關(guān)的網(wǎng)絡(luò)協(xié)議呢?什么又是網(wǎng)絡(luò)協(xié)議呢?

在《計(jì)算機(jī)網(wǎng)絡(luò)——自頂向下的方法》一書中非常巧妙地給出了網(wǎng)絡(luò)體系結(jié)構(gòu)分層的比喻,把網(wǎng)絡(luò)中各層跟交通運(yùn)輸體系中的各個(gè)環(huán)節(jié)對(duì)照起來(lái),讓人通俗易懂。在交通運(yùn)輸體系中,運(yùn)輸?shù)氖侨撕臀锲?,在?jì)算機(jī)網(wǎng)絡(luò)體系中,運(yùn)輸?shù)氖请娮訑?shù)據(jù)??紤]到交通運(yùn)輸網(wǎng)絡(luò)和計(jì)算機(jī)網(wǎng)絡(luò)中最終都可以劃歸為點(diǎn)對(duì)點(diǎn)的信息傳輸。這里考慮兩點(diǎn)之間的信息傳遞過(guò)程,得到這樣一個(gè)對(duì)照關(guān)系,見(jiàn)下圖:

Network Layer與交通運(yùn)輸體系比較

對(duì)照上圖,更容易理解右側(cè)網(wǎng)絡(luò)體系結(jié)構(gòu)的分層原理(如果比照一封信發(fā)出到收到的這一中間過(guò)程可能更容易理解),上圖右側(cè)是 TCP/IP 網(wǎng)絡(luò)體系結(jié)構(gòu)的一個(gè)網(wǎng)絡(luò)分層示意圖,在把數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)之前,在各層中需要進(jìn)行各種“打包”的操作,而從網(wǎng)絡(luò)接收到數(shù)據(jù)后,就需要進(jìn)行“解包”操作,最終把純粹的數(shù)據(jù)信息給提取出來(lái)。這種分層的方式是為了傳輸數(shù)據(jù)的需要,也是兩個(gè)主機(jī)之間如何建立連接以及如何保證數(shù)據(jù)傳輸?shù)耐暾院涂煽啃缘男枰?。通過(guò)把各種需要分散在不同的層次,使得整個(gè)體系結(jié)構(gòu)更加清晰和明了。這些“需求”具體通過(guò)各種對(duì)應(yīng)的協(xié)議來(lái)規(guī)范,這些規(guī)范統(tǒng)成為網(wǎng)絡(luò)協(xié)議。

關(guān)于 OSI 模型(7 層)比照 TCP/IP 模型(4 層)的協(xié)議??梢詮南聢D(來(lái)自網(wǎng)絡(luò))看個(gè)明了:

OSI Network Layer

而下圖(來(lái)自網(wǎng)絡(luò))則更清晰地體現(xiàn)了 TCP/IP 分層模型。

TCP IP Network Layer

上面介紹了網(wǎng)絡(luò)原理方面的基本內(nèi)容,如果想了解更多網(wǎng)絡(luò)原理和操作系統(tǒng)對(duì)網(wǎng)絡(luò)支持的實(shí)現(xiàn),可以考慮閱讀后面的參考資料。下面將做一些實(shí)踐,即在 Linux 下如何聯(lián)網(wǎng),如何用 Linux 搭建各種網(wǎng)絡(luò)服務(wù),并進(jìn)行網(wǎng)絡(luò)安全方面的考量以及基本的網(wǎng)絡(luò)編程和開(kāi)發(fā)的介紹。

Linux 下網(wǎng)絡(luò)“實(shí)戰(zhàn)”

如何把我們的 Linux 主機(jī)接入網(wǎng)絡(luò)

如果要讓一個(gè)系統(tǒng)能夠聯(lián)網(wǎng),首先當(dāng)然是搭建好物理網(wǎng)絡(luò)了。接入網(wǎng)絡(luò)的物理方式還是蠻多的,比如直接用網(wǎng)線接入以太網(wǎng),用無(wú)線網(wǎng)卡上網(wǎng),用 ADSL 撥號(hào)上網(wǎng)……

對(duì)于用以太網(wǎng)網(wǎng)卡接入網(wǎng)絡(luò)的常見(jiàn)方式,在搭建好物理網(wǎng)絡(luò)并確保連接正常后,可以通過(guò)配置 IP 地址和默認(rèn)網(wǎng)關(guān)來(lái)接入網(wǎng)絡(luò),這個(gè)可以通過(guò)手工配置和動(dòng)態(tài)獲取兩種方式。

范例:通過(guò)dhclient獲取IP地址

如果所在的局域網(wǎng)有 DHCP 服務(wù),那么可以這么獲取,N 是設(shè)備名稱,如果只有一塊網(wǎng)卡,一般是 0 或者 1 。

$ dhclient ethN

范例:靜態(tài)配置IP地址

當(dāng)然,也可以考慮采用靜態(tài)配置的方式,ip_address 是本地主機(jī)的 IP 地址,gw_ip_address 是接入網(wǎng)絡(luò)的網(wǎng)關(guān)的 IP 地址。

$ ifconfig eth0 ip_address on
$ route add deafult gw gw_ip_address

如果上面不工作,記得通過(guò) ifconfig/mii-tool/ethtool 等工具檢查網(wǎng)卡是否有被驅(qū)動(dòng)起來(lái),然后通過(guò) lspci/dmesg 等檢查網(wǎng)卡類型(或者通過(guò)主板手冊(cè)和獨(dú)立網(wǎng)卡自帶的手冊(cè)查看),接著安裝或者編譯相關(guān)驅(qū)動(dòng),最后把驅(qū)動(dòng)通過(guò) insmod/modprobe 等工具加載到內(nèi)核中。

用 Linux 搭建網(wǎng)橋

網(wǎng)橋工作在 OSI 模型的第二層,即數(shù)據(jù)鏈路層,它只需要知道目標(biāo)主機(jī)的 MAC 地址就可以工作。 Linux 內(nèi)核在 2.2 開(kāi)始就已經(jīng)支持了這個(gè)功能,具體怎么配置看看后續(xù)參考資料吧。如果要把 Linux 主機(jī)配置成一個(gè)網(wǎng)橋,至少需要兩個(gè)網(wǎng)卡。

網(wǎng)橋的作用相當(dāng)于一根網(wǎng)線,用戶無(wú)須關(guān)心里頭有什么東西,把它的兩個(gè)網(wǎng)口連接到兩個(gè)主機(jī)上就可以讓這兩個(gè)主機(jī)支持相互通信。不過(guò)它比網(wǎng)線更厲害,如果配上防火墻,就可以隔離連接在它兩端的網(wǎng)段(注意這里是網(wǎng)絡(luò),因?yàn)樗蛔R(shí)別 IP),另外,如果這個(gè)網(wǎng)橋有多個(gè)網(wǎng)口,那么可以實(shí)現(xiàn)一個(gè)功能復(fù)雜的交換機(jī),而如果有效組合多個(gè)網(wǎng)橋,則有可能實(shí)現(xiàn)一個(gè)復(fù)雜的可實(shí)現(xiàn)流量控制和負(fù)載平衡的防火墻系統(tǒng)。

用 Linux 做路由

路由工作在 OSI 模型的第三層,即網(wǎng)絡(luò)層,通過(guò) router 可以配置 Linux 的路由,當(dāng)然,Linux 下也有很多工具支持動(dòng)態(tài)路由的。相關(guān)的資料在網(wǎng)路中鋪天蓋地,由于時(shí)間關(guān)系,這里不做介紹。

用 Linux 搭建各種常規(guī)的網(wǎng)絡(luò)服務(wù)

需要什么網(wǎng)絡(luò)服務(wù)呢?

  • 給局域網(wǎng)弄個(gè) DHCP 服務(wù)器,那就弄個(gè) dhcpd,看看參考資料;
  • 如果想弄個(gè)郵件發(fā)送服務(wù)器,那就安裝個(gè) sendmail 或者 exim4 ;
  • 如果再想弄個(gè)郵件列表服務(wù)器呢,那就裝個(gè) mailman ;
  • 如果想弄個(gè)接收郵件的服務(wù)器呢,那就安裝個(gè) pop3 服務(wù)器;
  • 如果想弄個(gè) web 站點(diǎn),那就弄個(gè) apache 或者 nginx 服務(wù)器;
  • 如果想弄上防火墻服務(wù),那么通過(guò) iptables 工具配置 netfilter 就可以

What's more?如果你能想到,Linux上基本都有相應(yīng)的實(shí)現(xiàn)。

Linux 下網(wǎng)絡(luò)問(wèn)題診斷與維護(hù)

如果出現(xiàn)網(wǎng)絡(luò)問(wèn)題,不要驚慌,逐步檢查網(wǎng)絡(luò)的各個(gè)層次:物理鏈接、鏈路層、網(wǎng)絡(luò)層直到應(yīng)用層,熟悉使用各種如下的工具,包括 ethereal/tcpdumphping,nmapnetstat,netpipe,netperf,vnstat,ntop 等。

關(guān)于這些工具的詳細(xì)用法和網(wǎng)絡(luò)問(wèn)題診斷和維護(hù)的相關(guān)知識(shí),請(qǐng)看后續(xù)相關(guān)資料。

Linux 下網(wǎng)絡(luò)編程與開(kāi)發(fā)

如果想做網(wǎng)絡(luò)編程開(kāi)發(fā),比如:

  • 要實(shí)現(xiàn)一個(gè)客戶端 / 服務(wù)器架構(gòu)的應(yīng)用,可以采用 Linux 下的 socket 編程了;
  • 如果想寫一個(gè)數(shù)據(jù)包抓獲和協(xié)議分析的程序,可以采用 libpap 等函數(shù)庫(kù);
  • 如果想實(shí)現(xiàn)某個(gè)協(xié)議呢,那就可以參考相關(guān)的 RFC 文檔,并通過(guò) socket 編程來(lái)實(shí)現(xiàn)。

這個(gè)可以參考相關(guān)的 Linux socket 編程等資料。

后記

本來(lái)介紹網(wǎng)絡(luò)相關(guān)的一些基本內(nèi)容,但因時(shí)間關(guān)系,沒(méi)有詳述,更多細(xì)節(jié)請(qǐng)參考相關(guān)資料。

到這里,整個(gè)《Shell編程范例》算是很粗略地完成了,不過(guò)“范例”卻缺少實(shí)例,特別是這一節(jié)。因此,如果時(shí)間允許,會(huì)逐步補(bǔ)充一些實(shí)例。

參考資料

  • 計(jì)算機(jī)網(wǎng)絡(luò)——自上而下的分析方法
  • Linux 網(wǎng)絡(luò)體系結(jié)構(gòu)(清華大學(xué)出版社出版)
  • Linux 系統(tǒng)故障診斷與排除 第13章 網(wǎng)絡(luò)問(wèn)題(人民郵電出版社)
  • 在 Linux 下用 ADSL 撥號(hào)上網(wǎng)
  • Linux 下無(wú)線網(wǎng)絡(luò)相關(guān)資料收集
  • Linux網(wǎng)橋的實(shí)現(xiàn)分析與使用
  • DHCP mini howto
  • 最佳的 75 個(gè)安全工具
  • 網(wǎng)絡(luò)管理員必須掌握的知識(shí)
  • Linux 上檢測(cè) rootkit 的兩種工具: Rootkit Hunter 和 Chkrootkit
  • 數(shù)據(jù)包抓獲與 ip 協(xié)議的簡(jiǎn)單分析(基于 pcap 庫(kù))
  • RFC
  • HTTP 協(xié)議的 C 語(yǔ)言編程實(shí)現(xiàn)實(shí)例
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)