程序員應該掌握的常用網絡問題定位工具
項目日常運維的過程中,經常會遇到各種奇奇怪怪的網絡問題。那么排查網絡問題,就成為一個合格的程序員必備技能。這里列舉出一些常用的指令,用于日常工作中快速定位網絡問題。
ping
這個是大家經常用到的一個小工具,用于檢查兩臺服務器之間是否能夠成功交換數據包。 ping
指令向對方主機發送 ICMP
報文。當能成功 ping
通時表示兩臺主機之間的網絡鏈路是暢通的。如果 ping
不通,首先需要確認對方是否關停了 ping
服務,如果沒有關停,就需要檢查雙方的網絡鏈接問題了。
telnet
該指令主要用于檢查到對方端口的網絡聯通性,如果 telnet
能通,一般證明 TCP
三次握手已經建立成功,也就是網絡層是暢通的。如果 telnet
不通,需要確認對方是否已經啟動相應服務端口,如果已啟動,那么就要檢查雙方的防火墻策略等問題。
ifconfig
ifconfig
指令除了可以查看網卡信息外,還可以修改網絡配置。比如查看網卡信息 ifconfig -a
;啟動網卡 ifconfig eth0 up
;關停網卡 ifconfig eth0 down
等操作。
除了使用 ifconfig
查看及配置網卡信息外,還可以通過 ip link show
查看網卡信息,啟動網卡信息 ip link set down eth0
; 關停網卡 ip link set up eth1
等操作。
注意:啟動關停網卡在 SSH
鏈接的情況下,盡量不要操作。
route
route
指令一般用于查看和配置服務器路由信息。比如查看路由信息 route -n
或者 route -nee
添加或者刪除路由信息 route {add | del } -net {NETWORK-ADDRESS} netmask {NETMASK} dev {INTERFACE-NAME}
等等。
同樣,除了使用 route
指令外也可以使用 ip route show
查看路由信息;和 route -n
是等效的。這里更推薦使用 ip route
命令。
traceroute
該指令用于查看從源地址到目的地址的路由路徑。比如 traceroute www.baidu.com
用于判斷你和目標地址之間經過了哪些網絡設備。 windows
下是 tracert
netstat
這個指令比較強大,也是程序員日常用的比較多的一個指令。該指令可以顯示服務器的網絡狀態,比如,顯示服務器當前所有 socket
鏈接 netstat -a
; 顯示 UDP/TCP
端口的使用情況 netstat -apu/netstat -apt
; 顯示網絡統計信息 netstat -s
; 查看 8080
端口的狀態 netstat -anp|grep 8080
。
和 netstat
等價的指令是 ss
指令。 ss -l
列出所有本機已經打開的端口。 ss -t/u -a
顯示所有 tcp/udp
鏈接。查看某個鏈接屬于哪個進程 ss -tp
。查看本地的端口狀態 ss -t src ip:8080
。這里更推薦使用 ss
指令。
tcpdump
網絡抓包工具,當遇到奇怪的網絡問題時,通過 tcpdump
進行網絡抓包,然后進行分析定位問題。根據源IP進行抓包 tcpdump -i eth2 src 192.168.199.100
即只抓取通過 eth2
這塊網卡的且源地址為 192.168.199.100
的網絡包。當然也可以指定端口抓包,比如 tcpdump src port 8088
。總之該命令非常強大,這里不做更多的詳細介紹,感興趣的可以自行了解。
nmap
這是一個網絡嗅探和掃描工具,做網絡安全的小伙伴會比較熟悉。經常用來檢查對方主機開放了哪些端口。比如查看對方主機開放了哪些端口 nmap -PS 192.168.199.100
,還可以探測目標IP的操作系統 nmap -O 192.168.199.100
。總之該命令做網絡安全的會用的比較多,程序員使用的會比較少一些,感興趣的可以深入研究,該指令及其強大。
總結
上面提到的小工具,對于有些問題的定位,可以通過兩個不同的指令達到同樣的效果。比如 ifconfig -a
和 ip link show
; route -n
和 ip route show
;以及 netstat
和 ss
。出現這樣的情況是因為, ifconfig
和 netstat
等命令來自于 net-tools
工具包,而 ip link
和 ss
等指令來自 iproute2
工具包。 net-tools
已經停止開發了,在很多新版的操作系統里面已經不是默認自帶的工具包了,如果想使用需要單獨安裝。 iproute2
是用來替換 net-tools
的,很多新版 linux
都是默認安裝的。而且 iproute2
包中的很多指令在功能和性能上都要比 net-tools
包中提供的指令更強大。我這里從網上找了一張圖片用來說明倆個工具包的指令對比。