Linux網(wǎng)絡(luò)故障排查總結(jié)
0.前言
不管使用什么操作系統(tǒng),使用物理機還是虛擬機,甚至容器,網(wǎng)絡(luò)往往都是最難解決的疑難雜癥,我們經(jīng)常由于各種不明原因?qū)е戮W(wǎng)絡(luò)不通。網(wǎng)絡(luò)故障可能是運營商或者鏈路問題,也有可能是本地故障,比如網(wǎng)卡配置錯誤等。解決網(wǎng)絡(luò)故障,通常需要掌握非常多的網(wǎng)絡(luò)知識,比如網(wǎng)絡(luò)協(xié)議、路由、NAT、網(wǎng)卡配置等。本文不在于細(xì)講這些知識,僅僅總結(jié)我在Linux操作系統(tǒng)(使用更多的當(dāng)然是ubuntu系統(tǒng))中著手解決網(wǎng)絡(luò)故障的過程和思路。注意,本文主要針對服務(wù)器,使用命令行進(jìn)行網(wǎng)絡(luò)故障排除,沒有類似圖形界面network-manager工具。事實上,在ubuntu桌面版,我習(xí)慣把network-manager工具禁掉。
1.檢查網(wǎng)絡(luò)設(shè)備
要能連網(wǎng),網(wǎng)絡(luò)設(shè)備首先必須保證處于工作狀態(tài),如果網(wǎng)卡沒有開啟,則肯定不能上網(wǎng)的,假設(shè)我們使用eth0網(wǎng)卡上網(wǎng),首先檢查該網(wǎng)卡是否處于up狀態(tài),使用ip命令:
- sudo ip link ls eth0
輸出:
- fgp@ubuntu:~$ sudo ip link ls eth0
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
- link/ether 08:00:27:c9:b4:f2 brd ff:ff:ff:ff:ff:ff
state必須處于up狀態(tài),若處于down狀態(tài),嘗試手動啟動:
- sudo ip link set eth0 up
或者:
- sudo ifconfig eth0 up
手動啟動后,需要再次運行sudo ip link ls,如果仍然處于down狀態(tài),則說明是網(wǎng)絡(luò)硬件問題,比如網(wǎng)線沒有連接好,或者鏈路不通等。如果大家都能上網(wǎng),極有可能是由于網(wǎng)線接觸不良導(dǎo)致的,拔下網(wǎng)線重新插好,重復(fù)以上工作試試。
2.檢查IP地址
如果網(wǎng)卡已經(jīng)處于up狀態(tài),但仍無法上網(wǎng),則需要查看網(wǎng)卡是否配置好ip地址:
- sudo ifconfig eth0
或者
- sudo ip addr ls eth0
輸出為:
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 08:00:27:c9:b4:f2 brd ff:ff:ff:ff:ff:ff
- inet 192.168.1.105/24 brd 192.168.1.255 scope global eth0
- valid_lft forever preferred_lft forever
- inet6 fe80::a00:27ff:fec9:b4f2/64 scope link
- valid_lft forever preferred_lft forever
以上說明網(wǎng)卡已經(jīng)獲取了ip地址,地址為192.168.1.105/24,如果輸出為:
- 3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
- link/ether 08:00:27:9a:d5:d1 brd ff:ff:ff:ff:ff:ff
- inet6 fe80::a00:27ff:fe9a:d5d1/64 scope link
- valid_lft forever preferred_lft forever
則說明該網(wǎng)卡沒有正確獲取IP。
如果沒有或者ip,就需要配置ip。如果是通過dhcp服務(wù)自動獲取ip的,則可手動運行dhclint獲取ip:
- sudo dhclient -4 -v eth0
如果無法獲取ip,且網(wǎng)卡處于up狀態(tài),則可能是鏈路問題,無法連接遠(yuǎn)程DHCP服務(wù)器。如果知道DHCP服務(wù)器地址,可以ping一下試試,比如DHCP服務(wù)器地址為192.168.1.1:
- ping 192.168.1.1
如果ICMP被禁了,使用nc命令或者telnet更適合,且可以探測端口是否開放,雖然DHCP端口是67,不過通常DHCP和DNS服務(wù)器是同一臺機器,因此順便測試53端口:
- nc -zv 192.168.1.1 67
- nc -zv 192.168.1.1 53
- # telnet 192.168.1.1 67
- # telnet 192.168.1.1 53
如果服務(wù)器的IP不是通過DHCP獲取的動態(tài)IP,而是靜態(tài)IP,則需要手動設(shè)置IP地址,使用ifconfig配置:
- sudo ifconfig eth0 192.168.1.105/24 gw 192.168.1.1
或者
- sudo ip addr add 172.16.0.2/24 dev eth0
- sudo route add default gw 172.16.0.1 dev eth0
到此,需要重新運行ip addr ls或者ifconfig命令再次檢查是否ip配置正確。
3.配置網(wǎng)關(guān)和路由
如果網(wǎng)卡的IP已經(jīng)配置正確(包括子網(wǎng)掩碼),仍然不能上網(wǎng),則需要檢查能否ping通網(wǎng)關(guān)地址,通常網(wǎng)關(guān)地址為網(wǎng)絡(luò)地址的第一個ip或者最后一個ip,比如若ip為192.168.1.101/24,則網(wǎng)關(guān)通常為192.168.1.1或者192.168.1.254,如果不是二者,則需要詢問網(wǎng)管了。假設(shè)網(wǎng)關(guān)地址為192.168.1.1,ping一下是否通:
- ping 192.168.1.1
如果ping不通,則可能是交換機問題。如果網(wǎng)關(guān)連通性良好,則查看路由表是否正確,以下三個命令都可查看路由表,隨便使用一個:
- sudo route -n
- sudo netstat -rn
- sudo ip route ls
輸出為:
- fgp@ubuntu:~$ sudo route -n
- Kernel IP routing table
- Destination Gateway Genmask Flags Metric Ref Use Iface
- 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
- 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
其中Genmask為0.0.0.0的是默認(rèn)路由,檢查Gateway是否正確。不正確的話需要重新修改默認(rèn)網(wǎng)關(guān):
- sudo route del default eth0 # 先刪除錯誤的默認(rèn)網(wǎng)關(guān)
- sudo route add default gw 172.16.0.1 dev eth1 # 填寫正確的網(wǎng)關(guān)
此時可以ping一下外網(wǎng)ip(指不在同一個局域網(wǎng)的IP),注意這里不要用域名,因為可能DNS還是有問題,比如可以ping我們校園網(wǎng)認(rèn)證服務(wù)器IP:10.3.8.211:
- ping 10.3.8.211
如果不能連通外網(wǎng),可以使用tracepath命令查看到底是哪一跳不通,不過我更喜歡mtr命令:
- mtr -n 8.8.8.8
輸出為:
其中host列是所有經(jīng)過的跳(路由),可以查看哪個跳不通或者丟包嚴(yán)重。
4.域名解析
如果能夠ping通外網(wǎng),但仍然不能使用瀏覽器上網(wǎng),那八成是域名解析不了了,即DNS服務(wù)器配置有錯誤。檢查下:
- nslookup server
此時會輸出DNS服務(wù)器地址,檢查是否正確,若不正確或者不存在,可以臨時設(shè)置,修改/etc/resolve.conf文件,設(shè)置可用的DNS服務(wù)器,如果不知道本區(qū)的DNS服務(wù)器,可以設(shè)置通用的`8.8.8.8,可以同時設(shè)置多個DNS服務(wù)器:
- # /etc/resolve.conf
- # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
- # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
- nameserver 219.239.26.42
- nameserver 124.207.160.106
- nameserver 8.8.8.8
- search DHCP HOST
設(shè)置完成后,試一下能不能解析域名:
- nslookup baidu.com
如果能夠解析域名,則應(yīng)該就可以正常上網(wǎng)了。
5.寫入配置文件
我們以上都是通過命令行的方式配置網(wǎng)絡(luò),服務(wù)器重啟后,需要重新配置,如果需要保存狀態(tài),需要寫到配置文件中去,以ubuntu為例,修改/etc/network/interfaces文件,如果是DHCP 動態(tài)ip,配置如下:
- # The primary network interface
- auto eth0 # 設(shè)置網(wǎng)卡開機啟動
- iface eth0 inet dhcp # 設(shè)置網(wǎng)卡動態(tài)獲取IP
如果是靜態(tài)IP,則配置如下:
- auto eth0
- iface eth0 inet static # 設(shè)為靜態(tài)獲取ip
- address 192.168.1.101 # 配置ip地址
- netmask 255.255.255.0 # 設(shè)置子網(wǎng)掩碼
- gateway 192.168.1.1 # 設(shè)置網(wǎng)關(guān)
- dns-nameservers 8.8.8.8 114.114.114.114 # 設(shè)置DNS服務(wù)器,多個地址空格隔開
總結(jié)
網(wǎng)絡(luò)通常是一個反反復(fù)復(fù)的棘手問題,除了以上提到的經(jīng)典問題外,其他配置比如代理、防火墻、VPN、認(rèn)證等,也有可能導(dǎo)致不能正常上網(wǎng),務(wù)必配置正確,本文不再介紹。還有更棘手的比如mtu設(shè)置不正確(比如Openstack neutron使用gre隧道,注意設(shè)置mtu為1400)、病毒劫持等,遇到此類問題,可以試試tcpdump命令進(jìn)行抓包分析。
【本文是51CTO專欄作者“付廣平”的原創(chuàng)文章,如需轉(zhuǎn)載請通過51CTO獲得聯(lián)系】