jackkcg
站務副站長
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://delphi.ktop.com.tw/loadfile.php?TOPICID=7404967&CC=165613) 發表:891 回覆:1050 積分:848 註冊:2002-03-23
發送簡訊給我
|
轉貼來源
http://www.adj.idv.tw/server/index.htm 網路設定
經過這麼長的路程﹐當您辛苦完成了 Linux System 的準備之後﹐我們到這裡才真正說要為 Linux 設定一些最引人入勝的東西。當然﹐這一切都要從 Linux 的網路功能開始﹐離開了網路﹐Linux 只能是匹養在馬房裡面的良驅﹐英雄無用武之地。哦﹐這樣說﹐或許有點偏見的﹐因為對我個人來說﹐只會用 Linux 來架設伺服器而已。別的朋友﹐可能會拿 Linux 做其它用途﹐那就不是我們這裡要學習的了。 前提條件 在進行 Linux 網路設定之前﹐您必須已經對網路有一定的概念﹐否則﹐我建議您先完成“學習網路”那邊的閱讀﹐然後才來動手 Linux 的網路實作。在本章的學習中﹐您最起碼要知道基本的區域網路架構﹐以及 IP 的 subneting 和 routing 的原理和分析。而往後的 server 架設﹐更需要您對各種 service 運作原理有一定的基礎認識。 有良好習慣的管理員﹐在進行任何系統安裝和設定的時候﹐第一件事情不是跑到機器前面敲鍵盤﹐而是先找一張紙﹑抓一隻筆。換句話說﹐先規劃後動手就是了。 在當初安裝 Linux 的時候﹐我已經知道我的機器打算用來做什麼角色的了。現在﹐再讓我們規劃一下﹐到底怎樣將機器接到網路上去﹐這必須要看當前的網路環境﹕ 首先﹐這裡僅是一個家庭網路。不過﹐也會進行一些 Internet 的模擬測試﹐所以同時也是一個實驗網路。
對外使用撥接式的 ADSL﹐雖然 ISP 允許同時 5 台機器上網﹐但為了安全起見﹐我會透過 NAT + Firewall 提供內部網路的上網服務﹐這正是目前這台機器的主要功能。
因為要進行模擬﹐所以會另外再設一個 DMZ 區域。
內部網路使用 192.168.100.0/24 的 IP ﹔另外把 10.0.1.0 切為 8 個子網路﹐將 10.0.1.128/27 分配給 DMZ 使用﹔再將 10.0.1.0/27 給外部界面使用﹐因為 ADSL 不是 routing mode﹐所以用這個 private IP 也無妨﹐反正用 PPPoE 上網。
網路一共有 3 個 Hub 可供使用﹐分別擔當這三個網路的連接任務﹐同時在物理上將各網路分開。 根據網路環境和需求﹐如下是我初步規劃的網路架構圖例﹕
![](http://www.adj.idv.tw/server/net_logic.gif)
網路設定
經過這麼長的路程﹐當您辛苦完成了 Linux System 的準備之後﹐我們到這裡才真正說要為 Linux 設定一些最引人入勝的東西。當然﹐這一切都要從 Linux 的網路功能開始﹐離開了網路﹐Linux 只能是匹養在馬房裡面的良驅﹐英雄無用武之地。哦﹐這樣說﹐或許有點偏見的﹐因為對我個人來說﹐只會用 Linux 來架設伺服器而已。別的朋友﹐可能會拿 Linux 做其它用途﹐那就不是我們這裡要學習的了。 前提條件 在進行 Linux 網路設定之前﹐您必須已經對網路有一定的概念﹐否則﹐我建議您先完成“學習網路”那邊的閱讀﹐然後才來動手 Linux 的網路實作。在本章的學習中﹐您最起碼要知道基本的區域網路架構﹐以及 IP 的 subneting 和 routing 的原理和分析。而往後的 server 架設﹐更需要您對各種 service 運作原理有一定的基礎認識。 有良好習慣的管理員﹐在進行任何系統安裝和設定的時候﹐第一件事情不是跑到機器前面敲鍵盤﹐而是先找一張紙﹑抓一隻筆。換句話說﹐先規劃後動手就是了。 在當初安裝 Linux 的時候﹐我已經知道我的機器打算用來做什麼角色的了。現在﹐再讓我們規劃一下﹐到底怎樣將機器接到網路上去﹐這必須要看當前的網路環境﹕ 首先﹐這裡僅是一個家庭網路。不過﹐也會進行一些 Internet 的模擬測試﹐所以同時也是一個實驗網路。
對外使用撥接式的 ADSL﹐雖然 ISP 允許同時 5 台機器上網﹐但為了安全起見﹐我會透過 NAT Firewall 提供內部網路的上網服務﹐這正是目前這台機器的主要功能。
因為要進行模擬﹐所以會另外再設一個 DMZ 區域。
內部網路使用 192.168.100.0/24 的 IP ﹔另外把 10.0.1.0 切為 8 個子網路﹐將 10.0.1.128/27 分配給 DMZ 使用﹔再將 10.0.1.0/27 給外部界面使用﹐因為 ADSL 不是 routing mode﹐所以用這個 private IP 也無妨﹐反正用 PPPoE 上網。
網路一共有 3 個 Hub 可供使用﹐分別擔當這三個網路的連接任務﹐同時在物理上將各網路分開。 根據網路環境和需求﹐如下是我初步規劃的網路架構圖例﹕ 設定網路卡 下面的例子是教您如何使用 module 的形式安裝多片網路卡在同一機器上。先假設我已經有一片 rtl8139c 的 PCI 網路卡﹐並且在安裝過程中已經順利抓到並且設定好了。現在﹐我需要加一張 rtl8029 pci 和一張 rtl8019 isa 網路卡(這些型號您可以從網路卡的晶片組上看得到)﹕ 首先﹐您必須知道他們相關的 Linux 模組名稱是什麼﹖我暫時沒有做功課﹐先用通用驅動程式來試試﹐所以我選擇 ne2k-pci 和 ne 這兩個模組。您必須確定在 /lib/modules/`uname -r`/kernel/drivers/net/ 目錄下有這些模組存在﹐否則就編譯核心﹐將如下兩個項目編為模組﹕ NE2000/NE1000 support (NEW)
PCI NE2000 and clones support (see help) 然後﹐如果您使用的網路卡有 ISA 類型的話﹐要找出它的 irq 和 io。如網路卡沒有 jumper 設定的話﹐廠家通常會提供一片磁碟供您設定資源數值的(假設我們這裡將 ISA 網卡的 irq=3﹐io=300)。 然後進入 BIOS ﹐確定它們沒有和其他設備衝突(例如這裡要關閉 COM2 的設定)﹐再轉到 PnP/PCI 的設定上﹐將 ISA 網路卡所使用的 IRQ 保留起來﹐也就是設定為 Legacy ISA (註﹕PCI 類型的網路卡無需如此設定)。 然後修改 /etc/modules.conf 這個檔案﹕ alias eth0 8139too
alias eth1 ne2k-pci
alias eth2 ne
options ne io=0x300 irq=3
上面的第一行﹐應該是系統原本就有的﹐因為在安裝的時候就會設定好了。其後的四行才是我需要增加的﹕首先將 rtl8029(ne2k-pci) 用來做 eth1﹐然後 rtl8019(ne) 做 eht2。因為 rtl8019 是 ISA 網路卡﹐所以還要用 options 為它的模組設定 io ﹐要注意哦﹕io 的設定﹐一定要用 0x 開頭的﹗而通常來說﹐如果 io 設定正確了﹐irq 或許可以不設。 Tips﹕假如您的網路卡都是同一個型號﹑使用同一個模組的話﹐那您可以如此設定﹕ alias eth1 ne
alias eth2 ne
options ne io=0x300,0x320 irq=3,5 那麼﹐ eth1 的 io=0x300﹑irq=3﹐而 eth2 的 io=0x320﹑irq=5 ﹐如此類推。 不過﹐通常來說﹐pci 不用設定 io 和 irq 啦﹐所以無需擔心這個。然而﹐您就很難控制哪一張卡是第一﹑哪一張卡是第二﹐碰到這樣的情況﹐可能需要將網路線換過來插了﹐總要試試才知道啦。 完成設定之後﹐執行如下命令﹕ modprobe ne2k-pci
modprobe ne 如果有錯誤的話﹐根據信息內容進行修改。(也可以改用 insmod 命令) 假如上一個動作能順利完成﹐然後執行如下命令﹕ dmesg | grep eth 這樣﹐您可以看到系統所抓到的網路卡資訊﹐包括他們的型號﹑ IRQ 和 IO 等等。在我們的例子中﹐應該會看到類似如下的資訊﹕ eth0: RealTek RTL8139 Fast Ethernet at 0xc8871000, 00:50:fc:30:ea:61, IRQ 9
eth0: Identified 8139 chip type 'RTL-8139C'
eth0: Setting 100mbps full-duplex based on auto-negotiated partner ability 45e1.
eth1: RealTek RTL-8029 found at 0xd400, IRQ 10, 00:00:21:D2:30:DA.
NE*000 ethercard probe at 0x300: 00 00 e8 5a 78 af
eth2: NE2000 found at 0x300, using IRQ 3. 到此為止﹐我們基本上可以確定網路卡已經設定好﹐並且能被系統抓到了。 如果您使用的是筆記本型電腦﹐或許要使用到 PCMCIA 網路卡。嗯﹐現在的核心打都能支援市面上的 PCMCIA 網路卡﹐萬一您的型號不在核心支援之列﹐說實在您要成功設定起來的機會很低。不過﹐您仍可將希望寄託在最新的 pcmcia-cs 套件上面。pcmcia-cs 其實就是核心要處理 pcmcia 裝置的程式﹐您可以到如下網頁下載最新的版本回來﹕ http://sourceforge.net/project/showfiles.php?group_id=2405 在進行設定之前﹐我建議您先閱讀一下 PCMCIA 的 HOWTO 文件(中文版在 這裡 )。 然而﹐不幸的是﹐我到上面網站下載 pcmcia-cs-3.1.29.tar.gz 回來測試﹐執行 make config; make all; make install 之後﹐卻導致原本的 PCMCIA 網路卡都抓不到了﹗我分別在 Acer TM 351TE 和 Dell D266XT 上面的 Redhat 7.1 和 Mandrak 8.0 上面試過﹐弄了大半天還是搞不定。最後只好放棄﹐用光碟本身自帶的 kernel-pcmcia-cs-x.x.x.x.rpm 來復原。 我所碰到的問題主要是 modules 的問題。如果 kernel 裡面 General 的 pcmcia 選項有選擇為 Y 或 M 的話﹐則不會在 /lib/moduels//kernal/pcmcia 目錄下面產生 modules 。將 kernel 選項選擇為 N ﹐的確可以產生 moduels﹐但卻會碰到 unresolvable symbols 的頭痛問題。而且﹐就算沒有 symbols 問題﹐同時也可以載入 pcmaic-core 模組﹐還是不能成功抓到網路卡﹐不是告訴您沒有 high memory 就是根本沒反應。 嗯﹐因為我在系統方面不是很在行﹐也不想花太多時間在這上面了﹐暫時留作日後的功課吧。假如讀者能夠解決這個問題﹐我非常希望您能將步驟 寄來給我。謝謝﹗ 設定主機 當您將網路卡設定好之後﹐接下來是將 Linux 連上網路去。而網路上這麼多機器﹐要區別它們﹐在 TCP/IP 網路中必須以各自唯一的 IP 位址為依據。不過﹐對我們人類來說﹐要記 IP 數字通常都比較困難﹐所以﹐最好為每台機器起一個名字。取名沒什麼特別規則﹐總之容易記得和不重複就是了。 我們在“網路基礎中”討論 DNS 的時候知道﹐每一個連上 Internet 的網路﹐都有著各自的 domain 名字。即使您沒有正式向 InteNIC 註冊﹐也應該為自己的 domain 起一個名字。如果您已註冊有合法的 domain 了﹐也最好和內部網路的 domain 名稱分開。如沒特別理由﹐儘量使用一個最不會在 internet 出現的名字﹐這樣就最大程度避免了 domain 名字衝突了。(請儘量避免用什麼 xxxx.xxxx.com 等名字﹐因為那樣可能會和真正註冊了的 domain 衝突。) 在這個例子中﹐我用自己的名字拼音來做 domain name﹕siyongc.domain。相信 internet 上面應該不至於用我的名字做 domain 吧﹖所以﹐我將我的機器命名為﹕rh71.siyongc.domain 。 Tips﹕您也可以用 localdomain 來做 domain 命名﹐系統預設上的 localhost 就是從屬於這個 domain 之下。名稱選用方法有很多啦﹐只要不和別人衝突就行。 至於主機名稱﹐特別那些與 Internet 連接的主機﹐按一般的慣例﹐我們都採用一些‘與系統無關’的名稱。上面使用的名稱(如 rh71) 說實在不是很合乎要求﹐取而代之的﹐您可以開一個動物園或植物園﹐用動物名稱(例如 lion﹑monkey 之類) 或水果名稱(例如 apple﹑banana 之類) 來命名機器。這樣的好處是﹕首先﹐別人不容易從機器名稱上得知您的系統類別(有經驗的駭客還是有辦法的)﹔其次﹐在 DNS 設計上(日後我們會談到 DNS 設定)較為靈活﹐只要用 CNAME 將常用的 server (如 www﹑mail 等) 對應到不同的機器名稱上就可以了﹐萬一機器掛了或要進行更換﹐修改起來容易得多。 如果您在安裝的時候﹐有選擇網路功能﹐那時候應該已經設定好了。只要您使用 hostname 命令(不帶任何參數)就可以看到當前的機器名稱。您也可以隨時用這個命令來改變機器名稱﹕ hostname rh71.siyongc.domain 我們在 system 系列中的第二章“開機與關機”文章中已經知道﹐系統在開機的時候會嘗試設定主機名稱。如果您用 hostname 命令修改了主機名稱﹐而沒有修改開機設定﹐那下次開機還是用回原來的名稱。在 RedHat 系統裡面﹐您的主機名稱設定定義在 /etc/sysconfig/network 這個檔案的 HOSTNAME 變數中。如果您要變更您的主機名稱﹐可以用文書編輯器直接修改這些檔案。只有這樣﹐下次開機才能抓到正確的機器名稱。除此之外﹐您還要修改 /etc/HOSTNAME 這個檔案﹐把新的主機名稱寫到裡面就可以了﹕ hostname > /etc/HOSTNAME 前面說過﹐hostname 是給我們人類記憶的﹐機器本身使用的還是 IP 數字。為此﹐當我們修改了機器名稱之後﹐您還必須修改另外一個檔案﹕/etc/hosts 。在這個檔案裡面﹐您要確定兩個機器名稱必須指定正確﹕ 一個名稱是﹕localhost ﹐它對應的 IP 一定是 127.0.0.1。這是一個“本機環迴位址( loop back address)”﹐就算您的機器不安裝網路卡﹐這個名字是一定要有的﹔
另外一個就是剛才您修改的﹐要和您分配給這台機器的 IP 對應著﹐如果在其它機器上的 hosts 檔中有您這台機器名稱的設定﹐也必須更新過來。 在我的機器上﹐/etc/hosts看上去是這樣的﹕ # local machine names
127.0.0.1 localhost.localdomain localhost
192.168.100.23 rh71.siyongc.domain rh71
10.0.1.131 rh71.dmz.domain rh71dmz
# other machine names
192.168.100.20 acer.siyongc.domain acer
192.168.100.24 mdk.siyongc.domain mdk
10.0.1.130 lp64.dmz.domain lp64dmz 每一行句子的欄位分別是﹕IP 位址﹑主機名稱﹑主機別名(可以多個﹐用空白鍵分隔)。這裡除了 localhost﹑rh71 和 rh71dmz 是本機名稱之外﹐其他都是在網路上別的機器﹐或是一些虛擬主機對應。 不過﹐光完成上面這些設定還不足夠﹐如果您知道網路上已架設有 DNS 伺服器﹐或是會使用 Internet 上的資源﹐那您還要修改 /etc/resolv.conf 這個檔案﹐將 DNS 主機 IP 加進去﹐如﹕ nameserver 0.0.0.0
nameserver 168.95.1.1
nameserver 139.175.10.20
domain siyongc.domain
search siyongc.domain dmz.domain test.com 先讓我們解讀上面這個檔案吧。 這個 resolv.conf 檔案主要用來設定 dns client 端上所使用的 DNS server ﹐您最多可以設定三個 namesever 。然後機器會按順序查詢第一台 nameserver﹐如果得不到回應﹐則轉向下一台﹐如果有回應就不使用後面的 nameserver 了。所以﹐並不是這裡設定多幾台 nameserver 就可以幫您加快 DNS 的查詢﹐而僅是做備份用途而已﹐而且其設定順序也非常講究。一般而言﹐在 Internet 環境中﹐您可以使用任何一台正常工作的 DNS 來幫您進行名稱解釋服務﹐但我們通常會以最距離最近的 nameserver 為優先。假如您的機器本身就是一台 DNS server﹐那您可以用 0.0.0.0 來表示﹐當然您也可以用系統本身的 IP﹐但如果您有多個 IP 位址的時候﹐我會建議您用 0.0.0.0 或 127.0.0.1 。 然後是 domain 的設定﹐這沒什麼特殊用途﹐只是指定了系統本身所在的 domain 而已。可設也可以不設。 最後關於 search 設定﹐這也是可設可不設的﹐在這裡您可以用空白鍵分隔設定多個 domain name 。它的作用是﹕當系統在查詢一個名稱的時候﹐假如該名稱不是一個完整的 DN 名稱﹐則會將 search 指定的 domain 依次附加在主機名稱後面。按上面的設定﹐當您所查詢的名稱是 myhost 的時候﹐然後系統會依次查詢 myhost.siyongc.domain﹑myhost.dmz.domain myhost.test.com 。在這個查詢過程中﹐一旦查詢到結果之後﹐將不再往下繼續 search﹔但如果所有 search 都沒有結果﹐則告訴您查詢失敗。 到這裡﹐您或許有些混亂﹕前面的 /etc/hosts 檔可以幫我們繼續主機名稱與 IP 的對應﹐這裡的 /etc/resolv.conf 又可以指定 DNS 來查詢﹐究竟會以哪個為標準啊﹖ 問得好﹗要回答這個問題﹐您首先要檢查 /etc/host.conf 這個檔案﹐其內容或許如下﹕ order hosts,bind
multi on 這個檔案的第一句﹐是告訴系統在進行名稱解釋的時候所使用的方法﹐以及使用順序。這裡的 hosts 就是告訴系統首先查詢 /etc/hosts 檔﹐如果沒有結果﹐則轉向 bind﹐也就是 DNS 服務的意思啦。除了這兩個方法之外﹐您還可以透過 nis 來查詢﹐這個我們日後談到 NIS 服務的時候就知道了﹐現在不必擔心。 如果您在這個檔中﹐將 multi 設定為 on 的話﹐則允許一台主機使用多個 IP 位址﹐但只對 /etc/hosts 有效。 除了上面兩個主要的設定外﹐您還可以在這個檔裡面設定﹕ alert﹕如果設定為 on 的時候﹐會將任何試圖騙取 IP 的動作透過 syslog 進行記錄。
nospoof﹕如果設定為 on 的時候﹐會對名稱進行反查詢﹐以確定名稱的正確性。
trim﹕可以指定一個預設 domain name﹐然後讓您在 /etc/hosts 檔裡面只設定主機名稱就可以了。 除了上述這個 host.conf 檔之外﹐您還必須留意 /etc/nsswitch.conf 這個檔案。它主要用來提供給系統函式程式所使用的名稱服務換置﹐裡面的設定有很多﹐其中會有這樣一行﹕ hosts: files nisplus dns 這同樣是用來設定主機名稱的查詢順序用的﹐但它的設定更為複雜﹐您可以 man nsswitch.conf 來慢慢參考。 設定網路 當您的網路卡設定好了﹐主機名稱也有了﹐但要連上網路還需要再花點功夫。在介紹相關設定檔之前﹐先讓我們認識網路設定的基本命令﹕ ifconfig 如果我們只輸入這個命令﹐後面不帶任何參數的話﹐系統會將目前的網路設定狀況顯示出來﹕ eth0 Link encap:Ethernet HWaddr 00:50:FC:30:EA:61
inet addr:192.168.100.23 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:962 errors:0 dropped:0 overruns:0 frame:0
TX packets:723 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:9 Base address:0x1000 lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:172 errors:0 dropped:0 overruns:0 frame:0
TX packets:172 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
您可以看到界面的名稱( eth0 等)﹑界面類型( Ethernet 等)﹑界面實體位址﹑IP 位址﹑廣播位址﹑Net Mask﹑界面目前狀態﹑MTU(Maximum Transmission Unit)大小﹑路由 Metric 數目﹑接收(RX)封包狀態﹑發送(TX)封包狀態﹑網路碰撞﹑發送隊列﹑IRQ﹑IO地址﹑等等信息 (如果你不知道它們是什麼﹐請參考"網路基礎")。 透過命令結果﹐我們還可以判斷當前的網路狀態呢。例如﹐其中的 RX 和 TX 是界面處理的封包總數﹐再和下面的 collisions 作比例計算﹐就知道該界面所連接的網路是否太擁擠了。不過﹐這也與您使用的硬體設備有關﹐例如 hub 和 switch 所反映的結果是不一樣的。 在我目前的例子中﹐因為 eth0 是安裝的時候就設定好的﹐還有 lo 代表 loopback 界面﹐所以您會看到它們。但 eth1 和 eth2 雖然已經被核心抓到(透過 dmesg 可以知道)﹐但因為還沒有網路設定﹐所以暫時看不到。下面就教您如何用命令將它們跑起來。 ifconfig 命令除了可以讓您查看界面情況之外﹐也可以用來設定界面。例如﹕ ifconfig eth1 10.0.1.1 netmask 255.255.255.224 broadcast 10.0.1.63 up
ifconfig eth2 10.0.1.131 netmask 255.255.255.224 broadcast 10.0.1.159 up 這時候您再輸入 ifconfig 命令不帶任何參數的話﹐就看到所有界面的設定了﹗ 使用 ifconfig 命令來設定 IP 的時候﹐最好不要偷懶﹐先用 ip && mask 計算出 broadcast 位址(如果不會﹐請參考 “IP 位址”一文)﹐然後以完整的參數進行設定。最後的 up 可以不用設定﹐但改為 down 的話﹐可以將界面的 IP 位址關閉掉。 通常來說﹐一個界面只會使用一個 IP﹐但這並非絕對的。在 Linux 系統上﹐您可以為一張已有 IP 的界面增設 IP Alias ﹐也就是將多個 IP 綁在同一張網路卡上面。我們用 ifconfig 來設就可以了﹐唯一不同之處在於﹕原生界面我們都用 eth0﹑eth1﹑eth2 這樣的名字來表示﹐而 alias 則在原界面上再用 " :" 分隔設定另外一位數字﹐例如﹕eth0:0﹑eth0:1﹑eth0:2﹑eth1:0﹑eth1:1﹑eth2:0﹑...﹑如此類推。下面的命令﹐就是為 eth2 設定第一個 alias﹕﹕ ifconfig eth2:0 10.0.1.2 netmask 255.255.255.224 broadcast 10.0.1.63 up 如果您再輸入 ifconfig eth2:0﹐就可以看到如下的結果﹕ eth2:0 Link encap:Ethernet HWaddr 00:00:E8:5A:78:AF
inet addr:10.0.1.2 Bcast:10.0.1.63 Mask:255.255.255.224
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:3 Base address:0x300 您會發現﹐eth0:0 和 eth0 的實體位址都是一樣的﹗如果您了解 ARP 協定的話﹐應該不難理解這個現像。無論如何﹐當網路連線在底層 (datalink) 傳送的時候﹐alias 和原生界面並沒有分別﹐但在網路層中﹐則可以視為兩個不同的邏輯位址。這對於架設虛擬主機的朋友來說﹐無疑是非常便利的。假如您是一個 ISP﹐向客戶提供網頁 hosting 服務﹐那您可以在同一台機器上用 alias 設定多個 IP﹐然後就能夠同時向多個客戶提供服務﹐而無須每一個客戶都弄一長界面或架一台主機。一張界面最多可以設定多少個 alias 我沒考證過﹐但作為商業運作而言﹐基本的服務品質還是必須要保證的。 Tips﹕在設定 IP alias 的時候﹐在同一個界面上的 IP 不一定都要在同一個 subnet 裡面﹐只要路由設定正確的話﹐就沒問題。但是如果您了解 IP 和 ARP 協定的話﹐您會發現在同一個物理網段上面設定不同的 subnet﹐事實上會造成額外的封包流量。具體原理我這裡不詳細說了。 如果我們要關閉一個 Alias 界面﹐只需輸入﹕ ifconfig eth2:0 down 則可。 此外﹐ifconfig 除了可以設定界面和 alias 的 IP 位址之外﹐您還可以透過如下的參數設定一些界面特性﹕ [-]ARP﹕啟用或關閉 ARP 協定支援﹔
[-]allmulti﹕啟用或關閉 all - multicast 模式﹐然而會將信息傳給核心﹔
[-]pointpoint [addr]﹕指定為點對點模式﹐也就是連線直接與另一端機器直接相連﹐可用後帶的位址指定另一端的位址﹔
hw﹕指定界面的硬體類型﹐如 ether﹑ax25﹑ARCnet﹑netrom
metric N﹕指定界面之路由成本。
mtu N﹕指定最大傳送單位。 route 如果我們只輸入這個命令而不帶任何參數﹐我們可以看到系統目前使用的路由表格設定﹕ Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
swtn184-1.adsl. * 255.255.255.255 UH 0 0 0 ppp0
10.0.1.128 * 255.255.255.224 U 0 0 0 eth2
10.0.1.0 * 255.255.255.224 U 0 0 0 eth1
192.168.100.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default swtn184-1.adsl. 0.0.0.0 UG 0 0 0 ppp0 Tips﹕假如您輸入命令後要等很久﹐那就是名稱解析上有問題﹐請確定 /etc/hosts 的完整與正確﹐或是 DNS 運作良好。不過﹐您也可以用 route -n (加上 -n 參數)只顯示 IP ﹐因為無需進行名稱查詢﹐所以就不會有延遲現像了。 從上面的命令結果中﹐我們可以看到﹕ 第一欄是“目的地位址”﹐可以是一個網路﹐也可以是一台主機﹐如果是 0.0.0.0 的話就是 default gw (預設閘道/網關)﹔
然後﹐第二欄是“Gateway 位址”(‘*’表示無需使用 gateway﹐例如本機網路和廣播位址)﹐也就是封包的下一站位址﹐它必須和相應的界面在同一個 subnet 之中﹔
接下來是關於目的地的 NetMask﹐這個非常重要﹐因為它是用來判斷目的位址範圍的依據﹐如果是 255.255.255.255 的話﹐那代表一台主機﹐如果是 0.0.0.0 則是 default gw 所用的﹔
第四欄是“旗標”﹐這裡的 U 是“Up”的意思﹐也就是目前已啟用﹐如果是 H 表示目的地為一個“Host”﹐ G 表示使用“Gateway”的意思﹔
接下來的 Metric 和 Ref 是供路由系統參考的﹐其中的 metric 是路由成本﹐ref 則是針對該路由的連線數目﹔ 最後是通往目的地所使用的網路界面。 在上面的例子中﹐您所看到的一個用 3 個網路的路由﹐分別是機器上三張網路卡所連接的﹔還有一個 loop back 界面的所在的網路﹔而最頂和最底下兩行則是完成 ADSL 撥接上網之後才有的。但您要留意最後一行就是所謂的 default gw 設定﹐沒有它﹐我們就無法連線到 internet 上面了。 如果您還記得我們在“學習網路”當中的 IP 基礎 的話﹐您應該知道什麼是靜態路由和動態路由(否則﹐我強烈建議您先弄明白 ip routing 再回來繼續)。事實上﹐這個 route 命令除了可以顯示當前的路由表格之外﹐更為重要的﹐它就是來給管理員設定靜態路由用的。利用它﹐我們可以修改﹑增加﹑和刪除系統的路由表格設定﹐告訴機器通往某一個網路或主機使用哪一個 gateway﹑路由成本﹑以及使用哪一個界面等等。至於動態的路由﹐在 Linux 上可以使用 routed 或 gated 服務﹐但這需要相鄰的路由設備都要使用相同的路由協定﹐例如 RIP 和 OSPF 等﹐因為牽涉的設定非常複雜﹐這裡就不進行說明了。 下面我將會示範 route 命令的用法。 在我的例子中﹐首先要先挑一個已出現在路由表格的設定﹐然後移除它(我待會再示範如何加回去)﹕ route del -net 10.0.1.128 netmask 255.255.255.224 dev eth2 這時再輸入一次 route -n 就可以確定有關 10.0.1.0 這網路的路由設定已經給移除掉了。 接下來﹐我再將剛纔刪除的路由加回去﹕﹕ route add -net 10.0.1.128 netmask 255.255.255.224 dev eth2 相信您現在不難看出﹕增加和移除路由設定﹐分別之處就是使用‘add’和‘del’來做命令選項。這時候再執行 route 就可以看到路由設定有回到路由表格中去了。 上面這個命令﹐就是在路由表格中新增一條到 10.0.1.128/27 這個網路的路由﹐它所使用的界面是 eth2 。只要您知道 ip﹑netmask﹑net_id 的關係﹐使用上面的命令是不成問題的。 Tips 1﹕有時候﹐如果我們使用 ifconfig 手工的增加了一個界面﹐嚴格來說﹐我們還應該為界面增加一個‘H’記錄﹐也就是用 add -host 來設定﹐但就無需使用 netmask (用了反而不接受﹗)﹕ route add -host 10.0.1.2 dev eth2:0 不過﹐這也不是一定必須如此的﹐如果您發現有問題再增加就是了。在以前的系統裡面﹐您會在 route table 中看到所有界面的 IP 位址路由項目﹐不過現在的系統似乎只顯示 network 的記錄而已。 Tips 2﹕對於剛開始設定 adsl 的朋友來說要特別注意 default gw 的設定﹕如果您的系統原本就設定有 default gw 的話﹐rp-pppoe 在完成撥接後將不會修改這個設定﹐這樣會造成您連不上 internet (因為 default gw 不正確的緣故)。要解決這個問題﹐您有兩個方法﹕(1) 修改 /etc/sysconfig/network 將其中的 GATEWAY 和 GATEWAYDEV 句子拿掉﹔(2) 或是﹐執行如下命令﹕ route add default dev ppp0 註﹕上面的 ppp0 是您的 ADSL 撥接界面﹐假如您不是用 ppp0 的話﹐那請修改為正確的設備名稱。 如果您採用第二種方法﹐那在結束 ADSL 撥接之後﹐再檢查 route table ﹐確定剛纔的設定被取消﹐否則用手工的方法移除(相信您會移除吧﹖不會就要打屁屁了~~)。 下面不如讓我們在真實的環境中模擬一下路由的設定吧。 就用我家裡的網路環境就好了﹕我在家中分有兩個 subnet﹐它們的物理連線也是分開的(接在不同的 hub 上)﹐其中一個使用 192.168.100.0/24 這個子網﹐而另外一個則使用 10.0.1.128/27 子網路。我目前的這台 Linux 機器上﹐用不同的網路卡連接到這兩個子網中﹐分別是 192.168.100.23(eth0) 和 10.0.1.131(eth1) 。第一個子網裡面有一台 Windows 主機﹕192.168.100.20 ﹐並沒有設定 default gateway ﹔而另外一個子網則有一台 Linux 主機﹕10.0.1.130 ﹐它的 default gateway 是 10.0.1.131 ﹐也就是我們一直以來做教學用的機器。 好了﹐這情形下﹐您不難看出﹕我目前使用的 Linux 機器 ( rh71 ) 就是這兩子網的 router 。不過﹐要在 Linux 啟動路由能力﹐必須將 ip forwarding 功能打開﹐只要執行下面命令就可以了﹕ echo "1" > /proc/sys/net/ipv4/ip_forward Tips﹕如果您想要在開機的時候就將 ip forward 打開﹐您可以修改 /etc/sysctl.conf 檔案﹐修改其中的句子﹕ net.ipv4.ip_forward = 1 但上面的動作僅是將路由打開而已﹐我們不能忘記路由是雙向的﹐儘管 10.0.1.130 那邊已經設定好預設路由﹐但 Windows 這邊卻對另外一個網路毫不知情。所以﹐我們必須為 Windows 主機增加一筆 10.0.1.128/27 的路由﹐請進入 Windows 的 MS-DOS 模式﹐並輸入﹕ route add 10.0.1.128 mask 255.255.255.224 192.168.100.23 metric 1 哈哈﹐有沒發現 Windows 的命令和 Linux 的不完全一樣哦﹐不過也相差不遠﹐反正原理都一樣啦。然後您輸入 route PRINT 就可以看到 Windows 的路由表格了。這樣的話﹐那就可以讓 192.168.100.20 和 10.0.1.130 相互連接了 ^_^ 當然﹐如果我將 windows 的 default gw 設定為 192.168.100.23 也同樣可以的﹕控制台 --> 網路 --> TCP/IP --(您的網路卡型號) --> 內容 --> 通訊閘 ﹕
反過來﹐如果在 10.0.1.130 那邊沒有將 10.0.1.131 設為 default gw 的話﹐那您也要在路由表格上面增加一筆關於 192.168.100.0/24 的路由﹕ route add -net 192.168.100.0 netmask 255.255.255.0 gw 10.0.1.131 dev eth0 無論如何﹐您要記住一點﹕如果要兩個網路能夠成功的達成路由﹐雙方網路必須有相應的路由設定通向對方網路才行。然而﹐初學者最容易犯的一個錯誤是﹕在同一台主機上﹐將兩張不同的網路卡設定在同一個 subnet 之內。 在網路管理方面﹐subnet 和 routing 是最基本的技能﹐就好像小學生學習加減乘除一樣﹐是基本到不能再基本的了。上面介紹的 ifconfig 和 route 這兩個命令也是 Linux 的最基本網路命令﹐如果您會得靈活運用﹐我敢保證您在任何一個 Linux 系統都會設定網路﹐而不是問﹕“怎麼沒有 xxxxx 工具﹖我在 yyyyyy 上面明明可以這樣設定的。” ping 關於這個命令應該很多人都用過了吧﹖它就是用來測試兩台主機是否能夠順利連線的最簡單的工具﹕ ping -c 4 10.0.1.131
PING 10.0.1.130 (10.0.1.130) from 10.0.1.130 : 56(84) bytes of data.
64 bytes from 10.0.1.130: icmp_seq=0 ttl=255 time=116 usec
64 bytes from 10.0.1.130: icmp_seq=1 ttl=255 time=45 usec
64 bytes from 10.0.1.130: icmp_seq=2 ttl=255 time=42 usec
64 bytes from 10.0.1.130: icmp_seq=3 ttl=255 time=42 usec --- 10.0.1.130 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/mdev = 0.042/0.061/0.116/0.032 ms 在 Linux 使用 ping 命令﹐如果您不使用 -c N 參數來指定送出多少個封包的話﹐ping 命令會一直延續下去﹐直到您按 Ctrl C 為止。從上面的命令結果我們可以確定連線是否成功之外﹐還可以根據它的 time 來判斷當前的連線速度﹐數值越低速度越快﹔在命令結束的兩行﹐還有一個總結﹐如果發現您的 packet loss 很嚴重的話﹐那就要檢察您的線路品質﹐或是上游的服務品質了﹔最後一行是 round-trip (來回)時間的最小值﹑平均值﹑最大值﹐它們的時間單位都是微秒 (ms)。不過﹐那個 mdev 是什麼意思我也不知道~~ Tips﹕當我們能 ping 一台機器的時候﹐我們就可以確定連線是成功的﹐但如果不能 ping 的話﹐未必是連不上哦。嗯﹖怎麼說呢﹖且聽我道來﹕ 使用 ping 命令的時候﹐事實上是送出一個 echo-request 的 ICMP 封包﹐如果對方的機器能接收到這個請求﹐而且願意作出回應﹐則送回一個 echo-reply 的 ICMP 封包﹐當這個回應能順利抵達的時候﹐那就完成一個 ping 的動作。 很顯然﹐如果這個 echo-request 不能到達對方的機器﹐或是對方回應的 echo-reply 不能順利送回來﹐那 ping 就失敗。這情形在許多有防火牆的環境中都會碰到﹐如果防火牆隨便將 request 和 reply 攔下來就會導致 ping 失敗﹐但並不代表其它連線不能建立。另外﹐就算沒有防火牆作怪﹐對方也可以將機器設定為不回應任何 echo-request 封包﹐只要用下面命令就可以了﹕ echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all 如果您不想別人 ping 您的機器﹐也可以如法泡制。但真的當您需要用 ping 命令來測試網路連線的時候﹐就做不到了﹐有利有弊啦。 traceroute 除了用 ping 命令來檢查連線之外﹐還有另外一個非常厲害的工具我們可以使用的﹐就是 traceroute 命令了(在 windows 上面則為 tracert 命令)﹕ traceroute www.yahoo.com
traceroute: Warning: www.yahoo.com has multiple addresses; using 216.115.102.78
traceroute to www.yahoo.akadns.net (216.115.102.78), 30 hops max, 38 byte packets
1 swtn184-1.adsl.seed.net.tw (211.74.184.1) 61.209 ms 63.117 ms 59.422 ms
2 139.175.169.1 (139.175.169.1) 60.172 ms 64.253 ms 60.136 ms
3 R58-38.seed.net.tw (139.175.58.38) 61.669 ms 59.185 ms 60.218 ms
4 R58-201.seed.net.tw (139.175.58.201) 68.353 ms 70.353 ms 71.605 ms
5 R57-99.seed.net.tw (139.175.57.99) 71.593 ms 70.570 ms 71.657 ms
6 R58-166.seed.net.tw (139.175.58.166) 367.829 ms 350.511 ms 355.516 ms
7 64.124.33.168.available.above.net (64.124.33.168) 218.493 ms 218.259 ms 219.996 ms
8 * * *
9 ge-2-3-0.msr1.pao.yahoo.com (216.115.101.34) 370.618 ms ge-3-3-0.msr2.pao.yahoo.com (216.115.101.38) 337.389 ms 349.591 ms
10 vl21.bas2.snv.yahoo.com (216.115.100.229) 218.355 ms 217.388 ms vl20.bas1.snv.yahoo.com (216.115.100.225) 221.096 ms
11 w6.snv.yahoo.com (216.115.102.78) 370.140 ms 339.934 ms 340.845 ms 透過 traceroute 命令﹐我們可以找出通往目的地的所有經過的路由節點﹐並以數字將路由順序標識出來。假如您加上 -n 參數的話﹐節點名稱則會以 IP 位址顯示﹐因為不需要進行名稱解析﹐回應速度當然會快一些。 從上面的 traceroute 結果﹐我們可以看到每一個節點都返回 3 個 round-trip 時間作參考。這樣﹐您就能夠判斷整個連線路由中﹐交通瓶頸所在的位置在哪裡。 您或許奇怪 traceroute 是如何揪出所有路由節點的呢﹖且聽我細說﹕ 您是否有留意到 ping 命令的結果有一個 TTL 值﹖通常來說﹐Time To Live 都是以時間為單位的﹐但是在路由上面卻是以跳站數目為單位的。為了防止一個封包無限期呆在網路上路由﹐每一個封包都會被賦予一個 TTL 值﹐告訴它最多能經過多少個跳站。當封包被一個路由節點處理之後﹐它原來的 TTL 值就會被扣掉 1 ﹐這樣﹐如果封包的 TTL 降到 0 的時候﹐路由器就會丟棄這個封包﹐並且同時向來源地送出一個 time_exceeded 的 ICMP 封包﹐以告知其封包的命運。 找到靈感了嗎﹖聰明的 traceroute 程式設計者正是利用了 ICMP 這個特殊功能﹐來找出每一個路由節點的﹕ 首先﹐traceroute 命令會向目標位址送出 UDP 偵測封包(echo, port 7)﹐但將第一個送出的封包之 TTL 設為 1 ﹐然後送節點的時候將 TTL 減為 1 使之變為 0 ﹐(註﹕ 還是 TTL 一開始就是 0 ﹐在送出的時候不進行減除? 這點我不確定)。這樣﹐第一個路由節點在處理這個封包的時候﹐發現 TTL 為 0 ﹐預設就不處理這個封包﹐並同時送回一個 ICMP 封包﹐這樣﹐發送端就知道第一個路由節點在哪裡了。
當接得到第一個 ICMP 返回的時候﹐程式會檢查返回主機是否就是目標主機﹐如果不是﹐則再送出第二個封包﹐但 TTL 比上次增加 1 。
這樣﹐第一路由節點接到的封包之 TTL 就不是 0 ﹐那麼處理完畢後送給下一個節點﹐同時將 TTL 扣除 1 ﹐這樣也就變為 0 了。當下一個站收到這個 TTL 為 0 的封包﹐也會送回 ICMP 封包﹐這樣﹐程式就知道第二個路由節點在哪裡了。
然後重上一個動作﹐直到找到目標主機為止﹐或是封包的最大 TTL (通常為 30) 都用光為止﹐但您可以用 -m 參數來指定最大的 TTL 值。 怎樣﹖聰明吧﹗ 但是﹐在實作中﹐未必是所有路由設備都會﹑或願意送回 ICMP 封包的。碰到這樣的情況﹐您就會看到第 8 個跳站的情形了。假如 traceroute 最後的結果一直維持著 * 符號﹐那可能是因為 ICMP 被對方的防火牆攔下來的結果。這樣的話﹐您可能無法完成防火牆後的路由追蹤了。 Tips﹕從上面的例子來觀察﹐由第 6 個跳站開始明顯降慢下來﹐而根據名稱看來﹐應該就是 ISP 連出 backbond 的節點。 假如您發現從內部網路到自己的 router 之間的連線都很快﹐過了 router 之後就很慢﹐如果不少是專線的線路出現了問題﹐那很可能到了要升級專線的時候了﹐或是這時候剛好碰到有人大量使用頻寬﹔假如速度過了 router 連到對方的機房還很快﹐然後就開始降下來﹐那您要好好審查一下當初和 ISP 簽訂的合約上﹐關於頻寬的保證問題是如何說的﹔但如果您發現連線到國外的網站﹐而速度是從進入對方國家之後才降下來的﹐那就沒什麼辦法好想了。 mtr 這又是什麼命令﹖用一用就知道了﹕ mtr www.yahoo.com
Matt's traceroute [v0.42]
rh71.siyongc.domain Thu Oct 18 01:38:39 2001
Keys: D - Display mode R - Restart statistics Q - Quit
Packets Pings
Hostname %Loss Rcv Snt Last Best Avg Worst
1. 211.74.184.1 0% 3 3 70 67 70 73
2. 139.175.169.1 0% 3 3 66 66 66 67
3. 139.175.58.29 0% 3 3 75 73 74 75
4. 139.175.57.99 0% 3 3 72 72 74 75
5. 139.175.58.166 0% 3 3 221 217 220 222
6. 64.124.33.168 0% 2 3 224 221 223 224
7. ???
8. 216.115.101.38 0% 2 2 231 225 228 231
9. 216.115.100.225 0% 2 2 229 221 225 229
10. 216.115.105.2 0% 2 2 229 222 226 229 事實上﹐您必須動手實作一下才知道這個命令的厲害之處﹕它將 ping 和 traceroute 兩個命令結合在一起使用﹗除了告訴您每一個路由節點的位址之外(我這裡用 -n 參數顯示為 IP 位址)﹐同時還不斷的將當前的最新 round-trip 時間動態的顯示出來。不過﹐您可以在任何時候按 Ctrl C才能終止這個程式。 非常棒的工具﹐值得一試﹗ netstat 呵﹐這也是一個功能強大的工具﹐不過﹐它主要是用來檢查主機的網路狀態﹐而非用來檢查連線速度用的。先讓我們認識一下這個命令的一些參數吧﹕ 參數 代表意思
-a 顯示所有 socket ﹐不管是否處於 listening 狀態。
-t 僅顯示 TCP 協定相關的項目。
-u 僅顯示 UDP 協定相關的項目。
-w 僅顯示 RAW 協定相關的項目。
-x 僅顯示 UNIX 協定相關的項目。
-r 顯示系統的路由表格。
-p 顯示與 socket 相關的程式名稱及 PID 。
-n 不進行名稱解析﹐直接以 IP 位址顯示。 PID 。 心動不如行動﹐不如馬上動手實作一下吧﹕ netstat -tna
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0
------ **********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好
Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
|