Linux網絡故障排查總結
0.前言
不管使用什么操作系統,使用物理機還是虛擬機,甚至容器,網絡往往都是最難解決的疑難雜癥,我們經常由于各種不明原因導致網絡不通。網絡故障可能是運營商或者鏈路問題,也有可能是本地故障,比如網卡配置錯誤等。解決網絡故障,通常需要掌握非常多的網絡知識,比如網絡協議、路由、NAT、網卡配置等。本文不在于細講這些知識,僅僅總結我在Linux操作系統(使用更多的當然是ubuntu系統)中著手解決網絡故障的過程和思路。注意,本文主要針對服務器,使用命令行進行網絡故障排除,沒有類似圖形界面network-manager工具。事實上,在ubuntu桌面版,我習慣把network-manager工具禁掉。
1.檢查網絡設備
要能連網,網絡設備首先必須保證處于工作狀態,如果網卡沒有開啟,則肯定不能上網的,假設我們使用eth0網卡上網,首先檢查該網卡是否處于up狀態,使用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狀態,若處于down狀態,嘗試手動啟動:
- sudo ip link set eth0 up
或者:
- sudo ifconfig eth0 up
手動啟動后,需要再次運行sudo ip link ls,如果仍然處于down狀態,則說明是網絡硬件問題,比如網線沒有連接好,或者鏈路不通等。如果大家都能上網,極有可能是由于網線接觸不良導致的,拔下網線重新插好,重復以上工作試試。
2.檢查IP地址
如果網卡已經處于up狀態,但仍無法上網,則需要查看網卡是否配置好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
以上說明網卡已經獲取了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
則說明該網卡沒有正確獲取IP。
如果沒有或者ip,就需要配置ip。如果是通過dhcp服務自動獲取ip的,則可手動運行dhclint獲取ip:
- sudo dhclient -4 -v eth0
如果無法獲取ip,且網卡處于up狀態,則可能是鏈路問題,無法連接遠程DHCP服務器。如果知道DHCP服務器地址,可以ping一下試試,比如DHCP服務器地址為192.168.1.1:
- ping 192.168.1.1
如果ICMP被禁了,使用nc命令或者telnet更適合,且可以探測端口是否開放,雖然DHCP端口是67,不過通常DHCP和DNS服務器是同一臺機器,因此順便測試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
如果服務器的IP不是通過DHCP獲取的動態IP,而是靜態IP,則需要手動設置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.配置網關和路由
如果網卡的IP已經配置正確(包括子網掩碼),仍然不能上網,則需要檢查能否ping通網關地址,通常網關地址為網絡地址的第一個ip或者最后一個ip,比如若ip為192.168.1.101/24,則網關通常為192.168.1.1或者192.168.1.254,如果不是二者,則需要詢問網管了。假設網關地址為192.168.1.1,ping一下是否通:
- ping 192.168.1.1
如果ping不通,則可能是交換機問題。如果網關連通性良好,則查看路由表是否正確,以下三個命令都可查看路由表,隨便使用一個:
- 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的是默認路由,檢查Gateway是否正確。不正確的話需要重新修改默認網關:
- sudo route del default eth0 # 先刪除錯誤的默認網關
- sudo route add default gw 172.16.0.1 dev eth1 # 填寫正確的網關
此時可以ping一下外網ip(指不在同一個局域網的IP),注意這里不要用域名,因為可能DNS還是有問題,比如可以ping我們校園網認證服務器IP:10.3.8.211:
- ping 10.3.8.211
如果不能連通外網,可以使用tracepath命令查看到底是哪一跳不通,不過我更喜歡mtr命令:
- mtr -n 8.8.8.8
輸出為:
其中host列是所有經過的跳(路由),可以查看哪個跳不通或者丟包嚴重。
4.域名解析
如果能夠ping通外網,但仍然不能使用瀏覽器上網,那八成是域名解析不了了,即DNS服務器配置有錯誤。檢查下:
- nslookup server
此時會輸出DNS服務器地址,檢查是否正確,若不正確或者不存在,可以臨時設置,修改/etc/resolve.conf文件,設置可用的DNS服務器,如果不知道本區的DNS服務器,可以設置通用的`8.8.8.8,可以同時設置多個DNS服務器:
- # /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
設置完成后,試一下能不能解析域名:
- nslookup baidu.com
如果能夠解析域名,則應該就可以正常上網了。
5.寫入配置文件
我們以上都是通過命令行的方式配置網絡,服務器重啟后,需要重新配置,如果需要保存狀態,需要寫到配置文件中去,以ubuntu為例,修改/etc/network/interfaces文件,如果是DHCP 動態ip,配置如下:
- # The primary network interface
- auto eth0 # 設置網卡開機啟動
- iface eth0 inet dhcp # 設置網卡動態獲取IP
如果是靜態IP,則配置如下:
- auto eth0
- iface eth0 inet static # 設為靜態獲取ip
- address 192.168.1.101 # 配置ip地址
- netmask 255.255.255.0 # 設置子網掩碼
- gateway 192.168.1.1 # 設置網關
- dns-nameservers 8.8.8.8 114.114.114.114 # 設置DNS服務器,多個地址空格隔開
總結
網絡通常是一個反反復復的棘手問題,除了以上提到的經典問題外,其他配置比如代理、防火墻、VPN、認證等,也有可能導致不能正常上網,務必配置正確,本文不再介紹。還有更棘手的比如mtu設置不正確(比如Openstack neutron使用gre隧道,注意設置mtu為1400)、病毒劫持等,遇到此類問題,可以試試tcpdump命令進行抓包分析。
【本文是51CTO專欄作者“付廣平”的原創文章,如需轉載請通過51CTO獲得聯系】