第一章﹕網路設定


經過這麼長的路程﹐當您辛苦完成了 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 可供使用﹐分別擔當這三個網路的連接任務﹐同時在物理上將各網路分開。

根據網路環境和需求﹐如下是我初步規劃的網路架構圖例﹕

設定網路卡

既然要設定網路﹐首先要搞定的﹐當然是網路卡啦。

在 Linux System 系列中的第六章“編譯核心”中﹐介紹 Module 的時候﹐已經有一個網路卡的設定例子了﹐您或許已經從中學到了網路卡的設定過程。如果您使用的是最普通的網路卡﹐如 Realtek 或 Winbond 或 NE2000 兼容卡等﹐那麼您在安裝 Linux 的時候就很可能已經設定好了。不過﹐有時候或許您要換卡或新增網卡﹐還是免不了要自己動手的。

下面的例子是教您如何使用 module 的形式安裝多片網路卡在同一機器上。先假設我已經有一片 rtl8139c 的 PCI 網路卡﹐並且在安裝過程中已經順利抓到並且設定好了。現在﹐我需要加一張 rtl8029 pci 和一張 rtl8019 isa 網路卡(這些型號您可以從網路卡的晶片組上看得到)﹕

  1. 首先﹐您必須知道他們相關的 Linux 模組名稱是什麼﹖我暫時沒有做功課﹐先用通用驅動程式來試試﹐所以我選擇 ne2k-pci 和 ne 這兩個模組。您必須確定在 /lib/modules/`uname -r`/kernel/drivers/net/ 目錄下有這些模組存在﹐否則就編譯核心﹐將如下兩個項目編為模組﹕

    <M>     NE2000/NE1000 support (NEW) 
    <M>     PCI NE2000 and clones support (see help)   

  2. 然後﹐如果您使用的網路卡有 ISA 類型的話﹐要找出它的 irq 和 io。如網路卡沒有 jumper 設定的話﹐廠家通常會提供一片磁碟供您設定資源數值的(假設我們這裡將 ISA 網卡的 irq=3﹐io=300)。

    然後進入 BIOS ﹐確定它們沒有和其他設備衝突(例如這裡要關閉 COM2 的設定)﹐再轉到 PnP/PCI 的設定上﹐將 ISA 網路卡所使用的 IRQ 保留起來﹐也就是設定為 Legacy ISA (註﹕PCI 類型的網路卡無需如此設定)。

  3. 然後修改 /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 啦﹐所以無需擔心這個。然而﹐您就很難控制哪一張卡是第一、哪一張卡是第二﹐碰到這樣的情況﹐可能需要將網路線換過來插了﹐總要試試才知道啦。

  4. 完成設定之後﹐執行如下命令﹕

    modprobe ne2k-pci
    modprobe ne

    如果有錯誤的話﹐根據信息內容進行修改。(也可以改用 insmod 命令)

  5. 假如上一個動作能順利完成﹐然後執行如下命令﹕

    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 網路卡﹐萬一您的型號不在核心支援之列﹐說實在您要成功設定起來的機會很低。不過﹐您仍可將希望寄託在最新的 pcmcia-cs 套件上面。pcmcia-cs 其實就是核心要處理 pcmcia 裝置的程式﹐您可以到如下網頁下載最新的版本回來﹕

http://sourceforge.net/project/showfiles.php?group_id=2405

在進行設定之前﹐我建議您先閱讀一下 PCMCIA 的 HOWTO 文件(中文版在 這裡 )。

當您將套件解壓之後﹐您要輸入的命令大概就是﹕

make config
make all
make install

基本上﹐使用預設值就可以了﹐除非您確定要修改哪些﹐例如 CardBus 功能之類的。

然而﹐不幸的是﹐我到上面網站下載 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 來復原。這情形也發生在我安裝 Mandrake 8.1 的時候﹐後來我也懶得修改﹐只將 mdk8.1 的 kernel-pcmcia-cs 移除掉﹐然後裝回 mdk8.0 的套件就搞定了。

我所碰到的問題主要是 modules 的問題。如果 kernel 裡面 General 的 pcmcia 選項有選擇為 Y 或 M 的話﹐則不會在 /lib/moduels/<version>/kernal/pcmcia 目錄下面產生 modules 。將 kernel 選項選擇為 N ﹐的確可以產生 moduels﹐但卻會碰到 unresolvable symbols 的頭痛問題。而且﹐就算沒有 symbols 問題﹐同時也可以載入 pcmaic-core 模組﹐還是不能成功抓到網路卡﹐不是告訴您沒有 high memory 就是根本沒反應。

如果您的 PCMCIA 也啟動不了﹐可以試試修改 /etc/sysconfig/pcmcia 這個檔案﹐確定 pcmcia 有打開 (設定為 yes)﹐同時也可以指定 PCIC 類型 (i82365 或 CardBus )。修改後的檔案或許會是這樣﹕

PCMCIA=yes
PCIC=i82365
PCIC_OPTS=poll_interval=100
CORE_OPTS=
CARDMGR_OPTS=-f

嗯﹐因為我在系統方面不是很在行﹐也不想花太多時間在這上面了﹐暫時留作日後的功課吧。假如讀者能夠解決這個問題﹐我非常希望您能將步驟 寄來給我。謝謝﹗

設定主機

當您將網路卡設定好之後﹐接下來是將 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.31 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.31 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.31  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﹐事實上會造成額外的封包流量。具體原理我這裡不詳細說了﹐有興趣請參考如下文章﹕“TCP/IP 的迷思﹖ ”。

如果我們要關閉一個 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 上可以使用 routedgated 服務﹐但這需要相鄰的路由設備都要使用相同的路由協定﹐例如 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 的設定(關於 rp-pppoe 的安裝和設定可以參考“架設 PPP”文章)﹕如果您的系統原本就設定有 default gw 的話﹐rp-pppoe 在完成撥接後將不會修改這個設定﹐這樣會造成您連不上 internet (因為 default gw 不正確的緣故)。要解決這個問題﹐您有好幾個方法(只要其一即可)﹕

  • 修改 /etc/sysconfig/network 將其中的 GATEWAY 和 GATEWAYDEV 句子拿掉。

  • 或是﹐執行如下命令﹕

    route add default dev ppp0

  • 或是﹐在 /etc/ppp 目錄下面修改一個 ip-up.local 檔(如果沒有請自行建立﹐並加上 x 執行權限)﹐增加如下內容﹕

    #!/bin/bash
    /sbin/route add default dev ppp0
    

(注意﹕上面的 ppp0 是您的 ADSL 撥接界面﹐假如您不是用 ppp0 的話﹐那請修改為正確的設備名稱。)

如果您採用最後兩種方法﹐那在結束 ADSL 撥接之後﹐再檢查 route table ﹐確定剛纔的設定被取消(也就是還原為原來的 default gw 設定)﹐否則用手工的方法移除(相信您會移除吧﹖不會就要打屁屁了~~)。

下面不如讓我們在真實的環境中模擬一下路由的設定吧。

就用我家裡的網路環境就好了﹕我在家中分有兩個 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 之內。我曾經在新聞組上和網友們討論這個問題了﹐假如您有興趣﹐可以參考如下網頁﹕

談談 IP Routing

如果在閱讀上述文章的時候﹐您還搞不懂如何劃分 subnet﹐那我建議您再讀讀這篇文章﹕

談談 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 這個特殊功能﹐來找出每一個路由節點的﹕

  1. 首先﹐traceroute 命令會向目標位址送出 UDP 偵測封包(在 Linux 中,可用 -I 改為 ICMP 封包)﹐但將第一個送出的封包之 TTL 設為 1 。這樣﹐第一個路由節點在處理這個封包的時候﹐減掉 1 ,並發現 TTL 為 0 ﹐於是就不處理這個封包﹐並同時送回一個 ICMP 封包。這樣﹐發送端就知道第一個路由節點在哪裡了。
  2. 當接得到第一個 ICMP 返回的時候﹐程式會檢查返回主機是否就是目標主機﹐如果不是﹐則再送出第二個封包﹐但 TTL 比上次增加 1 。
  3. 這樣﹐第一路由節點接到的封包之 TTL 就不是 0 ﹐那麼處理完畢後送給下一個節點﹐同時將 TTL 扣除 1 。這樣,當下一個站收到這個封包,再扣掉 TTL 為 0 ﹐也會送回 ICMP 封包﹐這樣﹐程式就知道第二個路由節點在哪裡了。
  4. 然後重覆上一個動作﹐直到找到目標主機為止﹐或是封包的最大 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 協定相關的項目。
-l 僅顯示處於 listen 狀態的項目。
-w 僅顯示 RAW 協定相關的項目。
-x 僅顯示 UNIX 協定相關的項目。
-r 顯示系統的路由表格。
-p 顯示與 socket 相關的程式名稱及 PID 。
-n 不進行名稱解析﹐直接以 IP 位址顯示。

心動不如行動﹐不如馬上動手實作一下吧﹕

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      0 0.0.0.0:6000            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:113             0.0.0.0:*               LISTEN
tcp        0      0 211.74.184.205:53       0.0.0.0:*               LISTEN
tcp        0      0 10.0.1.131:53           0.0.0.0:*               LISTEN
tcp        0      0 10.0.1.1:53             0.0.0.0:*               LISTEN
tcp        0      0 192.168.100.23:53       0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
tcp        0      0 192.168.100.23:22       192.168.100.20:2610     ESTABLISHED
tcp        0      0 192.168.100.23:139      192.168.100.20:2735     ESTABLISHED

上面的命令是將系統所打開的所有 TCP socket 都顯示出來﹐其中很重要的一個資訊是 Send-Q ﹐假如這個數值大於 0 並且有增加的趨勢﹐那就證明您的網路流量非常繁忙﹐要不是發生問題的話﹐那就是到了升級的時候了。如果您還想知道每一個 socket 是哪一個程式打開的﹐再加上一個 p 參數就可以了。

Tip﹕要看系統的 socket 是有哪些程式關聯的話﹐您還可以用 socklist 命令來顯示。非常方便﹐不過在以前的 RedHat 版本是是沒有的。

除此之外﹐用 lsof 也可以顯示哪些協定和程式所開啟的檔案﹐不過這個命令的參數很多﹐輸入 -h 或用 man 看看吧。

關於 netstat 命令﹐您還可以用 -i 參數來顯示界面狀態﹕

netstat -i
Kernel Interface table
Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500   0    10320      0      0      0     9490      0      0      0 BRU
eth1   1500   0    23623      0      0      0   353805      0      0      0 BRU
eth2   1500   0        0      0      0      0      477      0      0      0 BRU
lo    16436   0      585      0      0      0      585      0      0      0 LRU
ppp0   1492   0     1022   1538      0      0      954      0      0      0 OPRU

最前面三項分別是﹕界面、最大傳送單位、路由成本(metric)。其後各欄位中的 RX 和 TX 分別代表接收和發送﹐其中 OK 是良好封包﹐ERR 是有問題的封包﹐DRP 是被丟棄的封包﹐OVR 則是逾時狀態的封包。最後的 Flag 分別有如下這些旗標﹕

  • B﹕接收廣播封包﹔
  • L﹕Loopback 界面﹔
  • M﹕接收所有數據封包﹔
  • N﹕不處理封包尾部﹔
  • O﹕關閉 ARP 功能﹔
  • P﹕Point-to-Point 連線﹔
  • R﹕正常運作﹔
  • U﹕啟動狀態。

另外﹐您還可以用 -s 參數來顯示所有協定的傳輸統計資訊﹐這裡不列範例了﹐自己玩玩看吧。假如您是用 ipchains 做“封包偽裝”的話﹐用 -M 參數還可以看出當前哪些機器被偽裝過。

tcpdump

非常便利的封包擷取工具﹐不過它只能對 header 進行分析。假如您對 TCP/IP 的封包欄位熟悉的話﹐它可以幫我們徹底檢查一個連線。下面是它的命令選項﹕
  • port N ﹕指定 port 號碼
  • -c N ﹕設定要抓多少個封包﹐否則用 crtl+c 結束
  • -i ﹕指定哪個 interface
  • -n ﹕使用 IP﹐不進行名稱解釋
  • tcp | udp ﹕指定 protocol
  • host xxx and yyy ﹕指定與 hosts 相關的封包
  • host not xxx yyy ﹕指定與 hosts 不相關的封包

至於更詳細的說明﹐請 man tcpdump。假如您真要看封包的內容﹐改用 sniffer 或 sniffit 之類的程式。

網站

除了上面介紹的工具外﹐有些網站也能幫忙測試您的連線速度﹐例如下面這個﹕

http://www.dslreports.com/tweaks

不過﹐這些網站大都在國外﹐其測試數據是否真實反映了您的連線速度﹐當中的干擾因素蠻多的。您或許分不同的時段進行測試﹐再比較看看﹐這樣比較有概念。

設定檔

前面所介紹的設定命令﹐可以在任何時候使用﹐然而在重新開機之後就會消失。您願意的話﹐可以在 /etc/rc.d/rc.local 這個檔案裡面將命令逐行寫上﹐這樣開機後就有您的網路環境了。然而﹐在 RedHat 系統上﹐事實早已提供了非常完整的設定檔供您修改﹐下面我們介紹如何讓機器在啟動之後就設定好您的網路環境。

關鍵點是找到設定檔案和 scripts 放在哪裡﹐以及各檔案的作用罷了。在不同的 distrobution 裡面﹐各檔的路徑和名稱或有不同﹐例如﹐有些套件﹐會將所有的網路設定寫在 /etc/rc.d/rc.inet1 和 /etc/rc.d/rc.inet2 這兩個檔案裡面。而 RedHat 7.1 的設定多集中在 /etc/sysconfig 目錄中。

/etc/modules.conf

如果您的網路卡以模組形式載入核心的話﹐那您就必須確定有相關的 alias 設定在這裡。請參考前面的介紹﹐這裡不再重複。

不過﹐在以往的版本中﹐這個檔案名稱或許會是 conf.modules ﹐修改時請留意。如果您不確定您的版本用哪個﹐就用 links 來解決吧(別說不會﹐否則要回去 system 那邊補習)。

/etc/sysconfig/network

這個檔包含了系統的主要網路設定﹐參考內容如下﹕

NETWORKING=yes			# 一定要開﹐否則會沒有網路功能。
FORWARD_IPV4="yes"			# 如果用來做 router﹐那就設定。
HOSTNAME=rh71.siyongc.domain	# 這是主機的名稱﹐還記得 hostname 的設定嗎﹖
# DOMAINNAME=kenny			# 這是 nis domainname ﹐沒用 NIS 可以不設。
# GATEWAY="192.168.100.26"		# 這是預設 gateway 的位址
# GATEWAYDEV="eth0"		# 連接 gateway 的界面

註﹕如果您用 ppp (含 pppoe) 撥接上網﹐請將最後兩行註解起來﹐否則參考前述手工命令設定 route 命令。

Tips﹕我發現在 RH7.1 裡面﹐在 /etc/sysconfig/network 檔中的 FORWARD_IPV4 是否沒有作用﹐而是透過 /etc/sysctl.conf 來設定的﹕

.net.ipv4.ip_forward=1

不過﹐其他系統(如 mandrake ) 就沒這個困繞﹐您總要測試過才知道。當然了﹐最保險的辦法就是用 "echo 1 > /proc/sys/net/ipv4/ip_forward" 這個命令來設定了﹐您可以寫在 /etc/rc.d/rc.local 裡面讓它開機時就打開路由功能。

/etc/sysconfig/network-scripts/

在這個目錄下面﹐保存了所有網路界面相關的設定﹐所有以 ifcfg- 開頭的檔案都是。例如﹐ifcfg-eth0 就是第一張網路卡的設定內容﹕

DEVICE=eth0		# 指定網路設備名稱。
BOOTPROTO=static		# 界面啟動使用的協定﹐可以是 dhcp 。
IPADDR=192.168.100.23	# IP 位址。
NETMASK=255.255.255.0	# netmask 設定值。
NETWORK=192.168.100.0	# 網路位址。
BROADCAST=192.168.100.255	# 廣播位址。
ONBOOT=yes		# 是否在開機的時候啟動﹐請設定為 yes 。

您要留意的是其中的 BOOTPROTO 設定﹐如果這個界面是透過別 DHCP 伺服器取得 IP 的話﹐請設定為 dhcp﹐然則﹐其後的 IPADDR、NETMASK、NETWORK、BROADCAST 都無需設定﹐可以將這些句子刪除﹐也可以將 = 號右邊的部份刪除。

至於 eh1 和 eth2 的設定分別使用 ifcfg-eth1 和 ifcfg-eth2 檔來命名。如果要手工建立的話﹐用 cp 複製 ifcfg-eth0 的內容過來修改就好。比方說﹐執行 "cp ifcfg-eth0 ifcfg-eth0:0" ﹐然後修改第二個檔案就可以進行 IP Aliase 的設定了。但要注意﹕系統並非以檔案名稱來決定網卡的設備名稱﹐而是以檔案中的 DEVICE 為準﹐所以﹐請檢查所有檔中的 DEVICE 名稱沒有衝突。

Tips﹕有時候﹐您或許要將第一張和第二張網路卡的設定互換﹐可以使用如下命令達成﹕

sed s/eth0/eth1/ ifcfg-eth0 > ifcfg-tmp
sed s/eth1/eth0/ ifcfg-eth1 > ifcfg-eth0
cat ifcfg-tmp > ifcfg-eth1
rm -y ifcfg-tmp

注意哦﹕在這個目錄中﹐請留意所有以 ifcfg- 開頭的檔案﹐假如裡面的設備存在的話﹐當您重新啟動 network script 的時候(隨後介紹)﹐會嘗試啟動所有 ifcfg-* 檔的設定。所以﹐如果不刪除上面例中的最後一行﹐假如兩個檔中的 DEVICE 名稱一樣的話﹐則會以排在後面的檔案為準。

ifup & ifdown

同在 /etc/sysconfig/network-scripts 目錄內﹐還分別有這兩個檔案。不過﹐它們不是設定檔﹐而是非常好用的 script﹐透過它們﹐您可以隨時關閉和啟動一張網路卡﹕

ifdown eth2
ifup eth2

有興趣﹐不妨追蹤一下這兩隻 script﹐您會學到許多 shell script 和系統設定技巧﹗

/etc/sysconfig/static-routes

還記得前面的路由實作例子嗎﹖當您需要保存特定路由(非 default gw) 設定的時候﹐就是修改這個檔了。不過﹐預設上這個檔是不存在的﹐有需要的話您得自己行建立並編輯。其格式內容如下﹕

eth1 net 10.0.2.0 netmask 255.255.255.0 gw 10.0.1.3
any net 10.0.3.0 netmask 255.255.255.0  eth1

第一行是當您有一筆 10.0.2.0 的路由是從 eth1 經 10.0.1.3 出去﹐對方的子網和當前的子網所在的物理連線是分開的﹔

而第二行則有些不同﹐主要是 10.0.3.0 這個不同的子網也和 eth1 在同一個物理連線上面。(注意﹕如果您的界面是一個 IP Alias 的話﹐要吧能把“:”以及後面的數字寫刪除掉﹐因為從路由設備的角度來看﹐使用的還是同一個界面。別忘了哦﹗)

/etc/rc.d/init.d/network

您猜對了﹗和其它服務一樣﹐這就是整個網路功能的 deamon 控制檔。透過它﹐您可以隨時關閉和啟用網路服務﹕

service network stop
service network start

當然﹐除了 start 和 stop 之外﹐您還可以用 restart 或 reload 來重新讀取網路設定。當您進行遠端維護的時候﹐例如 ssh 上來修改網路設定﹐用 restart 就非常方便了。為什麼﹖如果您先執行 stop 的話(或是 ifdown)﹐會關閉掉網路服務﹐這樣連當前的 ssh 連線也斷掉﹐而且您沒有任何辦法再 ssh 回去﹗小心哦~~~

其它

基本上﹐與網路相關的設定有如下這些(非全部)﹕

網路設定相關﹕
/etc/hosts
/etc/HOSTNAME
/etc/host.conf
/etc/nsswitch.conf
/etc/resolv.conf
/etc/sysconfig/network
/etc/sysconfig/static-routes

網路界面設定相關﹕
/etc/sysconfig/pcmcia
/etc/modules.conf
/etc/sysconfig/network-scripts/*

系統服務相關﹕
/etc/services
/etc/protocols
/etc/xinetd.d/*
/etc/rc.d/init.d/*

等等 ......

設定工具

別以為在 Linux 都只能用命令和設定檔啦﹐其實﹐我們還有大量的 Linux 工具可搞定網路設定呢﹕不過﹐我這裡強烈建議您先熟識命令和設定檔的方式﹐也就是先鍛煉一下就是了﹐然後﹐等您換成工具之後﹐我保證您不會有困難。然而﹐如果您只會用工具﹐要換成命令和設定檔﹐那還是要重新學習一遍。

所以﹐我這裡不打算詳細介紹每一個工具的操作細節﹐只是簡單介紹一些我們在網路設定上常用到的工具﹐以及它的功能而已。

netconfig

如果在安裝 Linux 的時候﹐是選擇 text 模式的話﹐應該碰到過這個畫面﹕

不過﹐這個工具比較簡單﹐主要用來設定界面的。如要功能多一些的﹐就看接下來的工具了。

netconf

基本上﹐關於網路相關的設定﹐都可以用這個工具來搞定﹕

如有時間﹐可以瀏覽一下其中的各個項目﹐看看裡面有哪些設定﹖目前來說﹐某些項目我們還沒接觸過﹐例如 NIS 和 NFS 等﹐您暫時不用理會。下面﹐我挑其中一些常用到的項目說明一下﹕

首先﹐我們可以用‘Host name and IP network devices’來搞定基本的網路設定。事實上﹐這個工具就是幫您設定 /etc/sysconfig/network 和 /etc/sysconfig/network-scripts/ifcfg-eth* ﹐以及 /etc/modules.conf 這些檔案的啦﹕

接下來﹐我們可以用 ‘Name server specification (DNS)’來設定 DNS client ﹐也就是 /etc/resolv.conf 這個檔案的內容﹕

關於路由方面的設定﹐則可使用‘ Routing and gateways’。如果您不知道如何修改 /etc/sysconfig/network 和 /etc/sysconfig/static-routes 中的路由﹐那就用這個工具吧﹕

還記得前面提到的 /etc/host.conf 檔案嗎﹖就是這個‘Host name search path’工具要設定的了﹕

接下來的幾項﹐因為還沒用到﹐這裡略過﹐直接跳到‘Information about other hosts ’工具看看吧。事實上﹐換了是我的話﹐會直接修改 /etc/hosts 檔啦﹕

當您完成各項設定之後﹐跳到 ‘Quit’離開即可。不過﹐在剛開始跑這個工具的時候﹐都常會碰到類似下面這樣的錯誤信息﹕

我也不大清楚問題產生的原因是什麼﹖不過﹐我都用 touch 命令來解決﹐也就是將提示所列的檔案更新一下時間就可以了。

到最後﹐在您真正退出 netconf 工具之前﹐它會把將要執行的動作整理出來﹐並問您是否要執行。如果您認為可以﹐那就選擇‘Do it’﹐否則選擇‘Do nothing’或其它﹕

如果您是在 X window 裡面執行 netconf 命令的話﹐您使用的將是圖形界面﹐非常酷哦﹗

linuxconf

哦﹐這個工具來頭可大了﹐幾乎在 Linux 上的所有設定都能搞定﹗不信自己玩玩看﹐我這裡就不介紹了。不是我不想說﹐而是我真的很少用它。﹕

而且﹐它也有 X 版本哦﹕

這個工具被認為是 Linux 未來的最完整的設定工具﹐開發者們的目標就是提供一個統一的設定界面﹐讓 Linux 管理員簡化煩瑣的設定事項。前面介紹的 netconf 命令﹐事實上也是包含在 linuxconf 工具中的﹐如果您的系統還沒安裝 linuxconf﹐那就找 RH7.1 的第二片光碟來安裝吧。

不過﹐在使用工具之前﹐我強烈建議您先備份好自己的設定檔﹐然後完成設定之後一定要反復測試﹐以確定設定能符合自己的要求。並且﹐您最好能具備手工設定的能力﹐必須能用自己的眼睛來判斷工具設定出來的設定檔是合格﹐而不流於自作主張或畫蛇添足。

手工設定 vs 工具

雖然您可以使用前面介紹的工具來設定您的網路﹐但歸根結底﹐這些設定都是以檔案形式儲存在檔案系統上面。假如您懂得如何修改那些設定檔的話﹐可以直接對檔案進行修改。有時候這還是必須的﹐因為設定工具不一定能夠做到您所設計的。

若不想花時間去驗證這些工具﹐那最穩妥且最保險的辦法﹐就是手工設定了。我相信很多有經驗的管理員﹐都不敢完全信賴設定工具﹐除非真的在實作上證明是可行而且安心的。因為過往的經驗不難發現﹕為了貪圖幾秒的便利﹐卻要花上幾小時的 debug 來找出工具誤設之處。然而﹐現在的工具漸趨完善﹐且功能強大﹐能適用的環境也越多﹐真能用工具解決的話﹐就儘量用吧﹐只要自己不當白老鼠就好。

Tips﹕如果您真的對設定檔不熟悉﹐而又不知道如何修改的話﹐您可以先將檔案備份起來﹐然後使用工具去修改﹐在將設定內容前後對比﹐觀察檔案中改變的部份﹐多練習數遍就知道怎麼修改了。

好了﹐Linux 的網路設定﹐是所有服務的基礎。當您已經了解如何打造自己的網路環境之後﹐那接下來的﹐就是如何用 Linux 來架設一些有用的伺服器和解決方案。不用急﹐慢慢來﹐按照後面所介紹的文章﹐您一定能做得到﹗

 

 


www.study-area.org © 2001 Netman 網中人
Last Updated: May 13, 2002