伺服器架設篇 - RedHat 9

第四章、連上 Internet

網路卡的安裝,與連接上 Internet 的方法介紹

最近更新時間: 2003/09/19

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
呼呼!終於要來到修改 Linux 網路參數的章節了!在前面的 網路基礎 章節內我們知道了主機要連上 Internet 需要一些正確的網路參數設定,這些設定在 Windows 系統上面的修改則在 區域網路的架構 裡面進行了說明。在這一章當中,我們則主要以固定 IP 的設定方式來修改 Linux 的網路參數,同時,也會介紹如何使用 ADSL 的撥接方式來上網,此外,因為 Cable modem 使用者也不在少數,所以我們也說明一下 Cable modem 在 Linux 下的設定方式喔!

Linux 網路相關設定檔案

    要開始玩 Linux 網路之前,請新手務必瞭解 Linux 網路相關設定檔案放置的目錄與檔名!這真的很重要!因為在 Linux 底下修改 IP 只要動到一個檔案即可,修改主機名稱也只要一個檔案,所以只要將這些檔案名稱記起來,呵呵!未來在進行網路的測試與修訂時,真的會事半功倍~完全不需要什麼 linuxconf, webmin 等工具的幫助,真的很簡單啦!底下趕緊來說一說與 Linux 網路最相關的幾個檔案檔名與他的用途!
     
    • /etc/sysconfig/network:

    • 這個檔案主要的功能在於『主機名稱( HOSTNAME )的修改,啟動 Network 與否』!在某些版本的 Linux 上面,只要修改過這個檔案,可能需要重新啟動 Linux ( reboot ) 才能讓設定生效。
       
    • /etc/sysconfig/network-scrips/ifcfg-ethn:

    • 這個檔案的內容即是設定網路卡的參數檔案啦!裡面可以設定『network, IP, netmask, broadcast, gateway, 開機時的 IP 取得方式( DHCP, static ), 是否在開機的時候啟動』等等。至於 ifcfg-ethn 那個 n 是數字啦!如果是第一塊網路卡,則檔案名稱為 ifcfg-eth0 ,第二塊網路卡為 ifcfg-eth1 以此類推。
       
    • /etc/modules.conf:

    • 如果硬體要能動作,當然要核心有支援才行!同時,我們也可以利用外掛的核心模組(可以將他想成是驅動程式)來驅動硬體,而開機時用來設定載入核心模組的檔案就是 modules.conf 啦。所以說,這個檔案只在核心找不到網路卡的晶片組時才會動用到!
       
    • /etc/resolv.conf:

    • 我們在 網路基礎 裡面稍微提到的 DNS 功能是什麼?對啦!進行主機名稱與 IP 的對應!而 resolv.conf 就是設定 DNS ( 名稱解析伺服器 ) 的檔案,常常有人提到『咦!我已經可以 ping 到外部電腦的公共 IP 了,為何輸入網址卻無法連線?』通常發生的錯誤就是這個檔案裡面的設定不正確啦!請注意!通常這個檔案可以輸入中華電信的 DNS ( 168.95.1.1 )!
       
    • /etc/hosts:

    • 這個檔案可以記錄電腦的 IP 對應主機的名稱或者主機的別名!特別留意的是,在區域網路內有些服務需要反查 Client 的身份,此時就會動用到主機名稱對應 IP 的資料。但是因為區域網路內使用私有保留 IP ,當然無法進行 Hostname 對應 IP 的行為,這個時候該服務就會呆呆的等待 30~60 秒~如果可以避過這個反查,或者是直接告訴主機 Hostname 與 IP 的對應,那麼就可以節省這個反查的時間了!所以,如此一來省去反查的時間,就可以改善 LAN 內的連線速度了!這個 hosts 就是用來設定 Hostname 對應 IP 的啦!更多的資訊請查閱後續伺服器章節 DNS 主機的介紹。
       
    與 Linux 的網路設定有關的大概就是這幾個檔案啦!只要知道這些檔案的放置地點,那麼差不多網路的設定就不會有太大的問題了!

安裝網路卡:

    網路卡是個硬體啊,所以要驅動他的話,核心就需要有支援該網路卡的晶片組才行。一般來說,目前新版的 Linux 預設可以支援的網路卡晶片組數量已經很完備了,包括大廠的 3COM, Intel 以及初階的 RealTek, D-Link 等網路卡晶片都已經被支援,所以使用者可以很輕易的設定好他們的網路卡。不過,如果萬一不幸核心沒有支援該網路卡的話,那麼您可以透過 (1)重新編譯核心或者是 (2)編譯網路卡驅動模組 ( Modules ),並且載入該模組,好讓核心可以支援網路卡這塊硬體啦!但是,重編核心或編譯網路卡核心模組都不是簡單的工作,所以萬一您的網路卡真的不被預設的 Linux 網路晶片所支援,那麼鳥哥真的建議直接換一塊被 Linux 支援的網路卡吧,例如很便宜的螃蟹卡!免得花了太多時間在硬體確認上面,划不來的! ^_^ 如果您是照鳥哥推薦的,使用 RLT 8139 晶片 ( RealTek 8139 ) 的網路卡 ( 就是螃蟹卡 ) ,那您應該在安裝 Linux 的時候就已經捉到網路卡了,那真是恭喜您啦!因為您的網路卡應該已經可以正常的工作囉!那如果在安裝的時候並沒有捉到網路卡呢?該如何是好?那也不用擔心,因為您也可以事後才安裝網路卡的驅動程式呀!不過,因為 Linux 並不像 Windows 是那樣的隨插即用,所以需要動一些手術的!
     
    如果很不幸的,您使用的是比較罕見的一些網路卡,或者是 Linux 核心支援度不太夠的網卡,以致於在安裝 Linux 時,並無法捉到這張卡,那也不用擔心,我們可以使用較為簡單的核心模組編譯來支援這張網卡。底下我們以 D-Link 530 這一張曾被稱為 Linux 惡魔卡的網路卡來進行模組的編譯,如果您使用的是其他廠牌的網路卡,其實編譯過程與底下的流程是類似的喔!
     

    手動安裝網路卡驅動程式
     
    如前面所說的,我們的 Linux 預設核心裡面,已經建立了很多的網路卡驅動程式模組了!所以囉!編譯網路卡模組之前的首要工作就是先確認一下您的網路卡的晶片組是否有被支援呢?如果有支援的話『那麼自然不需要編譯模組了咯』! D-Link 530 這塊網路卡的晶片組就是有名的 via-rhine ( 有的時候也寫成是 viarhine ),先來找一找有沒有這塊網卡的模組吧。核心預設的網路卡模組路徑在底下可以發現:
     
    1. 先察看一下核心版本,因為不同的版本模組放置的路徑不同。
    [root@test /root]# uname -r
    2.4.20-18.9
    上面是以 Red Hat 9 為範例, 他的核心是 2.4 版喔。
     
    2. 核心模組的路徑:
    [root@test /root]# cd /lib/modules/`uname -r`/kernel/drivers/net
    上面是 2.4 版的路徑
    [root@test /root]# cd /lib/modules/`uname -r`/net
    上面是 2.2 版的路徑,請依照您的實際核心來查詢。
     
    [root@test net]# ls -l via*
    -rw-r--r--    1 root     root        17892 Sep  7  2001 via-rhine.o
    太好了!被支援到呢!
     
    如果幸運的話,那麼您的網路卡就已經被支援,可以跳過編譯的過程,直接進行模組的載入吧!萬一您連自己的網路卡到底有沒有被 Linux 捉到都不知道,那麼可以使用底下的方法來測試:
     
    [root@test /root]# dmesg | grep eth
    divert: allocating divert_blk for eth0
    eth0: RealTek RTL8139 Fast Ethernet at 0xc4844000, 00:50:fc:20:f1:4c, IRQ 10
    eth0:  Identified 8139 chip type 'RTL-8139C'
    eth0: Setting 100mbps full-duplex based on auto-negotiated partner ability 45e1.
    divert: allocating divert_blk for eth1
    eth1: Digital DC21041 Tulip rev 33 at 0xc4852000, 21041 mode, 00:80:C8:5A:87:10, IRQ 9.
     
    看到上面的資訊了嗎?因為我有兩張網路卡,一張是螃蟹卡 ( eth0 ) 另一張則是很舊很舊的 10 Mbps 的網路卡,Linux 預設就捉到了!所以我也就不需要重新編譯核心模組!不過,萬一捉不到呢?亦即上面沒有顯示出 eth0 或者 eth1 等資訊,那就表示 Linux 無法找到該硬體,呵呵!底下就得來編譯囉!
     
    1. 下載網路卡驅動程式模組:

    2. 萬一不幸的,您的網路卡的驅動模組恰好不在 Linux 的預設支援當中,例如買到了雜牌的卡或是特別想要的卡 ( 例如 D-Link 530 TX ) ,那您就必須要注意這些卡的包裝上面是否有提及『支援 Linux 』字樣!如果有支援的話就可以買了,因為一定會有驅動程式附在上面的磁片中的,以鳥哥的 FNW-9702-T 為例,他就有附上一塊驅動程式片,裡頭有一個 linux 目錄,裡面就是安裝驅動程式的原始碼啦!如果找不到驅動程式的話,您可以到下面的網站去找找看有沒有您需要的驅動程式原始檔案,當然囉!最好還是到您買的那張網路卡的公司去下載完整的驅動程式碼!例如上面提到的 D-Link 530TX的驅動程式原始碼,在底下的友訊網站就有提供下載!  
    3. 確定所需套件存在:

    4. 在開始編譯核心模組之前,因為驅動程式需要配合核心來編譯,所以會使用到 kernel source 或者是 kernel header 的資料,此外,也需要編譯器 ( compiler ) 的幫助,因此,先確定您的 Linux 系統當中已經有底下的套件存在 ( 註:每一個版本的 Linux 套件名稱都不相同,我這裡是以 Red Hat 9 來做說明,如果您的 Linux 不是 Red Hat 9 ,不要緊,只要看到 kernel 字樣有出現,應該就沒有問題! )
      • kernel-source-2.4.20-18.9
      • kernel-2.4.20-18.9
      • gcc-3.2.2-5
      • make-3.79.1-17
      而由於很多的核心模組預設都是由 /usr/src/linux 這個 kernel source 的目錄來取得所需要的資訊,偏偏目前很多的 Linux 版本都是使用 /usr/src/linux-2.4 這個目錄來連結,所以很多時候您會發現找不到檔案的錯誤訊息,因此,可以使用這樣的方式來進行連結目錄的製作:
      假設核心的 Open source 目錄為 /usr/src/linux-2.4.20-18.9
      [root@test root]# cd /usr/src
      [root@test src]# ln -s linux-2.4.20-18.9 linux
      另外,如果沒有安裝上述的某些套件時,請拿出您的原版光碟,然後以 rpm 將他安裝上您的 linux 系統吧! ^_^
       
    5. 編譯下載的模組

    6. 上述的工作確認過後,並且由友訊網站下載了驅動程式後 ( 註:我下載的是完整的驅動程式片,也就是 DEF-530TX Shipping Driver 那個驅動程式,不過該檔案 530tx.zip 是給 windows 用的,所以還需要在 Windows 底下解壓縮後,才會得到 dlkfet-4.24.tar.gz 這個檔案吶! ) 就可以準備來進行模組的編譯了。
      1. 將剛剛取得的 dlkfet-4.24.tar.gz 放置到 /tmp 底下
      [root@test root]# cp dlkfet-4.24.tar.gz /tmp
      [root@test root]# cd /tmp
      [root@test tmp]# tar -zxvf dlkfet-4.24.tar.gz
      [root@test tmp]# cd dlkfet-4.24
       
      2. 開始編譯:
      [root@test dlkfet-4.24]# make
      到此為止,會產生一個檔案模組,稱為: rhinefet.o
      [root@test dlkfet-4.24]# cp rhinefet.o  \
      > /lib/modules/`uname -r`/kernel/drivers/net
      [root@test dlkfet-4.24]# depmod -a
      特別留意,上面的路徑為 2.4.xx 版本的核心!並且將該模組寫入屬性相依檔案。
      當然囉,如果您是使用其他的網路卡,那麼所得到的網路卡驅動程式自然就會成為 filename.o 啦!同樣將他移動到模組放置的目錄後,執行 depmod -a 即可。(註:如果您的模組原始碼檔名為 driver.c ,並且沒有 Makefile 的輔助,那麼使用『gcc -DMODULE -D__KERNEL__ -O6 -c driver.c』來編譯出 driver.o 也是可以的作法!)
       
    7. 模組測試:

    8. 核心模組編譯完成之後,當然就得需要測試看看能不能正常的運作了。測試的方法很簡單,因為我們已經進行了 depmod -a 了,所以可以直接以 modprobe 來進行模組的載入:
      1. 載入模組的測試:
      [root@test root]# modprobe rhinefet
      請注意,不要寫完整的檔名, .o 不需要寫,那個 rhinefet 就是
      剛剛編譯出來的 rhinefet.o 咯!
      [root@test root]# lsmod
      Module                  Size  Used by    Tainted: P
      rhinefet                14208   2
      ....(略)....
       
      2. 設定開機時載入模組
      [root@test root]# vi /etc/modules.conf
      # 加入底下這一行
      alias eth0 rhinefet
       
      3. 也可以重新開機是看看能否正常的啟動模組:
      [root@test root]# sync; sync; reboot
      如果可以出現上述的畫面,那麼表示模組可以被正確的載入,同時,如果模組已經正確的載入了,那麼就可以直接寫入開機設定檔 /etc/modules.conf 了。注意一下,在上面的例子當中,我們使用的是 rhinefet 這個模組,如果您的模組名稱並非這個名稱,請依照您的實際狀態來修改,不要在 /etc/modules.conf 照抄我的設定啊!不然.....不要怪我~
       
    基本上,這樣就已經編譯成功,並且也將該模組掛上系統了,接下來就是需要測試一下這個網路卡是否能夠正確的來運作啦!
     

    使用 Private IP 測試網路卡之運作:手動設定, 檔案設定
     
    要測試網路卡是否能夠工作,就是給網路卡一個私有 IP 來測試即可!而測試的方法又很簡單,可以直接以手動下達指令的方式來啟動網路卡,也可以使用設定檔來設定好網路參數。底下我們以 192.168.1.2 這個私有 IP ,加上 255.255.255.0 這個 C Class 的 netmask 來測試看看,此外,也以 eth0 為預設的 Gatewaydev ( 通訊閘裝置 ):
     

      手動設定
       
      ifconfig 的詳細說明我們在下一章再來詳談,這裡先談一談他的簡易用法囉:
       
      [root@test root]# ifconfig eth0 192.168.1.2
      [root@test root]# ifconfig
      eth0      Link encap:Ethernet  HWaddr 00:10:DC:F1:D8:C5
                inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
                UP BROADCAST MULTICAST  MTU:1500  Metric:1
                RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:100
                RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
                Interrupt:17 Base address:0xd400 Memory:fb060000-fb060038
       
      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:41739 errors:0 dropped:0 overruns:0 frame:0
                TX packets:41739 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0
                RX bytes:4252360 (4.0 Mb)  TX bytes:4252360 (4.0 Mb)
       
      [root@test root]# ping 192.168.1.2 -c 3
      PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
      64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.106 ms
      64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.016 ms
      64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.013 ms

      --- 192.168.1.2 ping statistics ---
      3 packets transmitted, 3 received, 0% packet loss, time 1998ms
      rtt min/avg/max/mdev = 0.013/0.045/0.106/0.043 ms
       
      [root@test root]# ifconfig eth0 down

       
      使用 ifconfig 後面加上網路卡代號,並且加上 IP ,就可以設定好網路卡的相關網路參數了!不過,要注意的是那個網路介面有個 lo 的咚咚存在是吧!沒錯啦!在網路基礎裡面談到的 loopback 就是這個介面囉!他的預設 IP 就是 127.0.0.1 咯。再來使用 ping 來測試該網路卡是否能夠正常的回應,呵呵!這樣就算測試成功了。再來先將網路卡關掉,然後底下再以檔案模式的方法來測試一下網路卡囉!另外, ifconfig 也可以直接修改 IP ,例如上面的案例中,如果在網路卡啟動的狀態下,想要將 IP 改為 192.168.1.200 ,則下達『ifconfig eth0 192.168.1.200 』即可!
       

      檔案設定
       
      在檔案的設定裡面,我們會動用到的檔案其實只有 /etc/sysconfig/network-scripts/ifcfg-eth0 ,不過,底下我們連同通訊閘(Gateway)也一同設定妥當,同時更改主機名稱,所以還會動用到 /etc/sysconfig/network 這個檔案哩!修改一下先:
       
      1. 設定 /etc/sysconfig/network 檔案:

      2. 這個檔案可以設定主機名稱與預設的通訊閘,不過,在某些版本當中,這個檔案無法設定 Gateway 呢,所以,不建議在這個檔案裡面設定 Gateway。主機名稱的修改就是在這個檔案咯:
        [root@test root]# vi /etc/sysconfig/network
        NETWORKING=yes       <==是否啟動網路,當然是啦!
        HOSTNAME=test.domain.name  <==主機名稱,要確定呦!可以隨時修改啦!
         
      3. 設定網路卡參數 /etc/sysconfig/network-scripts/ifcfg-eth0 檔案:

      4. 這個檔案的設定也可以設定的很簡單的啦!馬上設定看看:
        [root@test root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
        DEVICE=eth0        <==設定裝置的名稱,這個要跟檔案名稱對應
        ONBOOT=yes         <==是否在開機的的時候啟動網路卡
        BOOTPROTO=static      <==啟動的時候的 IP 取得的協定,這裡是固定的,
                       如果是 Cable 的話,要改成 dhcp 才行。
        IPADDR=192.168.1.2     <==這個就是 IP 囉!
        NETMASK=255.255.255.0   <==這個就是子遮罩網路囉!
        NETWORK=192.168.1.0    <==這個就是該網段的第一個 IP 咯
        BROADCAST=192.168.1.255  <==這個就是最後一個同網段的廣播位址囉!
        GATEWAY=192.168.1.2    <==這個就是這塊網路卡的通訊閘囉!
        #GATEWAYDEV=eth0      <==也可以這麼寫!
        這個檔案就是在設定這個網路卡的主要網路參數啦!包括他的網域、IP、子遮罩網路、軟體廣播位址及通訊閘等等。要特別留意的是, GATEWAY 設定的是整個 Linux 系統的 Default Gateway 而不是這塊網路卡的 Gateway 喔!這個概念得先釐清。因此,如果您有多張網路卡在 linux 系統上面時,也就是您有 ifcfg-eth0, ifcfg-eth1.... 等多個檔案,只要在其中一個檔案設定 GATEWAY 即可!不要每個檔案都設定啊!如果每個檔案都設定 gateway 時,在某些版本的 Linux 上面可能會發生問題。但是如果您不是使用固定的 IP 作為 Gateway ,而是使用網路裝置作為 Gateway (通常 Router 最常有這樣的設定),那也可以使用 GATEWAYDEV 來設定通訊閘裝置呢!相關的網路參數說明請參考 網路基礎
         
      5. 啟動與關閉網路卡:

      6. 啟用網路卡設定檔案的指令是 ifup 與 ifdown:
        [root@test root]# /etc/rc.d/init.d/network restart <==重新啟動網路介面
        [root@test root]# ifup  eth0  <==啟動 eth0 網路卡 
        [root@test root]# ifdown eth0  <==關閉 eth0 網路卡
        ifup 是啟動而 ifdown 是關閉的意思!後面接的是網路卡的代號。
         
      7. 檢查是否啟動了:

      8. 檢查網路卡是否啟動了!就使用 ifconfig 即可:
        [root@test root]# ifconfig eth0
        eth0      Link encap:Ethernet  HWaddr 00:50:FC:22:9C:57
                  inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
                  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                  RX packets:5692910 errors:0 dropped:0 overruns:0 frame:0
                  TX packets:5914804 errors:0 dropped:0 overruns:0 carrier:0
                  collisions:848 txqueuelen:100
                  RX bytes:522002571 (497.8 Mb)  TX bytes:2498073183 (2382.3 Mb)
                  Interrupt:10 Base address:0x6100
         
        [root@test root]# ping -c 3 192.168.1.2
        PING 192.168.1.2 (192.168.1.2) from 192.168.1.2 : 56(84) bytes of data.
        64 bytes from 192.168.1.2: icmp_seq=0 ttl=255 time=318 usec
        64 bytes from 192.168.1.2: icmp_seq=1 ttl=255 time=213 usec
        64 bytes from 192.168.1.2: icmp_seq=2 ttl=255 time=217 usec

        --- 192.168.1.2 ping statistics ---
        3 packets transmitted, 3 packets received, 0% packet loss
        round-trip min/avg/max/mdev = 0.213/0.249/0.318/0.050 ms

         
    上述的兩種方法中,請特別留意的是,手動以 ifconfig 這個指令來修改 IP 或者是網路卡參數是可行的,您可以在任何時刻手動的修改。不過,如果原先以 ifup eth0 的方式來啟動網路卡之後,再以 ifconfig 來進行 IP 的修改,那麼網路的的啟動與關閉就得使用 ifconfig 了,不能夠使用 ifdown eth0 來關閉了!否則會顯示找不到該網路卡的錯誤訊息喔!反正大原則就是:先以檔案的型態 ifcfg-eth0 來設定好您的網路參數,而如果想要暫時更動網路參數的話,那麼就使用 ifconfig 來進行修改,如此一來,未來重新開機之後,還是會以 ifcfg-eth0 的設定為準

連上 Internet 的方法:

    區域網路的簡易設定裡面,我們知道了連上 Internet 的方法有好多種,不過在現今的台灣,主要的連線方法其實是以學術網路、ADSL 固接與撥接、Cable modem 等方式為主,所以底下我們僅針對這三種方式來加以介紹,至於傳統的 56 Kbps 撥接則因為速度較慢且使用度越來越低,所以在這裡就不多做介紹了。
     

    固定 IP 上網方式: 非撥接上網之方式


     
    以固定 IP 來上網的情況大致可以分為兩種:
     
    • 一種是類似學術網路或者是固定制的 ADSL 這些情況,您有『公共 IP』,並且也取得了『公共 IP 的 GATEWAY』了!而您的其他的所有的網路參數也都取得的情況!
     
    • 另一種則是保留 IP 的情況,例如在 區域網路架構 那個章節的 圖三 當中,我們的 PC3 是 Linux ,而這個 Linux 的 IP 就是 保留 IP ,並且透過 Linux server 的 NAT 作為 GATEWAY 的情況!( 不知道 NAT 嗎?!沒關係,以後就知道啦! )
     
    這樣清楚了嗎?反正就是要上網的時候,需要取得網路的所有參數就對了!底下我們來介紹一下使用固定私有 IP ,並且透過 NAT 主機的私有 IP 介面連上 Internet 的情況:
     
    • 網路參數的取得:

    • 在確定所有的網路參數之前,請先確定您的 網路卡 沒有問題之後,再來則是網路連線的問題了!請先確認您的 網路硬體連線 沒有問題喔 ( 這是大前提! )。這裡先說說如果以固定制( 或者是校園網路系統 )的情況之下,您已經知道了您的 IP 與 gateway 的 address 的話,該如何設定以連接 Internet 呢?『請特別注意,這是給已經知道您的 IP 與 Gateway 的情況下使用的方法,若是使用 ADSL 撥接系統上網的話,這個方法並不適用!』,也就是說,如果您的網路連線是類似 GIGA 之類的撥接後才給予一個固定 IP 的話,那麼就不能使用這個方法!我們假設我們的網路參數為底下的模樣:
       
      • IP 為:        192.168.1.13
      • Netmask 為:   255.255.255.0
      • Network 為:   192.168.1.0
      • Broadcast 為: 192.168.1.255
      • Gateway 為:   192.168.1.2
      • 主機名稱為:   redhat9.vbird.net
      • DNS 設定為:   168.95.1.1
       
      而連上 Internet 的方法只有幾個步驟:
       
      (1)設定主機名稱與預設通訊閘;
      (2)設定網路參數( IP, netmask, broadcast, Network 等等 );
      (3)設定 DNS 伺服器的 IP ( 的 ISP 給的 );
      (4)重新啟動網路設備。
       
      這樣就夠了!您當然可以使用手動指令設定上面的參數,不過需要 ifconfig, route 等等指令的下達,有點討厭就是了!所以這裡我們以檔案設定的方式來設定網路參數喔!
       
      1. /etc/sysconfig/network ( 設定主機名稱與 default gateway )
      2. [root@test root]# vi /etc/sysconfig/network
        NETWORKING=yes
        HOSTNAME=redhat9.vbird.net
         
      3. /etc/sysconfig/network-scripts/ifcfg-eth0 ( 設定網路卡參數 )
      4. [root@test root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
        DEVICE=eth0
        ONBOOT=yes
        BOOTPROTO=static
        IPADDR=192.168.1.13
        NETMASK=255.255.255.0
        NETWORK=192.168.1.0
        BROADCAST=192.168.1.255
        GATEWAY=192.168.1.2
         
      5. /etc/resolv.conf ( 設定 DNS 主機的 IP )
      6. [root@test root]# vi /etc/resolv.conf
        nameserver 168.95.1.1
        nameserver 139.175.10.20
        我們以中華電信與 SeedNet 在南部的 DNS 主機之 IP 作為設定的方式!請注意一下,如果您不知道的最接近的 DNS 主機的 IP ,那麼直接輸入 nameserver 168.95.1.1 這個中華電信的 DNS 主機即可!
         
      7. 重新啟動網路設定:

      8. 因為我們更動過 /etc/sysconfig/network 這個檔案,所以最好以『network restart』來啟動較好,有時候甚至需要 reboot 才能讓主機名稱生效呢!不過,如果僅是要測試網路卡的話,使用 ifup 即可!
        [root@test root]# /etc/rc.d/init.d/network restart
        [root@test root]# ifdown eth0
        [root@test root]# ifup   eth0
        到這一步驟就算成功啦!使用 ping 試看看能否成功喔!
         
    使用固定 IP 的上網方式設定其實較為簡便,這些步驟要記熟啊!因為未來會常常做這方面的操作喔!
     

    Cable Modem 上網方式


     
    在 Linux 上設定以 Cable 魔電( Modem )來上網是最簡單的事了!因為他是透過所謂的 DHCP 協定來直接分配 IP 與相關的網路參數給 Linux 的,所以,我們幾乎所有的網路參數都不需要設定呢!只要設定啟動網路卡時候,選擇的啟動協定為 dhcp 就可以了!不過,如果主機端沒有給我們 DNS 的 IP 與主機名稱的時候,還是需要設定的啦! ^_^
     
    1. /etc/sysconfig/network ( 設定主機名稱與 default gateway )
    2. [root@test root]# vi /etc/sysconfig/network
      NETWORKING=yes
      HOSTNAME=redhat9.vbird.net
       
    3. /etc/sysconfig/network-scripts/ifcfg-eth0 ( 設定網路卡參數 )
    4. [root@test root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
      DEVICE=eth0
      ONBOOT=yes
      BOOTPROTO=dhcp  <==這一行設定正確即可!下面的四個網路參數沒有用!
                 需要留意的是,在 Openlinux 裡面,這裡的設定
                 為 DYNAMIC=dhcp 喔!
      IPADDR=192.168.1.13
      NETMASK=255.255.255.0
      NETWORK=192.168.1.0
      BROADCAST=192.168.1.255
       
    5. /etc/resolv.conf ( 設定 DNS 主機的 IP )
    6. [root@test root]# vi /etc/resolv.conf
      nameserver 168.95.1.1
      nameserver 139.175.10.20
      這個設定有時候會被主動的改變,這是因為來自於 dhcp 主機的設定所致!所以,如果被改變時,請不要訝異!詳細的 DHCP 說明請參考後面章節的 DHCP 伺服器設定喔!
       
    7. 重新啟動網路設定:
    8. [root@test root]# /etc/rc.d/init.d/network restart
      [root@test root]# ifdown eth0
      [root@test root]# ifup   eth0
      當然,直接 reboot 也是可以啦!
     
    設定 Cable modem 就是這麼簡單喔!
     

    ADSL 撥接上網方式


     
    好了,終於提到最熱門的 ADSL 撥接制的上網方式囉!嗯!來談一談怎麼在 Linux 上撥接上網吧!在 Linux 系統中,要以 ADSL 連上 Internet 是一件很簡單的事情,使用 rp-pppoe ( http://www.roaringpenguin.com/pppoe/ ) 軟體就可以進行撥接了!安裝也很方便喔!再來要注意的是,在目前的 Linux 版本當中,由於強調桌上型電腦的便利性,所以很多版本的 Linux 都取消了文字介面下的 ADSL 撥接指令,例如 Red Hat 新版的 Linux 。所以在預設的狀態下,我們僅能以圖形介面啟動 ADSL ,這真的很討厭,因為我們的主機就是不想要啟用 X Window 的啊!怎麼辦?沒關係,我們可以透過重新安裝 rp-pppoe 就行啦!我們提過在 Linux 的安裝方式主要有 RPM 與 Tarball 兩種方式,目前鳥哥已經成功的在 Red Hat 7.2 上面安裝 rp-pppoe-2.6-5.src.rpm 這個版本的 rp-pppoe 囉!然而由於很多時候 RPM 有相依屬性的問題,因此我們也嘗試以 Tarball 來安裝一下 rp-pppoe 吧!( 註:如果依舊無法以 RPM 安裝 rp-pppoe 時,請直接以 Tarball 來安裝吧! )
     
    此外,需要特別留意的是,原本 Linux 主機上面就會有 eth0 這個網路卡介面,不過在使用 rp-pppoe 撥接之後,會多產生了一個對外的介面,稱為 ppp0 的這個網路連線介面,因此,您將具有三個網路介面喔!分別是:
     
    1. 內部迴圈測試用的lo介面;
    2. 網路卡 eth0 這個介面;
    3. 撥接之後產生的經由 ISP 對外連接的 ppp0 介面。
     
    而由於這三個介面的 IP 網段都不相同,因此,請『特別留意通訊閘的設定!』一般而言,在 ADSL 撥接的狀態下,前面提到的幾個檔案的設定內容中,『都不要設定GATEWAY及GATEWAYDEV這兩個參數』,因為 rp-pppoe 會自動由 ISP 取得這方面的資料,如果您設定了GATEWAY,反而會造成系統無法連線出去的狀態喔!
     
    因為撥接之後會產生兩個實體介面,分別為 eth0 與 ppp0 ,所以底下我們將針對兩個介面進行設定。在 eth0 的設定中,我們選擇 192.168.1.0/255.255.255.0 並且 IP 為 192.168.1.2 ,至於 ppp0 則完全由 rp-pppoe 所產生。
     
    設定與安裝的步驟簡單說明如下:
     
    1. 重新設定網路參數檔案;
    2. 查看是否安裝了 rp-pppoe,移除 rp-pppoe;
    3. 安裝 rp-pppoe :
      • 用 rpm 安裝;
      • 用 Tarball 安裝;
    4. 設定 rp-pppoe :
    5. ADSL 撥接連線
     
    好了!開始一步一步來進行安裝與設定及連線的步驟吧!
     
    1. 重新設定網路參數檔案:

    2. 由於我們是使用撥接的方式來連上 Internet 的,所以 default gateway 是由 rp-pppoe 撥接之後 ISP 直接傳送資料到我們 Linux 主機上的,因此,在您的 Linux 系統當中,千萬不要設定 GATEWAY 或者是 GATEWAYDEV 喔!( 這個情況我們會在 Linux Router 的設定當中說明 )!
      1. 取消預設通訊閘
      [root@test root]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
      DEVICE=eth0
      ONBOOT=yes    <==若您需要 eth0 幫您建立內部私有網域時,這裡可以寫成 yes
                 但若不需要內部網路時,這一行請直接寫成 no ,反正撥接
                 之後網路卡會自動被啟動!
      BOOTPROTO=static
      IPADDR=192.168.1.2
      NETMASK=255.255.255.0
      NETWORK=192.168.1.0
      BROADCAST=192.168.1.255
       
      [root@test root]# /etc/rc.d/init.d/network restart
       
    3. 移除原本的 rp-pppoe 套件:

    4. 如同前面說的,新版的 rp-pppoe 很多都僅支援圖形介面的撥接程式,所以我們這裡直接將 rp-pppoe 移除 (或者根本不要使用預設的 rp-pppoe 套件),然後再重新安裝官方網站的 rp-pppoe 套件說:
      [root@test root]# rpm -qa | grep rp-pppoe
      rp-pppoe-3.5-2    <==看來是已經安裝了!只好移除囉!
      [root@test root]# rpm -e rp-pppoe
       
    5. 安裝 rp-pppoe :

    6. 安裝 rp-pppoe 的方式有兩種,可以使用 rpm 與 tarball 的方式來分別安裝,不過,只要選擇一種來安裝就可以啦!
       
      • RPM 安裝 rp-pppoe:

      • 如果您下載的是 SRPM 的檔案的話,那麼就需要先經過編譯才行。詳細的編譯及安裝步驟如下表所示:( 請注意,編譯的過程也需要 gcc 之類的 compiler ,如果沒有在 Install 的時候選擇時,在編譯個過程中可能會有出現錯誤,請自行由 Linux 原版光碟安裝吧! )
         
        1. 下載 rp-pppoe :

        2. rp-pppoe 的下載網站在:『http://www.roaringpenguin.com/pppoe/#download』,底下我是以rp-pppoe-3.5-1.src.rpm 這個檔案進行介紹的。如果的主機尚未開放任何的服務時,可以使用軟碟來下載 rp-pppoe ,因為 rp-pppoe 的檔案很小啦!還不到 200 KB 呢!所以軟碟就可以囉!如何使用軟碟呢?
          • 先使用軟碟將下載下來的 rp-pppoe copy 到軟碟上;
          • 將軟碟放置於 Linux 主機的軟碟槽中;
          • 在 Linux 底下使用 df 這個指令,看看有沒有類似底下的這一行:

          • /dev/fd0     1423   0  1423 0% /mnt/floppy
            如果有的話,請使用『 umount /mnt/floppy 』,如果無,則跳到下一步;
          • 使用『 ls -l /mnt 』看看有沒有 floppy 這個目錄:

          • 如果有則下一步,若無則『 mkdir /mnt/floppy 』;
          • 使用『 mount -t vfat /dev/fd0 /mnt/floppy 』將軟碟掛上去!
          • 使用『 cp /mnt/floppy/rp* /root 』將檔案 copy 到 /root 這個目錄下;
          • 使用『 cd /root 』將目錄轉到 root 底下。
           
        3. 編譯及安裝 rp-pppoe :
        4. 1. 編譯 SRPM: 
          [root@test root]# rpm --rebuild rp-pppoe-3.5-1.src.rpm
          [root@test root]# rpmbuild --rebuild rp-pppoe-3.5-1.src.rpm
          # 註:在 Red Hat 7.3 以前, rpm 的指令使用 rpm ,但是在 Red Hat 8 
          # 以後, SRPM 的重製指令已經獨立至 rpmbuild 囉!所以請選擇
          # 適合您的 Linux 版本喔!
          .........
          Wrote: /usr/src/redhat/RPMS/i386/rp-pppoe-3.5-1.i386.rpm
          .........
          在編譯時,最後的結果(如果沒有錯誤)會顯示上面那個樣子!
          也就是說,您的編譯完成的檔案就放在上面囉!
           
          2. 安裝 rp-pppoe :
          [root@test root]# cd /usr/src/redhat/RPMS/i386 
          [root@test i386]# rpm -ivh rp-pppoe-3.5-1.i386.rpm 
          Preparing...                ########################################### [100%]
             1:rp-pppoe               ########################################### [100%]
          [root@test i386]# rpm -q rp-pppoe
          rp-pppoe-3.5-1
          這樣就安裝完畢了!簡單吧!如果不相信,可以查詢看看! 
          安裝完畢之後,會在 /usr/sbin 當中多了 adsl-start, adsl-stop, adsl-setup, adsl-status 等檔案,至於設定檔則在 /etc/ppp 當中!如果要詳細的看每一個指令的用法,可以使用 man adsl-setup ....等指令名稱來觀察!我們這裡僅提供設定的方法及執行的方法!
           
      • Tarball 安裝 rp-pppoe :

      • 嗯!由於 RPM 可能會有相依屬性的問題!因此,如果的系統上面無法安裝 rp-pppoe 的話,那麼就直接以 Tarball 的方式來安裝 rp-pppoe 吧!目前 (2003/08/18) 最新的 rp-pppoe 套件為 rp-pppoe-3.5.tar.gz 這個檔案:
        1. 解壓縮!
        [root@test root]# mv rp-pppoe-3.5.tar.gz /usr/local/src
        [root@test root]# cd /usr/local/src
        [root@test src]# tar -zxvf rp-pppoe-3.5.tar.gz
         
        2. 偵測系統與編譯執行檔:
        [root@test src]# cd rp-pppoe-3.5/src
        [root@test src]# ./configure --prefix=/usr/local
        [root@test src]# make; make install
        安裝方面很簡易吧!這樣就妥當囉!準備來給他設定一下吧!
         
    7. 設定 rp-pppoe :

    8. rp-pppoe 的設定非常簡單,只要透過 /usr/sbin/adsl-setup ( 若為 Tarball 安裝的話,那麼就在 /usr/local/sbin /adsl-setup 囉 ) 這個程式來設定就 OK 了!
      [root@test root]# /usr/sbin/adsl-setup 
      >>> Enter your PPPoE user name (default bxxxnxnx@sympatico.ca): T0123456
      這個時候請輸入您在 ADSL 的帳號,不同的 ISP 有不同的設定方式呦!請特別注意!
      a. 如果是 seednet 的話,應該有點像這樣==> T0123456 
      b. 如果是 Hinet 的話,應該有點像這樣====> yourname@hinet.com.tw(連同 host 也要寫)
       
      >>> Enter the Ethernet interface connected to the ADSL modem 
      For Solaris, this is likely to be something like /dev/hme0. 
      For Linux, it will be ethn, where 'n' is a number. 
      (default eth0): eth0
      因為我們使用 eth0 連線的呀!
       
      >>> Enter the demand value (default no): <=按下 Enter 即可
      這裡按 enter 不用設定就好了! 

      >>> Enter the DNS information here: 168.95.1.1
      >>> Enter the secondary DNS server address here: 139.175.10.20
      這裡要您輸入慣用的 DNS 主機:
      若使用 hinet 的話,可以打入 168.95.1.1
      若使用 seednet 的時候,可以打入 139.175.10.20 
       
      >>> Please enter your PPPoE password:  <==輸入您的密碼
      >>> Please re-enter your PPPoE password:  <==再輸入一次
      這裡就輸入您的 ADSL 密碼啦,要輸入兩次喔! 
       
      The firewall choices are: 
      0 - NONE: This script will not set any firewall rules.  You are responsible 
                for ensuring the security of your machine.  You are STRONGLY 
                recommended to use some kind of firewall rules. 
      1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation 
      2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway 
                      for a LAN 
      >>> Choose a type of firewall (0-2):
      這裡要您選擇防火牆 的形式,通常我是不設火牆的, 
      所以直接選 0 就對了! 注意:選了防火牆有的時候反而會造成無法連線成功!
      反正未來我們會手動設定防火牆,所以這裡不設定沒有關係!
       
      Start this connection at boot time
      Do you want to start this connection at boot time?
      Please enter no or yes.
      yes
      如果想要一開機就自動啟動 ADSL 連線的話,這裡可以填入 yes啦!
       
      Ethernet Interface: eth0 
      User name:          T0123456 
      Activate-on-demand: No 
      Primary DNS:        168.95.1.1
      Secondary DNS:      139.175.10.20 
      Firewalling:        NONE 
       
      >>> Accept these settings and adjust configuration files (y/n)?
      接下來將您的設定作一個整合結果輸出,如果沒有問題的話,
      輸入 y 之後就完成設定啦! 
      基本上,設定完成之後以下的檔案會被自動改變,
      有影響的是 resolv.conf 這個檔案,您可以手動改變這個檔案喔!
       
      Adjusting /etc/ppp/pppoe.conf 
      Adjusting /etc/resolv.conf 
        (But first backing it up to /etc/resolv.conf-bak) 
      Adjusting /etc/ppp/pap-secrets and /etc/ppp/chap-secrets 
        (But first backing it up to /etc/ppp/pap-secrets-bak) 
        (But first backing it up to /etc/ppp/chap-secrets-bak)

      哈哈!這樣設定就成功啦!很簡單吧!唯一需要注意的是在上面的 username 那個地方,千萬注意,因為 hinet 與 seednet 的設定是不一樣的!千萬小心呢!否則會無法連上線呦!此外,由於我們在未來還會有 firewall 的建置,所以這裡不太需要使用到防火牆啦!就先關閉他吧 ( 選 0 ) !否則也可能無法連上 Internet 呦!(註:上面那個 T0123567 以及密碼都是向 ISP 申請的,不是自己隨便設定的喔!不要搞錯了!)另外,注意一下,我們上面使用 adsl-setup 的設定,其實最主要是修改兩個檔案,分別是 /etc/ppp/pppoe.conf 這個主要設定檔,以及 /etc/ppp/chap-secrets 這個密碼儲存檔!仔細去察看一下 chap-secrets 這個檔案的內容,您就可以知道您的密碼是否輸入錯誤了! ^_^
       
    9. 連上 Internet 啦!

    10. 怎麼撥接呢?簡單的很,直接下達 adsl-start 即可!
      [root@test root]# adsl-start
      ....Connect!
      這樣就是顯示連上 Internet 啦!通常比較容易出問題的地方在於硬體的連線情況,請先確認所有的硬體連線沒有問題喔!通常,如果使用小烏龜 ( ATU-R ) 時,請使用跳線連接網路卡與 ATU-R。另外一個容易出錯的地方在於輸入的帳號與密碼,帳號與密碼都是的 ISP 給的,並且注意大小寫(可以到 /etc/ppp/chap-secrets 察看一下是否設定錯誤?)。
       
    11. 查看的 IP 啦!

    12. 那如何知道的 IP 呢?呵呵!就使用 ifconfig 呀!
      [root@test root]# ifconfig ppp0
      ppp0      Link encap:Point-to-Point Protocol 
                inet addr:211.74.249.38  P-t-P:172.16.11.8  Mask:255.255.255.255 
                UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1 
                RX packets:8356088 errors:0 dropped:0 overruns:0 frame:0 
                TX packets:8532063 errors:0 dropped:0 overruns:0 carrier:0 
                collisions:0 txqueuelen:10
      在上表中顯示,ppp0 ( 就是 ADSL 的 ISP 給的公共 IP ) 的網址是 211.74.249.38。
       
    13. 自動偵測 ppp0 的撥接狀態:

    14. 基本上,目前的 rp-pppoe 已經都設定好了斷線後會自動撥接的模式了,因此我們大可不用太擔心,不過,如果還是很擔心會斷線後無法自動撥接出去,那麼可以在 /etc/crontab 加入這一行:
      [root@test root]# vi /etc/crontab
      .......
      01-59/3 * * * * root /usr/sbin/adsl-start  > /dev/null 2>&1
      在上面的式子當中,如果看不懂的話,那就表示『需要再將 BASH Shell 學一學了』! ^_^
       

    撥接程式 rp-pppoe 訊息錯誤處理
     
    或許您會發現使用 rp-pppoe 撥接之後,您的 /var/log/messages 老是出現這樣的訊息:
     
    [root@test root]# more /var/log/messages
    May 10 18:02:22 testing pppoe[8527]: Bogus PPPoE length field (50)
     
    這是什麼問題啊?在 RP-PPPOE 的官方討論區上面提過,這個問題是由於 ISP 提供的訊息長度超過 rp-pppoe 預設的檢查長度才會發生的一個警告訊息,事實上這個訊息並不重要,不用理會他也沒有關係,不會影響到 Internet 的運作。但是,這樣的訊息在 /var/log/messages 裡面每一分鐘就出現一次,實在很討厭!怎麼辦,可以將他拿掉嗎?!當然可以!您可以下載新的 Tarball 來重新編譯過!步驟是這樣的:
     
    1. 到下面的網站去下載新的 Tarball (我這裡以 3.5 為例!)

    2. http://www.roaringpenguin.com/pppoe/#download
    3. 在 /usr/local/src底下解開該檔案,則會造成 /usr/local/src/rp-pppoe-3.5 這個目錄
    4. 到 /usr/local/src/rp-pppoe-3.5/src 底下去,修改這四個檔案:
      • discovery.c
      • pppoe.c
      • pppoe-server.c
      • relay.c
      找到這四個檔案的內容如下代碼:
        /* Check length */
          if (ntohs(packet.length) + HDR_SIZE > len) {
              syslog(LOG_ERR, "Bogus PPPoE length field (%u)",
                     (unsigned int) ntohs(packet.length));
              return;
          }
      將他修改成為:
          /* Check length */
          if (ntohs(packet.length) + HDR_SIZE > len) {
              /* syslog(LOG_ERR, "Bogus PPPoE length field (%u)",
                     (unsigned int) ntohs(packet.length)); */
              return;
          }
      請注意,上面每個檔案都有多個同樣的字串,請依序一個一個都修改掉才行!還沒完喔!再到 pppoe.c 找到底下的字眼:
          if (plen + HDR_SIZE > len) {
              syslog(LOG_ERR, "Bogus length field in session packet %d (%d)",
                     (int) plen, (int) len);
              return;
          }
      請將他改成:
          if (plen + HDR_SIZE > len) {
              /* syslog(LOG_ERR, "Bogus length field in session packet %d (%d)",
                     (int) plen, (int) len); */
              return;
          }
    5. 然後就可以開始這樣做囉:
    6. cd /usr/local/src/rp-pppoe-3.5/src
      ./configure
      make
      make install
    7. 如果一切都可以成功的進行,那麼就可以:
    8. adsl-stop
      adsl-start
       
    這個簡單的步驟應該可以將您的問題訊息克服了吧! ^_^

設定內部保留 IP 與 DNS IP: /etc/hosts, /etc/resolv.conf,
    在新聞群組或者是BBS上面最常聽到的就是這個問題啦:
     
    • 咦!我的ADSL已經撥接上了,使用telnet IP也可以正確的連上BBS,但是為什麼就是無法使用『telnet 網址』的方式連上Internet呢?
     
    • 我在我的虛擬網域內有幾部電腦,這幾部電腦明明都是在同一個網域之內,而且系統通通沒有問題,為什麼我使用pop3或者是ftp連上我的Linux主機會停頓好久才連上?
     
    這兩個問題其實有點相關性啦,第一個問題比較好解決,那個絕對是DNS的IP設定錯誤,修改一下/etc/resolv.conf即可!第二個問題則是因為網路連線時,有的時候會去檢查連線IP的主機名稱(我們稱為領域名稱反解),但是我們的內部網域電腦都是私有IP,自然無法被反查到他的名稱啦!這個時候我們就必需要藉由/etc/hosts這個檔案來幫我們的內部電腦設定名稱啦(名字可以隨便取沒有關係囉!)
     

    /etc/hosts
     
    還有幾個檔案對於內部真的是挺重要的,首先就是 /etc/hosts 這個檔案啦!請注意!由於電腦與電腦在交互溝通的時候,都會『想要確認對方的身份』,因此會利用 /etc/hosts 與 /etc/resolv.conf 這兩個檔案去『查詢對方的 domain name 』,亦即是對方的身份啦!這個時候,如果您的電腦在連上對方的電腦時,對方無法查詢到您的身份,那就有可能會發生『等待逾時』的情況!最常見的發生狀況就在於『使用您的區域網路內的私有 IP ( 或者被稱為虛擬 IP )連上具有實體 IP 的 NAT 主機』時,最容易發生這個問題了!您應該會覺得奇怪,『咦!不都是我的區域網路的電腦嗎( 指 NAT 主機跟的 Client ) 怎麼 pop3 跟 FTP 連線這麼慢?!還要等個 60 秒!』嘿嘿!沒錯!這個時候就是您的 NAT 主機在追查您的 PC1 的身份啦!
     
    那麼通常 Linux 主機是如何查詢對方的身份的呢?在預設的情況中( 因為這個順序可以改變,所以才會說是『預設情況』,這個順序我們會在 DNS 的架設當中再提及! )首先,就會去檢查 /etc/hosts 這個檔案的設定,所以他是第一優先,再來則是 /etc/resolv.conf 的 DNS 主機啦!而,由於您 LAN 裡面的 Client 是以『私有 IP 』進行架設的,然而您並沒有將您的 私有 IP 寫入 /etc/hosts 當中,這個時候您的 Linux 主機就會到 /etc/resolv.conf 裡面設定的 DNS IP 去查詢您的 client 的身份,偏偏您的 client 根本就沒有在網際網路上( 因為私有路由不可直接與 Internet 連接 ),哈哈!那麼當然 Linux 就會找不到,也就會 delay 了幾乎 60 秒鐘了!
     
    瞭解了嗎?所以說,您就要將您的 私有 IP 的電腦與電腦名稱寫入您的 /etc/hosts 當中了!好了!那麼這個咚咚的內容如何呢?我們來看一看原本的 Red Hat 7.2 的設定吧!
     
    [root@test root]# vi /etc/hosts
    # Do not remove the following line, or various programs
    # that require network functionality will fail.
    127.0.0.1   localhost.localdomain   localhost
    電腦 IP    主機名稱          主機別名( alias )
     
    在上面的情況中很容易就發現了設定的方法了吧!很簡單吧!沒錯!那就是 IP 對應主機名稱啦!那麼現在知道為什麼我們給他 ping localhost 的時候,位址會寫出 127.0.0.1 了吧!那就是寫在這個檔案中的啦!而且那一行不能拿掉呦!否則系統的某些服務就會無法被啟動!好了!那麼將我區域網路內的所有的電腦 IP 都給他寫進去!並且,每一部給他取一個喜歡的名字,即使與 client 的電腦名稱設定不同也沒關係啦!以我為例,如果我還額外加設了 DHCP 的時候,那麼我就乾脆將所有的 C Class 的所有網段 ( 什麼是 C Class ? 如果看不懂我在寫什麼,請千萬回到 網路基礎 去看一看內容呦!很重要的! )全部給他寫入 /etc/hosts 當中,有點像底下這樣:
     
    [root@test root]# vi /etc/hosts
    # Do not remove the following line, or various programs
    # that require network functionality will fail.
    127.0.0.1   localhost.localdomain   localhost
    192.168.1.1  linux001
    192.168.1.2  linux002
    192.168.1.3  linux003
    .........
    .........
    192.168.1.255 linux255
     
    如此一來,不論我哪一部電腦連上來,不論是在同一個網段的哪一個 IP ,我都可以很快速的追查到!嘿嘿!那麼區內網路互連的時候,就不會多等個好幾時秒鐘囉!
     

    /etc/resolv.conf
     
    很多朋友常問的一個問題『咦!我可以撥接上網了,也可以 ping 到奇摩雅虎的 IP ,但為何就是無法直接以網址連上 Internet 呢!』嘿!被氣死!前面不是一直強調那個 DNS 解析的問題嗎?對啦!就是名稱解析不對啦!趕快改一下 /etc/resolv.conf 這個檔案吧!改成上層 ISP 給您的 DNS 主機的 IP 就可以啦!例如 Hinet 的 168.95.1.1 及 Seednet 的 139.175.10.20 囉!例如底下的範例(這個範例就可以照抄了! ^_^):
     
    [root@test root]# vi /etc/resolv.conf
    nameserver 168.95.1.1
    nameserver 139.175.10.20
     

無法連線的自我檢查幾大問題詳解

  • DNS 設定錯誤:

  • 最容易造成無法以網址連線的情況就是 DNS 主機的 IP 設定錯誤了!大家都習慣將 /etc/resolv.conf 設定成自己 NAT 的主機 IP!這是『錯誤的情況』!請注意!將『區域網路內的每一部電腦,不只是 NAT 主機,全部的( 不論是 Linux 還是 Windows ) DNS 主機 IP 都寫成合法的 IP!例如使用 Hinet 的 168.95.1.1 !
  • GATEWAY 設定錯誤:

  • 常常有朋友問到:『為何我的 adsl-start 撥接上了,但是就是無法連接出去 Internet 呢?』有的朋友則是問:『為何我連出去 Internet 的時候,都是以私有 IP 那個介面( eth0 )在連線,而不會以公共 IP ( ppp0 那個介面 )來連線?』這個都是同樣的問題,就是系統無法建立實際的 gateway 來溝通與 Internet 的連線!因為封包送錯了方向啦!舉個最簡單的例子,我們都知道私有 IP 與公共 IP 不能直接相互溝通,所以我們需要在主機上面設定兩個 IP ( 通常是以兩塊網路卡搞定!),一個是公共 IP 另一個則是私有 IP ,然而在設定的初期,很多人都會使用一個預設的 gateway ( 在 /etc/sysconfig/network 或者是 ifcfg-eth0 ),這個gateway 是在告訴系統:『嘿!要上 Internet 只能由這裡出去!』的意思,因此,所有的封包將會直接給他送到這個 gateway 來!不過,抱歉的是,由於在後來新增了一個 ppp0 ( 撥接之後產生的 ) 界面,這個界面所使用的是公共 IP ,而該 IP 是寫在 ppp0 的界面裡頭的,他可以自行提供合理的 gateway 。然而偏偏已經設定了一個 default gateway 了,因此不論 pppoe 如何振作,嘿嘿!都沒有辦法改變的啦!因此,這個時候就必須要來改一下default gateway 了!
    1. 修改 /etc/sysconfig/network 或者是 ifcfg-eth0 這個檔案,將裡頭的:

    2. GATEWAY=xxxx.xxxx.xxx
      GATEWAYDEV=eth0
      裡面的 xxxx.xxx.xxx.x 都刪掉,然後,那個如果對外卡是eth0,則設定為 eth0 ,否則亦可設定為 ppp0 ( 撥接! )當然,最好是可以不要設定啦,所以變成了:
      GATEWAY=
      GATEWAYDEV=
    3. 這樣就可以啦!如果沒有辦法立刻達成,可以下達:

    4. /etc/rc.d/init.d/network restart
     
    更多的網路除錯請參考後續章節 Linux 網路偵錯 的說明。

課後練習

  • 我要如何確定我在 Linux 系統上面的網路卡已經被 Linux 捉到並且驅動了?
  • 假設我的網路參數為:IP 192.168.100.100, Netmask 255.255.255.0, 請問我要如何在 Linux 上面設定好這些網路參數 (未提及的網路參數請自行定義!)?請使用手動與檔案設定方法分別說明。
  • 我要將我的 Linux 主機名稱改名字,步驟應該如何(更改那個檔案?如何啟用?)?
  • /etc/resolv.conf 與 /etc/hosts 的功能為何?
  • 我使用 ADSL 撥接連上 Internet ,請問撥接成功之後,我的 Linux 上面會有幾個網路介面 (假設我只有一個網路卡)?
  • 在 Linux 上面進行 ADSL 撥接應該使用什麼軟體?
  • 一般來說,如果我撥接成功,也取得了 ppp0 這個介面,但是卻無法對外連線成功,您認為應該是哪裡出了問題?該如何解決?

  • 前往參考用解答

參考資料:

修改歷史:
2002/07/24:首次釋出日期
2003/08/18:重新校正,並且修正部分書寫方式
2003/08/20:新增課後練習部分
2003/09/19:加入前往參考用解答
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計