本文已不再維護,更新文章請參考這裡

Linux 最強的,也是最讓人稱道的地方,就是他的網路功能了,不論是 Mail server、Web server、Proxy server 等等,都好好用喔!但是,我們也常在網路上看到一堆常見的問題,就是在問『我的 Linux 沒有辦法連上網路,該如何是好....』等等的問題,問來問去的重點大概都是一樣的狀況!傷腦筋!那鳥哥就把一些在 Linux 上面可能會發生的網路問題把他整理一下,看看您是不是有這方面的問題,參考看看吧!

1. 無法連線原因分析
  1.1 硬體問題
  1.2 軟體問題
  1.3 問題的處理
2. 處理流程
  2.1 步驟一:網路卡工作確認
  2.2 步驟二:區域網路內各項連接設備檢測
  2.3 步驟三:取得正確的 IP 參數
  2.4 步驟四:確認路由表的規則
  2.5 步驟五:主機名稱與 IP 查詢的 DNS 錯誤
  2.6 步驟六:Linux 的 NAT 伺服器或 IP 分享器出問題
  2.7 步驟七:Internet 的問題
  2.8 步驟八:主機的問題
3. 課後練習
4. 針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=26155

無法連線原因分析
老是看到有朋友在網路上哀嚎說:『我的網路不通啊!』還有比較奇怪的是『啊怎麼網路時通時不通』之類的問題, 這類的問題其實主要可以歸類為硬體問題與軟體設定問題,硬體的問題比較麻煩,因為需要透過一些專門的裝置來分析硬體; 至於軟體方面,絕大部分都是設定錯誤或者是觀念錯誤而已,比較好處理啦! OK!我們先來看看網路在哪裡可能會出問題吧!


硬體問題
網路基礎章節當中我們曾提到很多的網路基礎概念, 以及一些簡單的硬體維護問題。以一個簡單的星形連線來說,我們可以假設他的架構如同下圖所示:

區域網路的連線狀態示意圖
圖一、區域網路的連線狀態示意圖


在上面的圖示當中,"Linux PC3" 要連到 Internet 上面去的話,需要透過網路線、 交換器、 NAT 主機 (Linux 伺服器或 IP 分享器)、ADSL 數據機,以及 Internet 上面的所有媒體設備 (包括路由器、橋接器、其他網路線等等); 那麼哪些地方可能會出問題啊?
  1. 網路線材的問題

    在上面的圖示中,可以發現,其實網路周邊設備中,使用最多的就是網路線啦! 要注意網路線分成平行線與跳線 (RJ-45接頭) ,而並不是所有的設備都支援自動分辨跳線與平行線的功能的! 所以你必須要瞭解到你的設備 (Hub/Switch/數據機) 所支援的網路線;另外, 如果你的網路線是接在門縫處或者是容易凹折處,那很有可能具有被壓毀的情況, 所以您需要注意一下這些事情:

    • 網路線被截斷;
    • 網路線過度扭曲變形造成訊號不良;
    • 自製網路接頭 ( 如RJ-45跳線頭 ) 品質不良;
    • 網路接頭與設備 ( 如 Hub )接觸不良;

  2. 網路卡、Hub 及 Router 等網路設備的問題

    另外,還有一些網路設備也會有問題,常見的問題如下:

    • 網路卡不穩定、品質不佳,或者與整體系統的相容度不佳;
    • 各網路設備的接頭不佳,接觸不良,造成訊號衰減;
    • 由於網路設備所在環境惡劣 (例如過熱) 導致的當機問題;
    • 各網路設備使用方法不良,造成設備功能衰減;

  3. 設備配置的規則

    在各個設備的配置上是有一定的規則的,而最容易發生的問題就是太長的網路線會造成訊號的衰減, 導致網路連線的時間太長甚至無法連線。我們曾在網路基礎當中談過乙太網路最長的支援距離, 還有一些其他網路媒體配置的問題您必須曉得的:

    • 使用錯誤的網路線,最常發生在平行線與跳線的分別!
    • 架設的網路線過長,導致訊號衰減太嚴重。例如乙太網路 CAT5e 的線理論限制長度大概是在 90 公尺左右,若兩個設備 (Hub/主機之間) 長度大於 90 公尺時,自然就容易出現訊號發生問題了!
    • 其他雜訊的干擾,最常發生在網路線或者網路設備旁邊有太強的磁波;
    • 區域網路上面,節點或者其他的設備太多,過去我們常以所謂的 543 原則來說明:
      • 5個網段(segment)。所謂segment就在物理連接上最接近的一組電腦, 在一個BNC網段裡面最多只能接30台電腦﹐且網線總長不能超過185m。
      • 4個增益器(repeater)。也就是將信號放大的裝置。
      • 3個電腦群體(population)。這個不好理解﹐也就是說前面所說的5個segment之中﹐ 只能有3個可以裝電腦﹐其它兩個不行。
上述是一些最常見的硬體問題,當然啦,有的時候是設備本身就有問題, 而我們在網路基礎裡面談到的那個很重要的『 網路佈線 』的情況,也是造成網路停頓或通順與否的重要原因吶!所以,硬體問題的判斷比較困難點。 好∼底下我們再來聊一聊軟體設定的相關問題。


軟體問題
所謂的軟體問題,絕大部分就是 IP 設定錯誤啊,路由不對啊,還有 DNS 的 IP 設定錯誤等等的, 這些問題都是屬於軟體設定啦!只要將設定改一改,利用一些偵測軟體查一查, 就知道問題出在哪裡了!基本的問題有:
  1. 網路卡的 IP 設定錯誤
    例如:同一個 IP 在同一個網段中出現造成 IP 衝突、子遮罩網路設定錯誤、網路卡的驅動程式使用錯誤、 網路卡的 IRQ、 I/O Address 的設定衝突等等;

  2. 路由的問題 (route table)
    最常見的就是預設路由 (default gateway) 設定錯誤了!或者是路由介面不符所導致的問題, 使得資料封包沒有辦法順利的送出去。

  3. 通訊協定不相符
    最常發生在不同的作業系統之間的通訊傳輸,例如早期 Windows 98 與 Windows 2000 之間的『網芳』 若要達成溝通,則 Windows 98 必須要加裝 NetBEUI 這個通訊協定才行。又例如兩部 Linux 主機要透過 NFS 通訊協定傳輸資料時,兩邊都得要支援 portmap 這個啟動 RPC 協定的程式才行! 這些通訊協定我們都會在後面的章節分別介紹的啦!

  4. 網路負荷的問題 (loading)
    當同時有大量的資料封包湧進 Server 或者是 Hub 或者是同一個網域中, 就有可能造成網路的停頓甚至掛點!另外,如果區網內有人使用 BT (P2P 軟體) 或者是有人中毒導致蠕蟲充滿整個區網,也會造成網路的停頓問題;

  5. 其他問題
    例如:一些 port 被防火牆擋住了,造成無法執行某些網路資源;應用程式本身的 Bug 問題;應用程式中使用者的網路設定錯誤;以及不同的作業系統的相容性問題等等。

問題的處理
既然問題發生了,就要去處理他啊!那如何處理呢?以上面的星形連線圖示為例,把握兩個原則: 實際上,如果網路不通時,你可以依序這樣處理:
  1. 瞭解問題:這個問題是剛剛發生?還是因為之前我做了什麼動作而導致無法連線?
  2. 確認 IP:先看看自己的網卡有無驅動?能否取得正確的 IP 來連線?
  3. 確認區網連線:利用 ping 來溝通兩部主機,確定網路線與中繼的 hub/switch 工作正常;
  4. 確認對外連線:看主機或 IP 分享器能否依據 連上 Internet 那一章的方法順利取得 IP 參數,並以 ping 的方法確定對外連線是可以成功的;
  5. 確認 DNS 查詢:利用 nslookup 或 host 或 dig 檢查 www.google.com 看看;
  6. 確認 Internet 節點:可以利用 traceroute 檢查各節點是否沒問題?
  7. 確認對方伺服器正常服務:是否對方伺服器忙線中?或他的機器掛了?
  8. 確認我方伺服器:是否某些服務沒有正確啟動?可利用 netstat 檢查, 是否某些安全機制的套件沒有開放,例如 SELinux 這項機制;
  9. 防火牆或權限的問題:是否由於權限設定錯誤所致? 是否由於您的機器有防火牆忘記啟用可連線的埠口所致?這個可以透過 tcpdump 來處理!
透過這些處理動作後,一般來說,應該都可以解決您無法上網的問題了! 當然啦,如果是硬體的問題,那麼鳥哥也無法幫你,你可能最需要的是...... 『送修吧孩子!

處理流程
既然知道上面已經談到的幾個小重點了,接下來當然是一個一個的給他處理掉啊! 底下我們就得要一步一腳印的開始檢查的流程啊!


步驟一:網路卡工作確認
其實,網路一出問題的時候,您應該從自己可以檢查的地方檢查起,因此, 最重要的地方就是檢查您的網路卡是否有工作的問題啦!檢查網路卡是否正常工作的方法如下:
  1. 確定網路卡已經驅動成功:
    如果網路卡沒有驅動成功,其他的,免談!!所以你當然需要驅動你的網路卡才行! 確認網路卡是否被驅動,可以利用 lspci 先看看有沒有捉到 Ethernet 字樣的顯示資訊,再以 dmesg 來檢查是否被核心偵測到,最後使用 lsmod 看看有沒有相對應的模組已被載入。 整個步驟可以參考『連上 Internet - Linux 網路卡』那一個小節, 這裡鳥哥不再說明了! ^_^!不過你要注意的是,如果上述的檢測方式都無法發現你的網路卡模組, 那肯定就是核心與核心模組不支援你的網路卡啊!那該怎辦?參考 『連上 Internet之網卡編譯』就對了!

  2. 確定可以手動直接建立 IP 參數:
    在順利的載入網路卡的模組,並且『取得網路卡的代號』之後,我們可以利用 ifconfigip 來直接給予該網路卡一個網路位址試看看! 看能否給予 IP 設定呢?例如:
    [root@linux ~]# ifconfig eth0 192.168.1.100
    
    來直接建立該網路卡的 IP ,然後直接輸入 ifconfig 看能否查閱到剛剛設定好的參數即可。 如果可以建立起該 IP ,就以 ping 來檢測看看:
    [root@linux ~]# ping 192.168.1.100
    
    如果有回應的話,那表示這個網卡的設定應該是沒有問題了! 再來則是開始檢測一下區域網路內的各個連接硬體啦!
事實上要再次的重申,如果您的主機捉不到您主機上的網路卡 (通常是內建的網路晶片), 那麼最好買一張便宜的螃蟹卡先來湊合著用,『先求有!再求完美』, 不要一開始就挑戰自己的耐心啊!拜託拜託!

步驟二:區域網路內各項連接設備檢測
在確認完了最重要的網路卡設定之後,並且確定網路卡是正常的之後, 再接著下來則是區域網路內的網路連接情況了!假設您是按照 圖一所設定的星形連線區域網路架構,那麼你必須要知道整個『網域』的概念!
  1. 關於網域的概念
    你得清楚的知道圖一中各主機與伺服器可以互相溝通是因為他們在『同一個網域裡面』, 所以,你要知道所謂的 192.168.1.0/24 這種網域的表達方式所代表的意義, 且子遮罩網路 (Netmask) 的意義也得瞭解。如果忘記了,請回去網路基礎再翻一翻。

  2. 關於 Gateway 與 DNS 的設定
    Gateway 與 DNS (在 /etc/sysconfig/network-scripts/ifcfg-eth0, /etc/resolv.conf 的設定) 最容易被搞混∼ 這兩個並非是填寫你的 Linux 主機的 IP 喔!應該是要填寫 IP 分享器 (或 NAT 主機) 的 IP 在 Gateway 中, 填寫 168.95.1.1 在 DNS 的 IP 設定當中!不能夠搞錯啊!如果還是不清楚?回去網路基礎看看吧!

  3. 關於 Windows 端的工作群組與電腦名稱
    假如您還需要資源分享,那麼您就必須在 windows 系統中開放檔案分享, 並且建議所有的電腦將『工作群組』設定相同,但『電腦名稱』則不能相同!
假設你的區網內所有的主機 IP 都設定正確了,那麼接下來你就可以使用 ping 來測試兩部區網內主機的連線, 這個連線的動作可以讓你測試兩部主機間的各項設備,包括網路線、Hub/Switch 等等的咚咚! 如果無法測試成功,那就請瞭解一下:
  1. IP 參數是否設定正確
    再次強調,先決定 IP 是對的!鳥哥在上課的時候常常發現同學無法連到我的主機上, 一經使用 ifconfig 才發現他們與我的 IP 不在同一個網段內,就是會有這樣的情況發生啊!唉∼

  2. 連線的線材問題
    包括我們前面提到的網路線本身折損、過度纏繞造成的訊號衰減問題等等, 另外,有些比較舊的 Hub/Switch 或者是 ATU-R (ADSL 數據機,俗稱的小烏龜是也) 由於沒有 Auto MDI/MDIX 的功能,所以無法自動的分辨跳線與否, 那麼當你插錯網路線的時候,也就無法接通啦!這樣瞭解乎?另外,早期我們常常會說, 最簡單判斷每部主機是否順利連接到 Hub/Switch 可以透過連接到 Switch 上的燈號來判斷, 不過,由於有時候網路線本身訊號不良,雖然燈號還是會亮,不過就是無法連接到 Switch 的情況 (鳥哥自己就曾發生過啊!),此時,跟朋友借一條 OK 的網路線來測試看看吧!

  3. 網卡或 Hub/Switch 本身出問題
    有一次鳥哥無法在外部連接到鳥哥的主機,懷疑是掛點了,結果衝到主機所在辦公室察看,咦! 主機是好好的嘛!那怎麼會無法連線呢?原因是.......室內環境通風不良,加上 Switch 所在處溫度過高, 加上那部舊的 switch 『剛好』風扇壞了,哈!就這樣『 switch 當機 』 在重新啟動 switch (拔掉再插上電源線) 後就正常了。所以囉,很多情況都是會發生的, 而區域網路內的環境也很容易影響到連線品質啊!
確定自己主機的 IP 與網卡沒有問題,加上內部區網透過 ping 也測試過沒有問題, 接下來就是要『取得可以對外連線的 IP 參數』啦!這個重要!


步驟三:取得正確的 IP 參數
什麼叫『取得正確的 IP 參數』啊?還記得我們談過如果要順利的連接上 Internet 的話, 必須要可以跟 public IP 進行溝通才行,而與 public IP 取得溝通的方法,在台灣比較常見的有 ADSL, Cable modem, 學術網路, 電話撥接等等,在 CentOS 當中,我們可以透過修改 /etc/sysconfig/network-scripts/ifcfg-eth0,或者是利用 rp-pppoe 來進行撥接, 無論如何,你就是得要連接到某個 ISP 去就是了∼在你確認所有的區網沒有問題之後, 參考一下連上 Internet 那一章的介紹, 連上之後,立即以 ifconfig 看看有沒有捉到正確的 IP 啊? 在台灣如果使用 ADSL 連線的話,你應該可以順利的取得一組正確的 Public IP 參數的!
曾有國外的華人朋友來信說到,他們使用 ADSL 撥接之後竟然取得一組 Private IP , 害他們沒有辦法架站!他們想請問這樣的情況是否合理。如果您熟悉路由相關的概念之後, 當然會知道:『這當然合理!』,因為你取得的 IP 只是為了要連接到 ISP 去而已, 而 ISP 與你的主機當然可以透過 Private IP 來連線啊!如果是這樣的話,那麼您就肯定無法架站了! ^_^ 另外,最常發現無法順利取得 IP 的錯誤就是『BOOTPROTO』這個設定值設定錯了! 因為 static 與 hdcp 協定所產生的 IP 要求是不一樣的啊!還記得吧! 要特別留在 ifcfg-eth0 裡面的設定參數喔!另外,如果你是使用 ADSL 撥接的, 但是老是無法撥接成功,那麼建議你可以這樣試看看:
因為很多時候都是由於網路媒體過熱,也有可能主機內部的一些網路參數有點問題, 所以,乾脆就不要啟動網卡,讓 adsl-start 自動去啟動網卡即可! 如果順利取得 IP 後,卻還是無法順利連到 Internet 上面時,你覺得還有哪些地方需要處理的呢?


步驟四:確認路由表的規則
如果你已經順利取得正確的 IP 參數的話,那麼接下來就是測試一下是否可以連上 Internet 啊! 鳥哥建議你可以嘗試使用 ping 來連連看 Hinet 的 DNS 主機,也就是 168.95.1.1 那部機器啦!
[root@linux ~]# ping -c 3 168.95.1.1
如果有回應,那就表示你的網路『基本上已經沒有問題,可以連到 Internet 了!』, 那如果沒有回應呢?明明取得了正確的 IP 卻無法連接到外部的主機,肯定有鬼!呵呵!沒錯! 還記得我們在網域內資料的傳輸可以直接透過 MAC 來傳送, 但如果不在區網內的資料,則需要透過路由,尤其是那個預設路由 (default route) 來幫忙轉遞封包吧! 所以說,如果你的 public IP 無法連接到外部 (例如 168.95.1.1) ,可能的問題就出在路由與防火牆上面了。 假設你沒有啟動防火牆,那問題就縮小到剩下路由囉∼

那路由的問題如何檢查?就用 route -n 來檢查啊!

例題:假設有個使用 ADSL 撥接的 Linux 主機,他的路由表如下,你覺得出了什麼問題?
Destination     Gateway       Genmask         Flags Metric Ref    Use Iface
59.104.200.1    0.0.0.0       255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0       255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0       255.255.0.0     U     0      0        0 eth0
127.0.0.0       0.0.0.0       255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.1.2   0.0.0.0         UG    0      0        0 eth0
答:
    仔細看到上面的路由輸出,第一條是 ppp0 產生的 public IP 介面,第二條是 eth0 的內部網域介面, 在看到最後一條的 0.0.0.0/0.0.0.0 這個預設路由,竟然是內部網域的 eth0 為 gateway ? 這不合理,最大的問題應該是出在 ifcfg-eth0 裡面不小心設定了『GATEWAY=192.168.1.2』 所致,解決的方法為:

    1. 取消 ifcfg-eth0 內 GATEWAY=192.168.1.2 那一行,(該行亦可能出現在 /etc/sysconfig/network 內)
    2. 重新啟動網路 /etc/init.d/network restart
    3. 重新進行撥接: adsl-stop; adsl-start

另外一個可能發生的情況,就是:『忘記設定預設路由』啦! 例如使用 ifconfig 手動重新設定過網路卡的 IP 之後,其實路由規則是會被更新的, 所以預設路由可能就會不見了!那個時候你就得要利用 route add 來增加預設路由囉!


步驟五:主機名稱與 IP 查詢的 DNS 錯誤
如果你發現可以 ping 到 168.95.1.1 這個 Internet 上面的主機,卻無法使用瀏覽器在網址列瀏覽 http://www.google.com 的話,那肯定 99% 以上問題是來自於 DNS 解析的困擾! 解決的方法就是直接到 /etc/resolv.conf 去看看設定值對不對啊! 一般常見的內容是這樣的:
[root@linux ~]# vi /etc/resolv.conf
nameserver 168.95.1.1
nameserver 139.175.10.20
最常見的錯誤是『那個 nameserver 的拼字寫錯了!』真是最常見的問題∼∼另外,如果 client 端是 Windows 系統呢?常常初學者會搞錯的地方就是在 windows 的設定了!要注意: Windows 端的 DNS 設定與主機端 /etc/resolv.conf 的內容相同即可! 很多初學者都以為 TCP/IP 內的 DNS 主機是填上自己的 Linux 主機,這是不對的 (除非您自己的 Linux 上面有 DNS 服務) !您只要填上您的 ISP 給您的 DNS 主機 IP 位置就可以了


步驟六:Linux 的 NAT 伺服器或 IP 分享器出問題
NAT 伺服器最簡單的功能就是 IP 分享器啦!NAT 主機一定是部路由器,所以你必須要在 Linux 上面觀察好正確的路由資訊。否則肯定有問題。另外, NAT 主機上面的防火牆設定是否合理? IP 分享器上面是否有設定抵擋的機制等等,都會影響到對外連線是否能夠成功的問題點。 關於 NAT 與防火牆我們會在後續的章節繼續介紹的啦!


步驟七:Internet 的問題
Internet 也會出問題喔!當然啦∼沒有任何東西是不會出問題的! 舉例來說,好幾年前台灣西岸因為施工的關係,導致南北網路骨幹纜線被挖斷, 結果導致整個 Internet 流量的大塞車!這就是 Internet 的問題∼還有,數年前 Study Area 網站放置的地點由於路由器設定出了點差錯, 結果導致連線速度的緩慢。這都不是主機本身出問題,而是 Internet 上面某個節點出了狀況。 想要確認是否問題來自 Internet 的話,就使用 traceroute 吧! 查察看問題是來自那個地方再說!


步驟八:主機的問題
如果上述的處理都 OK ,卻無法登入某部主機時,我想,最大的問題就是出現在主機的設定啦! 這包括有:
基本上,一個網路環境的檢測工作可不是三言兩語就講的完的∼而且常常牽涉到很多經驗的問題∼ 請您常常到一些講座的場合去聽聽看大家的經驗,去 google 看看人家的解決方法, 都有助於讓你更輕易的解決網路問題的喔! ^_^

課後練習

2002/07/31:第一次完成日期!
2003/08/19:重新修訂一些資料,與前面的章節比較好配合!
2006/08/04:將舊的文章移動到 此處