雙網卡-網絡問題

網絡問題剖析

謝藝華 2019-10-10

1.背景

同事在工作中出現了一個網絡問題,其網絡拓撲如下圖:

                                                                                      圖1.網絡拓撲圖

 

 

其異常現象如下:

  1. 服務器不能訪問外網,但能ping通路由器。
  2. 外網不能訪問服務器(路由器上已經做好了相關的端口映射)。

 

據同事的解決方式是:先把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接口的網關

 

    1. 路由選擇

在四層協議系統中,我們知道正常的上網過程,都會經過網絡層,其中路由選擇就是數據包走向的依據。主要有三點:

  1. 搜索路由表,尋找能與目標IP地址完全相同的標目,如果找到,將數據傳給這個接口
  2. 搜索路由表,尋找到目標網絡號相同的標目,如果找到就將報文發給該標目指定的下一站路由或接口
  3. 搜索路由表,尋找標爲默認的標目。如果找到就將該報文發送給指定下一站路由
  4. 如果以上都沒有匹配到,則丟棄該報文。

 

通過以上的路由選擇可知,我們可知,eno1和eno2都是默認標目,會優先選擇metric值較小的接口,進行轉發報文。

 

 

    1. 解決方式

通過上述的分析,我們可以在服務器上添加一個默認路由:

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通?

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章