6.1 無法連線原因分析
老是看到有朋友在網路上哀嚎說:『我的網路不通啊!』還有比較奇怪的是『啊!怎麼網路時通時不通』之類的問題,
這類的問題其實主要可以歸類為硬體問題與軟體設定問題。硬體的問題比較麻煩,因為需要透過一些專門的裝置來分析硬體;
至於軟體方面,絕大部分都是設定錯誤或者是觀念錯誤而已,比較好處理啦 (第四章談到的就是軟體問題)!
OK!我們先來看看網路在哪裡可能會出問題吧!
6.1.1
硬體問題:網路線材、網路設備、網路佈線等
在第二章的網路基礎當中我們曾提到很多的網路基礎概念,
以及一些簡單的硬體維護問題。以一個簡單的星形連線來說,我們可以假設他的架構如同下圖所示:
圖 6.1-1、區域網路的連線狀態示意圖
在上面的圖示當中,"Linux PC3" 要連到 Internet 上面去的話,需要透過網路線、交換器、 NAT 主機 (Linux 伺服器或
IP 分享器)、ADSL 數據機,附掛電話線路、ISP 自己的機房交換器,以及 Internet 上面的所有媒體設備
(包括路由器、橋接器、其他網路線等等);那麼哪些地方可能會出問題啊?
- 網路線材的問題:
在上面的圖示中,可以發現,其實網路周邊設備中,使用最多的就是網路線啦!要注意網路線分成平行線與跳線 (RJ-45接頭),而並不是所有的設備都支援自動分辨跳線與平行線的功能的!
所以你必須要瞭解到你的設備 (Hub/Switch/數據機) 所支援的網路線;另外,如果你的網路線有經過門縫處或者是容易凹折處,
那很有可能由於經常性的凹折導致電子訊號不良,所以你需要注意一下這些事情:
- 網路線被截斷;
- 網路線過度扭曲變形造成訊號不良;
- 自製網路接頭 (如 RJ-45 跳線頭) 品質不良;
- 網路接頭與設備 (如 Hub) 接觸不良;
- 網路卡、Hub 及 Router 等網路設備的問題:
另外,還有一些網路設備也會有問題,常見的問題如下:
- 網路卡不穩定、品質不佳,或者與整體系統的相容度不佳 (網路卡也是會壞的);
- 各網路設備的接頭不佳,接觸不良,造成訊號衰減 (經常的拔插就有可能發生);
- 由於網路設備所在環境惡劣 (例如過熱) 導致的當機問題 (鳥哥經常遭遇到 switch 熱當的問題);
- 各網路設備使用方法不良,造成設備功能衰減 (switch 常常插電/斷電容易壞喔);
- 設備配置的規則:
在各個設備的配置上是有一定的規則的,而最容易發生的問題就是太長的網路線會造成訊號的衰減,
導致網路連線的時間太長甚至無法連線。我們曾在網路基礎當中談過乙太網路最長的支援距離 (10BASE5 最長可達 500m),
還有一些其他網路媒體配置的問題你必須曉得的:
- 使用錯誤的網路線,最常發生在平行線與跳線的分別 (現在比較少見這個問題了)!
- 架設的網路線過長,導致訊號衰減太嚴重。例如乙太網路 CAT5e 的線理論限制長度大概是在 90
公尺左右 (雖然 10BASE5 可達 500m),若兩個設備 (Hub/主機之間) 長度大於 90
公尺時,自然就容易出現訊號發生問題了!
- 其他雜訊的干擾,最常發生在網路線或者網路設備旁邊有太強的磁波;
- 區域網路上面,節點或者其他的設備太多,過去我們常以所謂的 543 原則來說明:(註1)
- 5 個網段 (segment)。所謂 segment 就在物理連接上最接近的一組電腦,在一個 BNC
網段裡面最多只能接 30 台電腦﹐且網線總長不能超過 185m。
- 4 個增益器 (repeater)。也就是將信號放大的裝置。
- 3 個電腦群體 (population)。這個不好理解﹐也就是說前面所說的 5 個 segment 之中,
只能有 3 個可以裝電腦,其它兩個不行。
上述是一些最常見的硬體問題,當然啦,有的時候是設備本身就有問題,而我們在網路基礎裡面談到的那個很重要的『
網路佈線
』的情況,也是造成網路停頓或通順與否的重要原因吶!所以,硬體問題的判斷比較困難點。
好~底下我們再來聊一聊軟體設定的相關問題。
6.1.2 軟體問題:IP
參數設定、路由設定、服務與防火牆設定等
所謂的軟體問題,絕大部分就是 IP 參數設定錯誤啊,路由不對啊,還有 DNS 的 IP 設定錯誤等等的,
這些問題都是屬於軟體設定啦!只要將設定改一改,利用一些偵測軟體查一查,就知道問題出在哪裡了!基本的問題有:
- 網路卡的 IP/netmask 設定錯誤:
例如:同一個 IP 在同一個網段中出現造成 IP 衝突、子網路遮罩設定錯誤、網路卡的驅動程式使用錯誤、網路卡的 IRQ、
I/O Address 的設定衝突等等;
- 路由的問題 (route table):
最常見的就是預設路由 (default gateway) 設定錯誤了!或者是路由介面不符所導致的問題,
使得資料封包沒有辦法順利的送出去。
- 通訊協定不相符:
最常發生在不同的作業系統之間的通訊傳輸,例如早期 Windows 98 與 Windows 2000 之間的『網芳』
若要達成溝通,則 Windows 98 必須要加裝 NetBEUI 這個通訊協定才行。又例如兩部 Linux
主機要透過 NFS 通訊協定傳輸資料時,兩邊都得要支援 rpcbind 這個啟動 RPC 協定的程式才行!
這些通訊協定我們都會在後面的章節分別介紹的啦!
- 網路負荷的問題 (loading):
當同時有大量的資料封包湧進 Server 或者是 Hub 或者是同一個網域中,
就有可能造成網路的停頓甚至掛點!另外,如果區網內有人使用 BT (P2P 軟體)
或者是有人中毒導致蠕蟲充滿整個區網,也會造成網路的停頓問題;
- 其他問題:
例如:一些 port 被防火牆擋住了,造成無法執行某些網路資源;應用程式本身的 Bug
問題;應用程式中使用者的網路設定錯誤;以及不同的作業系統的相容性問題等等。
6.1.3 問題的處理
既然問題發生了,就要去處理他啊!那如何處理呢?以上面的星形連線圖示為例,把握兩個原則:
- 先由自身的環境偵測起,可以由自身 PC 上的網路卡查起,到網路線、到 Hub 再到數據機等等的硬體先檢查完。
在這個步驟當中,最好用的軟體就是 ping ,而你最好能有兩部以上的主機來進行連線的測試;
- 確定硬體沒問題了,再來思考軟體的設定問題!
實際上,如果網路不通時,你可以依序這樣處理:
- 瞭解問題:這個問題是剛剛發生?還是因為之前我做了什麼動作而導致無法連線?
例如之前鳥哥曾經更新過一個核心,結果該核心並不能驅動鳥哥的新網卡...
- 確認 IP:先看看自己的網卡有無驅動?能否取得正確的 IP 相關參數來連線?
- 確認區網連線:利用 ping
來溝通兩部主機 (路由器或 IP 分享器),確定網路線與中繼的 hub/switch 工作正常;
- 確認對外連線:看主機或 IP 分享器能否依據第四章的方法順利取得 IP 參數,並以
ping 的方法確定對外連線是可以成功的 (例如 ping
168.95.1.1);
- 確認 DNS 查詢:利用 nslookup 或 host 或 dig 檢查 www.google.com 看看;
- 確認 Internet 節點:可以利用
traceroute 檢查各節點是否沒問題?
- 確認對方伺服器正常服務:是否對方伺服器忙線中?或他的機器掛了?
- 確認我方伺服器:如果是別人連不上我這部主機,那檢查主機某些服務正確啟動否?可利用
netstat 檢查。或是否某些安全機制的軟體沒有設定好,例如
SELinux 這項機制;
- 防火牆或權限的問題:是否由於權限設定錯誤所致?
是否由於你的機器有防火牆忘記啟用可連線的埠口所致?這個可以透過
tcpdump 來處理!
透過這些處理動作後,一般來說,應該都可以解決你無法上網的問題了!當然啦,如果是硬體的問題,那麼鳥哥也無法幫你,
你可能最需要的是......『送修吧孩子!』
6.2 處理流程
既然知道上面已經談到的幾個小重點了,接下來當然是一個一個的給他處理掉啊!
底下我們就得要一步一腳印的開始檢查的流程啊!
6.2.1 步驟一:網路卡工作確認
其實,網路一出問題的時候,你應該從自己可以檢查的地方檢查起,因此,
最重要的地方就是檢查你的網路卡是否有工作的問題啦!檢查網路卡是否正常工作的方法如下:
- 確定網路卡已經驅動成功:
如果網路卡沒有驅動成功,其他的,免談!所以你當然需要驅動你的網路卡才行!確認網路卡是否被驅動,可以利用 lspci
以及 dmesg 這兩個咚咚來查詢相關的設備與模組的對應。詳情請參考:第四章的相關說明。
再次強調,捉不到網卡驅動程式,除了自己編譯之外,再購買一張便宜的網卡來應付著用,是不錯的想法!
- 確定可以手動直接建立 IP 參數:
在順利的載入網路卡的模組,並且『取得網路卡的代號』之後,我們可以利用
ifconfig 或
ip 來直接給予該網路卡一個網路位址試看看!
看能否給予 IP 設定呢?例如:
[root@www ~]# ifconfig eth0 192.168.1.100
來直接建立該網路卡的 IP ,然後直接輸入 ifconfig 看能否查閱到剛剛設定好的參數即可。
如果可以建立起該 IP ,就以 ping 來檢測看看:
[root@www ~]# ping 192.168.1.100
如果有回應的話,那表示這個網卡的設定應該是沒有問題了!再來則是開始檢測一下區域網路內的各個連接硬體啦!
6.2.2 步驟二:區域網路內各項連接設備檢測
在確認完了最重要的網路卡設定之後,並且確定網路卡是正常的之後,再接著下來則是區域網路內的網路連接情況了!假設你是按照
圖 6.1-1 所設定的星形連線區域網路架構,那麼你必須要知道整個『網域』的概念!
- 關於網域的概念:
能否成功的架設出區網,與網域的概念有關!所以,你要知道所謂的 192.168.1.0/24 這種網域的表達方式所代表的意義,
且子網路遮罩 (Netmask) 的意義也得瞭解。如果忘記了,請回去第二章網路基礎再翻一翻。
- 關於 Gateway 與 DNS 的設定:
Gateway 與 DNS 最容易被搞混~這兩個並非是填寫你的 Linux 主機的 IP 喔!應該是要填寫 IP 分享器 (或 NAT 主機) 的
IP 在 Gateway 中,填寫 168.95.1.1 在 DNS 的 IP 設定當中!不能夠搞錯啊!
- 關於 Windows 端的工作群組與電腦名稱:
假如你還需要資源分享,那麼你就必須在 windows 系統中開放檔案分享,
並且建議所有的電腦將『工作群組』設定相同,但『電腦名稱』則不能相同!不過,這個只與網芳及 SAMBA 伺服器有關。
假設你的區網內所有的主機 IP 都設定正確了,那麼接下來你就可以使用 ping 來測試兩部區網內主機的連線,
這個連線的動作可以讓你測試兩部主機間的各項設備,包括網路線、Hub/Switch 等等的咚咚!
如果無法測試成功,那就請瞭解一下:
- IP 參數是否設定正確:
再次強調,先決定 IP/netmask 是對的!鳥哥在上課的時候常常發現同學無法連到我的主機上,
一經使用 ifconfig 才發現他們與我的 IP 不在同一個網段內,就是會有這樣的情況發生啊!唉~
- 連線的線材問題:
包括我們前面提到的網路線本身折損、過度纏繞造成的訊號衰減問題等等,
另外,有些比較舊的 Hub/Switch 或者是 ADSL 數據機,由於沒有
Auto MDI/MDIX 的功能,所以無法自動的分辨跳線與否,
那麼當你用錯網路線的時候,也就無法接通啦!另外,早期我們常常會說,
最簡單判斷每部主機是否順利連接到 Hub/Switch 可以透過連接到 Switch 上的燈號來判斷,
不過,由於有時候網路線本身訊號不良,雖然燈號還是會亮,不過就是無法連接到 Switch 的情況
(鳥哥自己就曾發生過啊),此時,跟朋友借一條 OK 的網路線來測試看看吧!
- 網卡或 Hub/Switch 本身出問題:
有一次鳥哥無法在外部連接到鳥哥的主機,懷疑是掛點了,結果衝到主機所在辦公室察看,咦!
主機是好好的嘛!那怎麼會無法連線呢?原因是...室內環境通風不良,加上 Switch 所在處溫度過高,
加上那部舊的 switch 『剛好』風扇壞了,哈!就這樣『 switch 當機 』
在重新啟動 switch (拔掉再插上電源線) 後就正常了。所以囉,很多情況都是會發生的,
而區域網路內的環境也很容易影響到連線品質啊!
確定自己主機的 IP 與網卡沒有問題,加上內部區網透過 ping 也測試過沒有問題,接下來就是要『取得可以對外連線的 IP
參數』啦!這個重要!
6.2.3 步驟三:取得正確的 IP 參數
什麼叫『取得正確的 IP 參數』啊?還記得我們談過如果要順利的連接上 Internet 的話,
必須要可以跟 public IP 進行溝通才行,而與 public IP 取得溝通的方法,在台灣比較常見的有 ADSL,
Cable modem, 學術網路, 電話撥接等等。在 CentOS 當中,我們可以透過修改
/etc/sysconfig/network-scripts/ifcfg-eth0,或者是利用 rp-pppoe 來進行撥接,
無論如何,你就是得要連接到某個 ISP 去就是了~
在你確認所有的區網沒有問題之後,參考一下第四章的介紹,連上之後,立即以 ifconfig 看看有沒有捉到正確的 IP 啊?
在台灣如果使用 ADSL 連線的話,你應該可以順利的取得一組正確的 Public IP 參數的!
曾有國外的華人朋友來信說到,他們使用 ADSL 撥接之後竟然取得一組 Private IP ,
害他們沒有辦法架站!他們想請問這樣的情況是否合理。如果你熟悉路由相關的概念之後,
當然會知道:『這當然合理!』,因為你取得的 IP 只是為了要連接到 ISP 去而已,
而 ISP 與你的主機當然可以透過 Private IP 來連線啊!如果是這樣的話,那麼你就肯定無法架站了! ^_^
另外,最常發現無法順利取得 IP 的錯誤就是『BOOTPROTO』這個設定值設定錯了!因為 static 與 dhcp 協定所產生的 IP
要求是不一樣的啊!還記得吧!要特別留在 ifcfg-eth0 裡面的設定參數喔!另外,如果你是使用 ADSL 撥接的,
但是老是無法撥接成功,那麼建議你可以這樣試看看:
- 將 ADSL 的數據機整個關機,將 Switch/Hub 也關掉電源;
- 靜待十分鐘,等這些設備比較『涼快』一點後,再重新插上電源;
- 將 Linux 連接到 ADSL 的那塊網卡 (假設為 eth0) 在 ifcfg-eth0 內,『ONBOOT』設定為 no,
重新啟動網路 (/etc/init.d/network restart),然後再執行 adsl-start
- 如果還是無法撥接成功,並且你已經確認內部網域沒有問題,那請中華電信的工程人員來幫忙你處理吧!
因為很多時候都是由於網路媒體過熱,也有可能主機內部的一些網路參數有點問題,
所以,乾脆就不要啟動網卡,讓 adsl-start 自動去啟動網卡即可!
如果順利取得 IP 後,卻還是無法順利連到 Internet 上面時,你覺得還有哪些地方需要處理的呢?
為了避免 switch 以及 ADSL 數據機熱當,鳥哥以及一些重度網路使用者的朋友,就買了桌上型小電扇,配合定時器 (timer)
來定時的向這兩個設備吹風~為啥需要定時器?因為擔心電風扇一直開著會燒掉...
6.2.4 步驟四:確認路由表的規則
如果你已經順利取得正確的 IP 參數的話,那麼接下來就是測試一下是否可以連上 Internet 啊!
鳥哥建議你可以嘗試使用 ping 來連連看 Hinet 的 DNS 主機,也就是 168.95.1.1 那部機器啦!
[root@www ~]# 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』
所致,解決的方法為:
- 取消 ifcfg-eth0 內 GATEWAY=192.168.1.2 那一行,(該行亦可能出現在 /etc/sysconfig/network 內)
- 重新啟動網路 /etc/init.d/network restart
- 重新進行撥接: adsl-stop; adsl-start
|
另外一個可能發生的情況,就是:『忘記設定預設路由』啦!例如使用 ifconfig 手動重新設定過網路卡的 IP
之後,其實路由規則是會被更新的,所以預設路由可能就會不見了!那個時候你就得要利用 route add 來增加預設路由囉!
6.2.5 步驟五:主機名稱與 IP 查詢的
DNS 錯誤
如果你發現可以 ping 到 168.95.1.1 這個 Internet 上面的主機,卻無法使用瀏覽器在網址列瀏覽
http://www.google.com 的話,那肯定 99% 以上問題是來自於 DNS 解析的困擾!解決的方法就是直接到 /etc/resolv.conf
去看看設定值對不對啊!一般常見的內容是這樣的:
[root@www ~]# vim /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
位置就可以了
另外,每一部主機都會有主機名稱 (hostname) ,預設的主機名稱會是 localhost ,這個主機名稱會有一個 127.0.0.1 的
IP 對應在 /etc/hosts 當中。如果你曾經修改過你的主機名稱,該主機名稱卻無法有一個正確 IP 的對應,
那麼你的主機在開機時,可能會有好幾十分鐘的延遲。
所以囉,那個 /etc/hosts 與你的主機名稱對應,對於內部私有網域來說,是相當重要的設定項目呢!
6.2.6 步驟六:Linux 的 NAT
伺服器或 IP 分享器出問題
NAT 伺服器最簡單的功能就是 IP 分享器啦!NAT 主機一定是部路由器,所以你必須要在 Linux
上面觀察好正確的路由資訊。否則肯定有問題。另外, NAT 主機上面的防火牆設定是否合理?
IP 分享器上面是否有設定抵擋的機制等等,都會影響到對外連線是否能夠成功的問題點。
關於 NAT 與防火牆我們會在後續的章節繼續介紹的啦!
6.2.7 步驟七:Internet 的問題
Internet 也會出問題喔!當然啦~沒有任何東西是不會出問題的!舉例來說,好幾年前台灣西岸因為施工的關係,
導致南北網路骨幹纜線被挖斷,結果導致整個 Internet 流量的大塞車!這就是 Internet 的問題~還有,數年前
Study Area 網站放置的地點由於路由器設定出了點差錯,
結果導致連線速度的緩慢。這都不是主機本身出問題,而是 Internet 上面某個節點出了狀況。
想要確認是否問題來自 Internet 的話,就使用 traceroute 吧!
查察看問題是來自那個地方再說!
6.2.8 步驟八:伺服器的問題
如果上述的處理都 OK ,卻無法登入某部主機時,我想,最大的問題就是出現在主機的設定啦!這包括有:
- 伺服器並沒有開放該項服務:例如主機關閉了 telnet ,那你使用 telnet 去連線,是無法連接上的啦!
- 主機的權限設定錯誤:例如你將某個目錄設定為 drwx------ ,該目錄擁有者為 root ,
你卻將該目錄開放給 WWW 來瀏覽,由於 WWW 無法進入該目錄,所以當然無法正確的給用戶端瀏覽啊!
這是最典型的權限設定錯誤的情況啊!
- 安全機制設定錯誤:例如 SELinux 是用來更細微控管主機存取的一種核心機制,結果你啟動的是系統原先不支援的類型,
那麼 SELinux 反而可能會抵擋該服務的提供!而其他例如 /etc/hosts.deny, PAM 模組等等,
都可能造成使用者無法登入的問題!這就不是網路問題,而是主機造成連線無法成功!
- 防火牆問題:防火牆設定錯誤也是一個很常見的問題,你可以使用
tcpdump 來追蹤封包的流向,
以順利的瞭解防火牆是否設定錯誤。
基本上,一個網路環境的檢測工作可不是三言兩語就講的完的~而且常常牽涉到很多經驗的問題~
請你常常到一些講座的場合去聽聽看大家的經驗,去 google 看看人家的解決方法,
都有助於讓你更輕易的解決網路問題的喔! ^_^!鳥哥也將上述的動作規劃成一個流程圖,參考看看:
圖 6.2-1、網路問題解決流程圖