[授權發表]Shell編程範例之網絡操作

by falcon

最初發表:泰曉科技 – 聚焦嵌入式 Linux,追本溯源,見微知著!
原文鏈接:Shell編程範例之網絡操作
評論說明:爲更好地聚合大家的討論,請到上面原文的評論區回覆。


前言

之前已經介紹了shell編程範例之數值、布爾值、字符串、文件、文件系統、進程等的操作。這些內容基本覆蓋了網絡中某個獨立機器正常工作的“方方面面”,現在需要把視角從單一的機器延伸到這些機器通過各種網絡設備和協議連接起來的網絡世界,分析網絡拓撲結構、網絡工作原理、瞭解各種常見網絡協議、各種常見硬件工作原理、網絡通信與安全相關軟件以及工作原理分析等。

不過網絡相關的問題確實太複雜了,這裏不可能介紹具體,因此如果想了解更多的細節,還是建議參考相關的資料,例如後面的參考資料。但是Linux是一個網絡原理學習和實踐的好平臺,不僅因爲它本身對網絡體系結構的實現是開放源代碼的,而且各種相關的分析工具和函數庫數不勝數,因此,如果你是學生,千萬不要錯過通過它來做相關的實踐工作。

網絡原理介紹

我們的網絡世界

在進行所有的介紹之前,來讓我們直觀地感受一下那個真真實實存在的網絡世界吧。當我在Linux下通過WEB編輯器寫這篇blog時,一邊用mplayer聽着遠程音樂,等累了時則打開蘭大的網絡TV頻道開始看看鳳凰衛視……這些“現代化”的生活,我想,如果沒有網絡,將變得無法想象。

下面來構想一下這樣一個網絡世界的優美圖畫:

我一邊盯着顯示器,一邊敲擊着鍵盤,一邊掛着耳機。

我的主機電源燈燦爛得很,發着綠光,這個時候我很容易想象主機背後的那個網卡位置肯定有兩個不同顏色的燈光在閃爍,這個告訴我,它正在與計算機網絡世界打着交道。

就在實驗室的某個角落,有一個交換機上的一個網口的網線連到我的主機上,這個交換機接到了一個局域網的網關上,然後這個網關再接到了信息樓的某個路由器上,再轉接到學校網絡中心的另外一個路由器上……

期間,有一個路由器連接到了這個blog的服務器上,而另外一個則可能連到了那個網絡TV服務器上,還有呢,另外一些則連接到了電信網絡裏頭的某個音樂服務器上……

下面用dia繪製一個簡單的“網絡地圖”:

image

在這個圖中,把一些最常見的網絡設備和網絡服務基本都呈現出來了,包括本地主機、路由、交換機、網橋,域名服務器,萬維網服務,視頻服務,防火牆服務,動態IP地址服務等。其中各種設備構成了整個物理網絡,而網絡服務則是構建在這些設備上的各種網絡應用。

現在的網絡應用越來越豐富多樣,比如即時聊天(IM)、p2p資源共享、網絡搜索等,它們是如何實現的,它們如何構建在各種各樣的網絡設備之上,並且能夠安全有效的工作呢?這取決於這背後逐步完善的網絡體系結構和各種相關網絡協議的開發、實現和應用。

網絡體系結構和網絡協議介紹

那麼網絡體系結構是怎麼樣的呢?涉及到哪些相關的網絡協議呢?什麼又是網絡協議呢?

在《計算機網絡——自頂向下的方法》一書中非常巧妙地給出了網絡體系結構分層的比喻,把網絡中各層跟交通運輸體系中的各個環節對照起來,讓人更通俗易懂。在交通運輸體系中,運輸的是人和物品,在計算機網絡體系中,運輸的是電子數據。考慮到交通運輸網絡和計算機網絡中最終都可以劃歸爲點對點的信息傳輸。這裏考慮兩點之間的信息傳遞過程,得到這樣一個對照關係,見下圖:

image

對照上圖,更容易理解右側網絡體系結構的分層原理(如果比照一封信發出到收到的這一中間過程可能更容易理解),上圖右側是TCP/IP網絡體系結構的一個網絡分層示意圖,在把數據發送到網絡之前,在各層中需要進行各種“打包”的操作,而從網絡中接收到數據以後,就需要進行“解包”操作,最終把純粹的數據信息給提取出來。這種分層的方式是爲了傳輸數據的需要,也是兩個主機之間如何建立連接以及如何保證數據傳輸的完整性和可靠性的需要。通過把各種需要分散在不同的層次,使得整個體系結構更加清晰和明瞭。這些“需求”具體通過各種對應的協議來規範,這些規範統成爲網絡協議。

關於OSI模型(7層)比照TCP/IP模型(4層)的協議棧可以從下圖(來自網絡)看個明瞭:

image

而下圖(來自網絡)則更清晰地體現了TCP/IP分層模型。

image

上面介紹了網絡原理方面的基本內容,如果想了解更多網絡原理和操作系統對網絡支持的實現,可以考慮閱讀後面的參考資料。下面將做一些相關的實踐,即在Linux下如何聯網,如何用Linux搭建各種網絡服務,並進行網絡安全方面的考量以及基本的網絡編程和開發的介紹。

Linux下網絡“實戰”

如何把我們的Linux主機接入網絡

如果要讓一個系統能夠聯網,首先當然是搭建好物理網絡了。接入網絡的物理方式還是蠻多的,比如直接用網線接入以太網,用無線網卡上網,用ADSL撥號上網……

對於用以太網網卡接入網絡的常見方式,在搭建好物理網絡並確保連接正常後,可以通過配置IP地址和默認網關來接入網絡,這個可以通過手工配置和動態獲取兩種方式。

範例:通過dhclient獲取IP地址

如果所在的局域網有DHCP服務,那麼可以這麼獲取,N是設備名稱,如果只有一塊網卡,一般是0或者1。

$ dhclient ethN
範例:靜態配置IP地址

當然,也可以考慮採用靜態配置的方式,ip_address本地主機的IP地址,gw_ip_address是接入網絡的網關的IP地址。

$ ifconfig eth0 ip_address on
$ route add deafult gw gw_ip_address

如果這個不工作,記得通過ifconfig/mii-tool/ethtool等工具檢查網卡是否被驅動起來了,然後通過lspci/dmesg等檢查網卡類型(或者通過主板手冊和獨立網卡自帶的手冊查看),接着安裝或者編譯相關驅動,最後把驅動通過insmod/modprobe等工具加載到內核中。

用Linux搭建網橋

網橋工作在OSI模型的第二層,即數據鏈路層,它只需要知道目標主機的MAC地址就可以工作。Linux內核在2.2開始就已經支持了這個功能了,具體怎麼配置看看後續相關參考資料吧。如果要把Linux主機配置成一個網橋,至少需要兩個網卡。

網橋的作用相當於一根網線,用戶無須關心裏頭有什麼東西,把它的兩個網口連接到兩個主機上就可以讓這兩個主機支持相互通信。不過它比網線可厲害多了,如果在起上配置防火牆,就可以隔離連接在它兩端的網段(注意這裏是網絡,因爲它不識別IP),另外,如果這個網橋有多個網口,那麼可以實現一個功能複雜的交換機了,而如果有效組合多個網橋,則有可能實現一個複雜的可現實現流量控制和負載平衡的防火牆系統了。

用Linux做路由

路由工作在OSI模型的第三層,即網絡層,通過router可以配置Linux的路由,當然,Linux下也有很多工具支持動態路由的。相關的資料在網路中鋪天蓋地,由於時間關係,這裏不做介紹,自己找找合適的去看吧。

用Linux搭建各種常規的網絡服務

你需要什麼服務呢?給你的局域網弄個DHCP服務器,那就弄個吧,看看參考資料;如果想弄個郵件發送服務器,那就弄個sendmail或者exim4吧,如果再想弄個郵件列表服務器呢,那就裝個mailman,如果想弄個接收郵件的服務器呢,那就安裝個pop3服務器吧,如果想弄個web站點,那就弄個apache服務器,如果想弄上防火牆服務,那麼通過iptables工具配置netfilter就可以,what's more?如果你能想到,Linux上應該都有相應的實現。

Linux下網絡問題診斷與維護

如果出現網絡問題,不要驚慌,逐步檢查網絡的各個層次:物理鏈接、鏈路層、網絡層直到應用層,熟悉使用各種如下的工具,包括ethereal/tcpdump, hping, nmap, netstat,netpipe,netperf,vnstat,ntop等等。

關於這些工具的詳細用法和網絡問題診斷和維護的相關知識,看看後續資料吧。

Linux下網絡編程與開發

如果想自己做一些相關的網絡編程開發呢,比如實現一個客戶端/服務器架構的應用,那麼就可以採用linux下的socket編程了,如果想寫一個數據包抓獲和協議分析的程序呢,那麼可以採用libpap等函數庫了,如果想實現某個協議呢,那就可以參考相關的RFC文檔,並通過socket編程來實現了。

這個可以參考相關的Linux socket編程等資料。

後記

本來積累了很多相關的技巧,但是因爲時間關係,暫且不詳述了,更多細節你可能能夠從本blog中搜索到,或者直接到網絡中找找。

到這裏,整個《shell編程範例序列》算是很粗略地完成了,你可以從這裏訪問到這份範例序列的列表。不過“範例”卻缺少實例,特別是這一節。因此,如果有時間我會逐步補充一些實例,並在sf.net上維護一份範例列表的。

如果有任何疑問和建議,歡迎在後面回帖交流。

參考資料

  • 計算機網絡——自上而下的分析方法
  • Linux 網絡體系結構(清華大學出版社出版)
  • Linux 系統故障診斷與排除 第13章 網絡問題(人民郵電出版社)
  • 在Linux下用ADSL撥號上網
  • Linux下無線網絡相關資料收集
  • Linux網橋的實現分析與使用
  • DHCP mini howto
  • 最佳的75個安全工具
  • 網絡管理員必須掌握的知識
  • Linux上檢測rootkit的兩種工具: Rootkit Hunter和Chkrootkit
  • 數據包抓獲與ip協議的簡單分析(基於pcap庫)
  • RFC
  • HTTP協議的C語言編程實現實例
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章