Linux 網路設定與故障排除

作者:徐秉義(Albert Hsu)

一般使用者講的網路不通,通常指的是開啟 IE(Internet Explorer)連不上 YaHoo、Google 與 Microsoft 等等知名網站的現象。而對於 MIS 人員來說,這事情就不能僅僅表達『通或是不通』那樣地單純,而是要抽絲剝繭地查出不通的原因並且處理到通為止,因此網路不通的故障排除即是 IT 人員基本功夫之一。

本文先從 Linux 設定網路開始談起,進而提到常見的網路不通故障排除,並解說處理此類故障排除所需要的網路觀念。

常用網路設定方式分析

筆者將常用網路設定方式歸納成三種,分別是「DHCP 動態取得」「固定 IP 設定」以及「PPPoE」。

DHCP 動態取得

使用 DHCP 動態取得網路設定有著簡單方便的優勢,在 Linux 通常是使用 dhclient 來當作 DHCP 客戶端程式,從名稱 dhclient 就看得出來他是用在 DHCP Client 端程式,我可以利用「ps ax | grep dhc」一類的指令,來觀察現在是否有執行 dhclient 程式。

r

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

r

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

r

固定 IP 設定

固定(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』反勾選後,底下輸入上述相關設定。

r

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

r

溫馨提示:在有 DHCP Server 的網路環境仍然可以自行設定成固定 IP 方式。

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

nameserver 168.95.1.1
nameserver 168.95.192.1

溫馨提示:對照微軟網路設定內容,「自動取得 IP」對應的是 DHCP 方式;手動設定的上半框則是對應到「setup」指令設定;下半框則是需要編輯『/etc/resolv.conf』檔案內容。

r

PPPoE

第三種常用設定是 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

r

第二步:INTERFACE 的部份,Enter 即可。

溫馨提示:除非您有兩張以上的網路卡,且 PPPoE 不是跑在 eth0,那就要填入正確的eth1 或 eth2 等等。

第三步:接下來看到一堆的英文,大概的意思是要不要持續連線(link continuously)或是一段時間後自動斷線,直接 Enter 即可。

第四步:DNS 的部份,直接 Enter 即可(若有需要可自行至 /etc/resolv.conf 輸入 nameserver 相關資訊)。

第五步(重點步驟):PASSWORD 的部份,則是輸入 PPPoE 密碼兩次。

r

第六步:USERCTRL 的部份,意思為『是否允許一般使用者啟停此介面』,筆者回答『NO』(不允許)。

第七步:FIREWALLING 的部份,筆者是選「0」之後再自行調整防火牆設定。

溫馨提示:0 - NONE(無設定);1 - STANDALONE(一般防火牆方式);2 - MASQUERADE(防火牆採 NAT 模式)。

第八步:開機是否啟動此 PPP 連線(start at boot time)筆者是選「yes」要開機即連線。

最後一步:是否寫入設定(adjust configuration),當然選「y」囉。

溫馨提示:上述調整的許多設定都寫在 /etc/sysconfig/network-scripts/ifcfg-ppp0 檔案內容。

之後在使用網路啟停的 script,例如「/etc/init.d/network restart」若是照筆者設定的話 ifcfg-ppp0 檔案內容會是『ONBOOT=yes』就會自動啟動 ppp0 介面。

r

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

r

溫馨提示:如果此時的 TCP/IP 連線正常,但「名稱解析」不正常時,請記得自行編輯 /etc/resolv.conf 來設定 DNS 解析。

網路不通故障排除

最常見的網路架構是使用 Ethernet(乙太網路)將兩台以上的電腦設備連接起來,並使用 TCP/IP 設定成同網段(NetID)相異的兩個 IP 來測試網路連線是否正常。

接下來我們就以幾個常見的網路不通情況,搭配 Linux 網路偵錯與測試的指令,來實作網路不通的故障排除。

網路卡沒驅動

在 Linux 網路卡通常是由 kernel 內建的驅動程式就能運作,使用指令「ifconfig -a」(顯示所有介面)或是「ip a」就可以看到 eth0(乙太網路第一張卡;ethernet 0)或是 eth1、eth2 這些已經驅動的網路介面。

r

若是遇到網路卡無法驅動,解決的方案如下:

請注意編譯原廠驅動程式需要安裝 gcc 以及 kernel-devel(SuSE 叫 kernel-source)這些相關的套件,這與安裝原廠顯示卡驅動程式類似,請參考筆者「網管人十二期:Linux Xgl 3D 桌面」關於顯示卡安裝原廠驅動程式那個段落。

至於網路卡型號在 Linux 下可以使用「lspci | grep -i eth」指令(lspci 找關於 ethernet 的)查出一些端倪。

r

網路卡沒啟用(也就是停用中)

在「ifconfig」指令沒使用 -a 選項時,只會顯示『啟用(up)』介面,有 -a 選項時才會顯示出所有介面;可想而之的在某個網路介面沒啟動之前,要走這個介面上網是不可能的。

如果是使用「ip a」指令來觀察的話,則是看到那個網路介面冒號後面< >符號內有 UP 就是啟用中的意思。

r

使用指令方式啟用停用網路介面如下表:(網路介面以 eth0 為例)

 

顯示使用中的網路介面顯示所有網路介面啟用 eth0停用 eth0
ifconfigifconfig -aifconfig eth0 upifconfig eth0 down
ip a(有 UP 的)ip a(a 是 addr)ip link set eth0 upip link set eth0 down

溫馨提示:使用指令「/etc/init.d/network retstart」的時候,只要介面的設定檔(例:ifcfg-eth0)內容有『ONBOOT=yes』就會被 UP 起來。

網路線沒接(或沒接好)或是接錯張網路卡

當我們插上網路線時,網路卡與網路設備通常會自動協商(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 是離線)這樣若有兩張以上的網路卡,也比較不會插錯網路孔。

r

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

r

溫馨提示:上述執行 mii-tool 與執行 ethtool 兩台分別是不同的電腦。

IP/Netmask 設定有誤

先前介紹的三個網路不通的原因,比較偏向實體層(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 一文中,測試兩台虛機之間的內部網路時,即是使用上述的測試方式(如下圖)。

r

不同 Broadcast Domain 所造成的網路不通

對於「不同 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)。

r

在主機 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 的原理。

r

一般來說通過 router 以後就來到另一個 Broadcast Domain,所以預設是無法經過 router 以後問到對方主機的 MAC Address(例如:一般人應該問不到 Google 主機的 MAC Address)。

溫馨提示:常聽到說『有效減少廣播封包的方法』即是「切 VLAN」或「用 router 來隔開」,其實就是用來產生多個 Broadcast Domain 的方法。

沒設定預設閘道(Default Gateway)的網路不通

在設定好 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。

r

溫馨提示:除了「route -n」指令,也可以執行「ip r」或「netstat -nr」來顯示路由表。

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

r

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

溫馨提示:traceroute 對於解決封包『繞路』的問題很有幫助(例:該走近的路卻繞到遠的路)。

r

名稱解析沒設定或回應不正確所造成的網路不通

先前曾經談到過,Linux 名稱解析設定是編輯 /etc/resolv.conf 的『nameserver』參數後面輸入名稱解析伺服器的 IP 即可。

我們之前的連線測試,都是以『IP』為基礎的,不像一般使用者所用『名稱』為基礎的連線方式,底下以『名稱解析未設定』來做範例,在沒有 DNS Server 可詢問解析的情況下(如下圖將 nameserver 用#註解起來時),連線則是出現『unknown host』的訊息(我們以 ping dns.hinet.net 主機為例)。

r

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

r

溫馨提示:在 Linux 做名稱解析的問題故障排除時,使用「dig」、「host」與「whois」指令會是相當的方便,有機會再與讀者分享。

應用程式(Application)的網路不通

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。

r

學網管的一定聽過 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 埠有無回應(下圖的有回應)。

溫馨提示:3306 埠是知名資料庫 MySQL 預設使用的埠。

r

應用程式的不通有許多種可能,伺服器端的方面像是:

以上所造成不通的回應訊息也許有的會不一樣、有的卻會很類似(甚至回應訊息一樣),此時只好耐心地抽絲剝繭的來查到底為何不通。

客戶端的錯誤設定也有可能造成不通,最常見的像是主機名稱或是 IP 輸入錯誤、有設定 Proxy 的瀏覽器卻不自知等等。

 

Valid XHTML 1.0! Valid CSS! Get Firefox

Creative Commons License
This site is licensed under a Creative Commons Attribution 2.5 Taiwan License.