網卡丟包問題排查即路由添加刪除


ifconfig查詢結果解析

# 設置網卡最大傳輸單元
ifconfig eth0 mtu 1500

ethtool ens33  # 查看網卡是千兆還萬兆網卡
# 編輯網卡的傳輸單元:
ifconfig ens33 mtu 9000 # 命令行
或者:
	編輯/etc/rc.d/rc.loacal文件
		ifconfig ens33 mtu 9000
	chmod +x /etc/rc.d/rc.local


ifconfig eth0 promisc # 開啟混雜模式  在局域網內發送的數據包發現目標主機不是自己,會將這個包丟掉,但是開啟混雜模式,不管局域網內發的數據包是不是自己主機的,都會接收。通常在抓包的時候可以開啟
ifconfig eth0 -promisc  # 關閉混雜模式

ifconfig ens33 multicast
ifconfig ens33 -multicast #

ifconfig eth0 allmulti # 開啟
ifconfig eth0 -allmulti # 關閉

# 添加、刪除ipv6地址
ifconfig eth0 add 3ffe:3240:800
ifconfig eth0 del 3ffe:3240:800

解決網卡丟包問題

CRC:
CRC即循環冗余校驗碼(Cyclic Redundancy Check):是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,並將得到的結果附在幀的后面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性

# 網卡工作原理
網卡發包:
	1.ip包+14個字節的mac頭變成數據幀frame
	2.frame拷貝到網卡芯片內部的緩沖區,由網卡處理
	3.網卡芯片為frame添加頭部同步信息和CRC校驗,此時才是真正可以發送的packet,然后發送該packet
網卡收包:
	1.網絡包packet到達網卡,網卡先檢查包packet的CRC校驗,保證其完整性和正確性,然后去掉他的頭得到frame
	2.網卡將frame拷貝到網卡內部的FIFO緩沖區
	3.網卡驅動程序產生硬件中斷,把frame從網卡拷貝到內存中,接下來就交給內核處理
	
網卡丟包:
	內核通常需要快速的拷貝網絡數據包到系統內存
	因為網卡上接收網絡數據包的緩存大小固定,而且相比系統內存也要小得多。
	所以上述拷貝動作一旦被延遲,必然造成網卡FIFO緩存溢出,進入的數據包沾滿了網卡的緩存,后續的包只能被丟棄,這也應該就是ifcofing里的oberrun的來源。

ethtool -g ens33 # 查看收發包緩沖區大小
ethtool -G ens33 rx 2048  # 設定收發包緩沖區的大小
mii-tool ens33
	ens33: negotiated 1000baseT-FD flow-control, link ok
	
丟包問題解決:
	# 丟包排查
	網卡工作在數據鏈路層,數據量鏈路層會做一些校驗,封裝成幀,我們可以查看校驗是否出錯,確定傳輸是否存在問題,然后從軟件層面,是否因為緩沖區太小丟包。
	#1.先查看硬件情況
	一台機器經常收到丟包的報警,先看看最底層的有沒有問題:
	#1.1 查看工作模式是否正常
	ethtool ens33 | egrep 'Speed|Duplex'
		Speed:100Mb/s
		Duplex:Full
	#1.2查看CRC校驗是否正常
	ethtool -S ens33 | grep crc # crc錯誤值大通常是因為服務器外部的網絡環境有問題導致的
		rx_crc-errors:0
		-------Speed,Duplex,CRC之類的都沒問題,基本可以排除物理層面的干擾--------

路由管理

一台Linux主機能夠被當成路由器用的三大前提:
	1.至少由兩塊網卡分別連接兩個不同的網段
	2.開啟路由轉發功能
		echo 1> /proc/sys/net/ipv4/ip_forward
	3.在Linux主機上添加正確的路由規則/策略
		route

其他主機若想要撒謊給你書Linux主機幫自己轉發數據包,必須將自己的gw指定成上述linux主機的ip

網關/路由

Linux上分為3中路由:

主機路由:掩碼位32位,Destination精確到某一台主機,所以主機路由是直接指明到某台主機怎么走,主機路由也就是所謂的靜態路由
網絡路由:掩碼小於32位,Destination精確到某一個網段的主機,所以網絡路由知名到某類網絡怎么走
默認路由:掩碼通常位0,不走主機路由的和網絡路由的、全部都走默認路由。操作系統上設置的默認路由一般也成為網關。

路由時卻分優先級的:若Linux上到某主機由多條路由可以選擇,這時候會挑選優先級高的路由
	大前提:
	主機范圍越小、越精確、優先級越高,而縮小主機范圍的恰恰就是子網掩碼,掩碼越長范圍越小,越精確、優先級越高
	
	優先級區分:
	# 1.在Linux中,路由條目的優先級確定方式是先匹配掩碼位長度,掩碼越長的優先級越高
	也就是說,掩碼為長的路由條目優先級一定比掩碼位短的優先級高,所以主機路由的優先級最高,然后是直連網絡(即同網段)的路由(也算是網絡路由)次之,再是網絡路由,最后才是默認路由即網關。
	# 2.若路由條目的掩碼長度相同,則比較節點之間的管理距離(比如metric),管理距離短的 生效。

eg:在本機上查看到的路由表如下:

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    100    0        0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33

對於Flags列,如果沒有安裝路由軟件,則只可能出現下面的3中值:
	U(route is up)
	H (target is a host)
	G (use gateway,也即是設置了下一跳的路由條目)
	Iface 從那塊網卡出去
	若要管理路由表,則使用add或del選項。
		route [add/del] [-host/-net/default] [address[/mask]] [netmask] [gw] [dev]
		選項說明:
		add/del:增加或刪除路由條目
		-net:增加或刪除的是一條網絡路由
		-host:增加或刪除的是一條主機路由
		default:增加或刪除的是一條默認路由
		netmask:明確使用netmask關鍵字指定掩碼,要可以不使用該選項直接在地址上使用cidr格式的掩碼,即IP/MASK.
		gw:指定嚇一跳的地址,要求嚇一跳地址必須是能到達的,且一般是和本網段直連的接口。
		dev:強制將路由條目關聯到指定的接口上。一般內核會自動判斷路由條目應該關聯到哪個網絡接口。
		
		# route 命令添加的多少臨時生效

(1)添加和刪除默認路由
route add default gw 192.168.100.10
route add -net 0.0.0.0/0 gw 網關地址 # 同上

route del default
route del default gw 192.168.100.10 # 若有多條默認路由,則再加上gw即可唯一刪除指定條目

因為默認路由的目的地是0.0.0.0,所以操作默認路由也可以使用0.0.0.0替代default關鍵字,但這樣就麻煩的多了,還是用default會簡單一點。
(2)添加和刪除網絡路由
route add -net 172.16.10.0/24 gw 192.168.100.70
route add -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70

若是在不知道嚇一跳是誰,那么指定本機接口也是可以的。
route add -net 172.16.10.0/24 dev eth0
route add -net 2.2.2.0/24 dev ens33
route add -net 0.0.0.0/0 gw 192.168.1.1

route del 2.2.2.0/24
刪除路由可以直接在增加路由的語句上將add改為del關鍵字。如:


(2)添加和刪除主機路由
route add -host 1.1.1.10/32 dev ens33
route del -host 1.1.1.10/32 # 不需要指定網卡設別

配置永久路由

根據接口創建路由配置文件/etc/sysconfig/network-scripts/route-ethX,要從哪個皆苦出去X就是幾。
路由配置文件的配置格式非常簡單,每一行一個路由條目,先是要到達的目標,然后是via關鍵字,最后是嚇一跳地址。喲啊求下一跳必須能到達,且一般都和ethX同網段。

格式:
DEST via nexthop

例如eth0網卡的IP地址是192.168.10.123,要通過網卡eth0出去到達10.0.0.10,那么下一跳的地址要和eth0的地址在同網段,如192.168.10.222.

10.0.0.0 via 192.168.10.222

添加主機路由、默認路由、網段路由示例如下,其中dev是可以省略的,因為沒有任何用處,配置在哪個eth文件中就會從哪個接口出去。

# 默認路由
default		via	192.168.100.1
1.1.
0.0.0.0/0	via	192.168.100.1

# 網段路由
192.168.10.0/24	via	192.168.100.1

# 主機路由
192.168.100.52/32	via	192.168.100.33	dev	eth1

配置完成后,重啟network服務即可立即生效。
route-ethX文件的還有另外一種永久路由的配置寫法,但上面的方法更簡單快捷,所以此處就不多說

配置永久路由時,需要注意幾點:
(1)route-ethX的對應網卡配置文件ifcfg-ethX必須存在,否則路由無效(注意:對於虛擬機,通常新添加的網卡都沒有對應的ifcfg-ethX文件,但ifconfig卻能找到該網卡)
(2)如果在文件中配置永久默認路由,則必須保證所有使用了DHCP服務的網卡配置文件ifcfg-ethX中的DEFROUTE指令設置為“no”,表示DHCP不設置默認路由。
(3)如果route-ethX文件中配置永久路由,且該網卡使用了DHCP服務分配地址,則必須保證該網卡的ifcfg-ethX文件中的PEERROUTES指令設置為“no”,表示DHCP設置的路由允許被覆蓋。


setenforce 0  # 關閉防火牆
iptables _F # 清空路由表

詳見此文:路由詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM