網絡問題剖析
謝藝華 2019-10-10
1.背景
同事在工作中出現了一個網絡問題,其網絡拓撲如下圖:
圖1.網絡拓撲圖
其異常現象如下:
- 服務器不能訪問外網,但能ping通路由器。
- 外網不能訪問服務器(路由器上已經做好了相關的端口映射)。
據同事的解決方式是:先把eno1和eno2兩個網口拔掉,先插eno1,再插eno2。的確,這麼操作之後,服務器就可以正常連接外網了,並且也可以通過外網訪問服務器了。至於原因,還不是很清楚。
2.知其然知其所以然
通過排查,發現異常和正常情況下,服務器的路由表如下:
圖2 : 異常路由表
圖3:正常路由表
其實通過對比,我們就知道大致問題了。很容易聯想到網關的問題。
2.1 route命令解析
route命令輸出的路由表字段含義如下:
Destination 目標網絡或目標主機(本機的數據要發送的目的地:子網或主機),與Genmask組成一個網段。
Gateway 網關(如果是默認網關,網關的地址必須和自己的主機上的其中一塊網卡在同一子網)即網關地址。如果沒有就顯示星號。
Genmask 網絡掩碼,如果目標網絡的的子網掩碼爲255.255.255.255,說明目標是一臺主機;如果子網掩碼爲'0.0.0.0' 說明該路由是默認路由。
Flags(旗標)
代表的意義如下:
U (route is up):該路由是啓動的;
H (target is a host):目標是一部主機 (IP) 而非網段;
G (use gateway):需要透過外部的主機 (gateway) 來轉遞封包(該行有gw);
R (reinstate route for dynamic routing):使用動態路由時,恢復路由資訊的旗標;
D (dynamically installed by daemon or redirect):已經由服務或轉 port 功能設定爲動態路由
M (modified from routing daemon or redirect):路由已經被修改;
! (reject route):這個路由將不會被接受(用來抵擋不安全的網域!)
A (installed by addrconf)
C (cache entry)
Metric 距離、跳數。與目標的“距離”(通常以跳數計算)。它不被最近的內核使用,但可能需要路由守護進程。
Ref 不用管,恆爲0, 對這條路線的引用次數(Linux內核已不再使用)。
Use 該路由被使用的次數,可以粗略估計通向指定網絡地址的網絡流量。 路線查詢次數。根據-F和-C的使用,這將是路由高速緩存丟失(-F)或命中(-C)。
Iface 接口,即eth0,eth1等網絡接口名,爲此路由發送數據包的接口。
通過以上的分析,我們就能大概知道爲什麼先插eno1就可以正常聯網了。因爲eno1的Metric值較小,優先選擇了eno1接口的網關。
-
- 路由選擇
在四層協議系統中,我們知道正常的上網過程,都會經過網絡層,其中路由選擇就是數據包走向的依據。主要有三點:
- 搜索路由表,尋找能與目標IP地址完全相同的標目,如果找到,將數據傳給這個接口
- 搜索路由表,尋找到目標網絡號相同的標目,如果找到就將報文發給該標目指定的下一站路由或接口
- 搜索路由表,尋找標爲默認的標目。如果找到就將該報文發送給指定下一站路由
- 如果以上都沒有匹配到,則丟棄該報文。
通過以上的路由選擇可知,我們可知,eno1和eno2都是默認標目,會優先選擇metric值較小的接口,進行轉發報文。
-
- 解決方式
通過上述的分析,我們可以在服務器上添加一個默認路由:
route add defualte gw 192.168.18.1
之後的路由表如圖:
圖4: 路由表
有圖可知,路由表中多了一個默認網關項,且Metric值爲0。該方法只是臨時有效,設備重啓就會失效。可以
echo "route add defualte gw 192.168.18.1" >> /etc/rc.local
永久生效
3.問題
在排查問題的過程中,遇到了一些有趣的現象,當然也可以通過上述的知識點解釋通。但是我覺得有興趣的同事還是可以思考一下。其路由表如圖:
圖5:異常的路由表項
eno1:
ip: 192.168.18.150
netmask: 255.255.0.0
Gateway: 192.168.18.1
DNS: 192.168.18.1
eno2:
ip:192.168.10.1
netmask: 255.255.255.0
gateway:192.168.10.1
DNS:114.114.114.114
3.1 服務器端能夠ping通路由器,卻不能訪問外網?
3.2 服務器端 ping www.baidu.com 能夠獲取域名的IP,卻無法ping通?