一般使用者講的網路不通,通常指的是開啟 IE(Internet Explorer)連不上 YaHoo、Google 與 Microsoft 等等知名網站的現象。而對於 MIS 人員來說,這事情就不能僅僅表達『通或是不通』那樣地單純,而是要抽絲剝繭地查出不通的原因並且處理到通為止,因此網路不通的故障排除即是 IT 人員基本功夫之一。
本文先從 Linux 設定網路開始談起,進而提到常見的網路不通故障排除,並解說處理此類故障排除所需要的網路觀念。
筆者將常用網路設定方式歸納成三種,分別是「DHCP 動態取得」「固定 IP 設定」以及「PPPoE」。
使用 DHCP 動態取得網路設定有著簡單方便的優勢,在 Linux 通常是使用 dhclient 來當作 DHCP 客戶端程式,從名稱 dhclient 就看得出來他是用在 DHCP Client 端程式,我可以利用「ps ax | grep dhc」一類的指令,來觀察現在是否有執行 dhclient 程式。

在 Red Hat Enterprise Linux 設定網路配套措施中,使用「setup」指令來使用 DHCP 動態取得網路設定相當簡便;在〔setup〕→〔Network configuration〕(網路設定)中,將網路介面『Use DHCP』勾選後,回到指令介面重新啟動網路即可,此時網路重起的「/etc/init.d/network restart」這個 script 呼叫 dhclient 程式而動態取得網路設定。

上述設定主要是異動檔案 /etc/sysconfig/network-scripts/ifcfg-eth0 內容『BOOTPROTO=dhcp』那一行。

固定(Static)IP 方式會提供設定所需資訊,像是 IP / 網路遮罩(Netmask)、預設閘道(Default Gateway)與名稱解析伺服器(Name Server)等等,在直接對外的公開(Public)IP 主機設定網路即是一例,以下資訊是由 ISP 業者提供,列舉如下:
| IP / 網路遮罩 | 60.250.207.96/255.255.255.0 |
| 預設閘道 | 60.250.207.254 |
| 名稱解析伺服器一 | 168.95.1.1 |
| 名稱解析伺服器二 | 168.95.192.1 |
在 Red Hat Enterprise Linux 關於『IP / 網路遮罩及預設閘道』設定,使用先前介紹的「setup」指令即可辦到,將網路介面『Use DHCP』反勾選後,底下輸入上述相關設定。

上述設定一樣也是異動到檔案 /etc/sysconfig/network-scripts/ifcfg-eth0 的內容。

至於名稱解析的部份,則是開啟『/etc/resolv.conf』檔案,編寫內容如下即可,他的關鍵字是 nameserver 後面接著是名稱解析伺服器的 IP,詳細說明請參考指令「man resolv.conf」。
nameserver 168.95.1.1 nameserver 168.95.192.1

第三種常用設定是 PPPoE(Point-to-Point Protocol over Ethernet),顧名思義她是一種跑在乙太網路上的點對點通訊協定,常用在 ADSL Router 連線用,她需要一組帳號密碼來做身份驗證,連線成功後會有個 PPP 的網路介面(例如:ppp0)。
在 Red Hat Enterprise Linux 是使用一系列「adsl-*」指令來做 PPPoE 的設定與應用(例如「adsl-setup」),設定完成後帳號密碼主要寫到 /etc/ppp/ 目錄下的 pap-secrets 與 chap-secrets 這兩個檔案;其他有改到的是配合 Red Hat Linux 網路設定「/etc/sysconfig/network-scripts/ifcfg-ppp0」檔案。
底下是執行「adsl-setup」指令的畫面,設定期間問的問題雖然多但不難回答,除了帳號密碼那兩個部份特別重要外,其他大多是按下 Enter 就行。
第一步(重點步驟):一開始看到的 LOGIN NAME 就是輸入『使用者名稱』的畫面,例如輸入:12345678@msa.hinet.net

第二步:INTERFACE 的部份,Enter 即可。
第三步:接下來看到一堆的英文,大概的意思是要不要持續連線(link continuously)或是一段時間後自動斷線,直接 Enter 即可。
第四步:DNS 的部份,直接 Enter 即可(若有需要可自行至 /etc/resolv.conf 輸入 nameserver 相關資訊)。
第五步(重點步驟):PASSWORD 的部份,則是輸入 PPPoE 密碼兩次。

第六步:USERCTRL 的部份,意思為『是否允許一般使用者啟停此介面』,筆者回答『NO』(不允許)。
第七步:FIREWALLING 的部份,筆者是選「0」之後再自行調整防火牆設定。
第八步:開機是否啟動此 PPP 連線(start at boot time)筆者是選「yes」要開機即連線。
最後一步:是否寫入設定(adjust configuration),當然選「y」囉。
之後在使用網路啟停的 script,例如「/etc/init.d/network restart」若是照筆者設定的話 ifcfg-ppp0 檔案內容會是『ONBOOT=yes』就會自動啟動 ppp0 介面。

之後使用「ip a」或是「ifconfig ppp0」就會看到 ppp0 介面以及她所使用的 IP 位址。

最常見的網路架構是使用 Ethernet(乙太網路)將兩台以上的電腦設備連接起來,並使用 TCP/IP 設定成同網段(NetID)相異的兩個 IP 來測試網路連線是否正常。
接下來我們就以幾個常見的網路不通情況,搭配 Linux 網路偵錯與測試的指令,來實作網路不通的故障排除。
在 Linux 網路卡通常是由 kernel 內建的驅動程式就能運作,使用指令「ifconfig -a」(顯示所有介面)或是「ip a」就可以看到 eth0(乙太網路第一張卡;ethernet 0)或是 eth1、eth2 這些已經驅動的網路介面。

若是遇到網路卡無法驅動,解決的方案如下:
請注意編譯原廠驅動程式需要安裝 gcc 以及 kernel-devel(SuSE 叫 kernel-source)這些相關的套件,這與安裝原廠顯示卡驅動程式類似,請參考筆者「網管人十二期:Linux Xgl 3D 桌面」關於顯示卡安裝原廠驅動程式那個段落。
至於網路卡型號在 Linux 下可以使用「lspci | grep -i eth」指令(lspci 找關於 ethernet 的)查出一些端倪。

在「ifconfig」指令沒使用 -a 選項時,只會顯示『啟用(up)』介面,有 -a 選項時才會顯示出所有介面;可想而之的在某個網路介面沒啟動之前,要走這個介面上網是不可能的。
如果是使用「ip a」指令來觀察的話,則是看到那個網路介面冒號後面< >符號內有 UP 就是啟用中的意思。

使用指令方式啟用停用網路介面如下表:(網路介面以 eth0 為例)
| 顯示使用中的網路介面 | 顯示所有網路介面 | 啟用 eth0 | 停用 eth0 |
| ifconfig | ifconfig -a | ifconfig eth0 up | ifconfig eth0 down |
| ip a(有 UP 的) | ip a(a 是 addr) | ip link set eth0 up | ip link set eth0 down |
當我們插上網路線時,網路卡與網路設備通常會自動協商(auto-negotiation)之間應該使用的速度(speed)是 10、100 還是 1Gb/s 以及要使用全雙工(Full-duplex)還是半雙工(Half-duplex)的模式傳輸。
現今的網路大多是以 100Mb/s 或 1Gb/s 的速度且全雙工模式運作,全雙工的原因是主機接的網路設備大多是 Switch 鮮少是 Hub(集線器),現在大概也只有 Hub 才會是以半雙工模式運作且封包會有 collisions(碰撞)現象,一般可使用 ifconfig 觀察封包是否有碰撞。
我們可以利用指令「ethtool eth0」、「ethtool eth1」分別來觀察或設定 eth0、eth1 網路介面關於上述的運作情況,也可以藉此看出哪個網路介面是否有接上線(Link detected: yes 是上線、no 是離線)這樣若有兩張以上的網路卡,也比較不會插錯網路孔。

舊版 Linux 則是使用指令「mii-tool」來觀察或設定上述運作情況,一樣可以看出哪個網路介面有沒有接上線(link ok 或是 no link)像下圖就是 eth0 有接上線、eth1 沒接上線的情況。

先前介紹的三個網路不通的原因,比較偏向實體層(Physical Layer)方面,接下來所列舉出網路不通的情況,因為已經有設定 TCP/IP 網路,因此比較偏向於 TCP/IP model(模型)的網路層(Internet Layer)與連結層(Link Layer)網路不通的情況。
要測兩台之間通或不通,最簡便的方式是:
『在同一個 Broadcast Domain 網路下,設定相同網段(NetID)中相異的兩個 IP 來測試網路連線是否正常』。
此時如果兩台電腦的 IP/Netmask 設定有誤(可能是輸入錯誤或是設定成不同的網段 IP),那這兩台主機雖然是在同一個 Broadcast Domain 但 TCP/IP 連線卻是不通的。
上述情形意思是以連結層來看是通的(因為他們在同一個 Broadcast Domain 下),但以網路層來看卻是不通的(因為設定 TCP/IP 有誤)。
筆者在本刊第25期:營造 Linux 學習環境的利器 VirutalBox 一文中,測試兩台虛機之間的內部網路時,即是使用上述的測試方式(如下圖)。

對於「不同 Broadcast Domain 所造成的網路不通」,就算此時兩台電腦設定成相同網段(NetID)中相異的兩個 IP 依然是不通的。
在此要先了解何謂『Broadcast Domain』,底下以一些實際的網路案例來幫助大家一同了解 Broadcast Domain。
大致上的結論是:
兩台主機在同一個 Broadcast Domain 下只要相互溝通,就會知道對方的 MAC Address,在 Linux 可使用「arp -an」來觀察。
下圖是在主機 172.18.0.35 ping 172.18.9.44 的 arp 情況(其實用 ping 以外的連線方式也可以,例如:telnet)。

在主機 172.18.0.35 ping 172.18.9.44 期間,在 172.18.9.44 那台做「tcpdump 'host 172.18.0.35'」的話(172.18.0.35 是對方 IP),會更清楚的看出連線之前先發 arp 封包問 MAC Address 的原理。

一般來說通過 router 以後就來到另一個 Broadcast Domain,所以預設是無法經過 router 以後問到對方主機的 MAC Address(例如:一般人應該問不到 Google 主機的 MAC Address)。
在設定好 TCP/IP 後(IP/Netmask),相同網段的主機已經可以『直接溝通』了,那至於不同網段主機之間的溝通,則需要通過 router 才行。
這可以透過主機的路由表(Routing Table)來解釋,例如下圖執行「route -n」指令的情況:
先了解一件事:絕大多數的 Router 收到封包後,都是看封包的『目的地 IP 位址』(Destination IP Address)來決定下一站要往哪個 IP 去(擁有那個 IP 的也就是下一個 Router 或是主機)。
以下圖來說要到網段 172.18.0.0/255.255.192.0 的封包是『直接連線』的,意味者不需要透過路由器就可以直接連到(且此網段所用的介面是 eth0)。
至於要連往其他網路 IP 的封包(例如:要往 168.95.1.1 的封包),則符合最後一行的預設路由(Destination 是 0.0.0.0)丟向這台主機的預設閘道 172.18.1.1。

接下來模擬將路由表預設閘道刪除(使用「route del default」指令),這樣通往其他網段(例:168.95.1.1)就會出現『Network is unreachable』的訊息,因為通往這個網段的封包,此時並不知道該往哪裡傳遞。

此時如果在將路由表預設閘道增加回來(使用「route add default gw 172.18.1.1」指令)當然就恢復正常了,另外我們可以使用「traceroute -n 168.95.1.1」追蹤一路上所走的路徑。

先前曾經談到過,Linux 名稱解析設定是編輯 /etc/resolv.conf 的『nameserver』參數後面輸入名稱解析伺服器的 IP 即可。
我們之前的連線測試,都是以『IP』為基礎的,不像一般使用者所用『名稱』為基礎的連線方式,底下以『名稱解析未設定』來做範例,在沒有 DNS Server 可詢問解析的情況下(如下圖將 nameserver 用#註解起來時),連線則是出現『unknown host』的訊息(我們以 ping dns.hinet.net 主機為例)。

調整回正確的有名稱解析伺服器時,就又恢復正常了。

TCP/IP 暢通之後是屬於 TCP/IP model 中的網路層(Internet Layer)正常,至於名稱解析正確,已經關係到 TCP/IP model 傳輸層(Transport Layer)與應用層(Application Layer)這兩個層面(例:名稱解析是使用 DNS 採 UDP 傳輸),這裡要探討的應用程式網路不通就是屬於這兩個層面的事情。
下圖為 http://en.wikipedia.org/wiki/Internet_protocol_suite 的 TCP/IP model。

學網管的一定聽過 OSI 七層 model,他所定義的七層相對於 TCP/IP 來說是比較廣義,而 TCP/IP model 算是應用最成功的、最容易實做的,也因此對於我們 IT/MIS 來說也比較容易理解 TCP/IP model。
網路應用程式通不通一般是檢查傳輸層的 TCP 或 UDP 封包是否正常傳送接收即可,傳送接收正常後就是應用程式本身處理資料的事情。針對 TCP 與 UDP 的封包都可以使用 tcpdump 來查看是否真的有收到,另外 TCP 的部份我們也可以用「telnet 主機或IP位址 埠號」來探查。
例如使用指令「telnet www2.babyface.com.tw 3306」可測試對於主機 www2.babyface.com.tw 的 3306 埠有無回應(下圖的有回應)。

應用程式的不通有許多種可能,伺服器端的方面像是:
以上所造成不通的回應訊息也許有的會不一樣、有的卻會很類似(甚至回應訊息一樣),此時只好耐心地抽絲剝繭的來查到底為何不通。
客戶端的錯誤設定也有可能造成不通,最常見的像是主機名稱或是 IP 輸入錯誤、有設定 Proxy 的瀏覽器卻不自知等等。