問題現象
在多網卡或複雜的網路路由環境(如使用 LVS 負載平衡、Overlay 網路、非對稱路由情境)中,系統出現以下異常:
服務訪問異常:通過負載平衡(SLB)訪問後端伺服器時,出現健全狀態檢查失敗或業務訪問不通的情況,但直接登入並訪問後端伺服器的服務連接埠卻是正常的。
網路連接逾時:在多網卡或配置了策略路由的ECS執行個體上,部分方向的網路連接出現偶發性逾時或完全不通。
系統存在丟包:通過
tcpdump等工具抓包,可以觀察到資料報文已進入網卡,但上層應用程式無法接收到資料。
問題原因
該問題通常由rp_filter核心參數的strict 模式(值為1)與非對稱路由(Asymmetric Routing)網路環境並存導致。非對稱路由指資料報文的往返路徑不一致。當系統開啟rp_filterstrict 模式時,核心會對接收到的每個資料包進行反向路由驗證,如果資料包的入口網卡不是系統路由表中的最優出口,該資料包將被丟棄。
原因一:多網卡或策略路由導致的非對稱路由:在擁有多個網卡的ECS執行個體中,如果配置了策略路由,可能導致一個資料包從
eth0網卡進入,但其響應包根據路由策略需要從eth1網卡發出。此時,strict 模式的rp_filter會認為該資料包路徑非法而將其丟棄。原因二:負載平衡(LVS-DR模式)導致的非對稱路由:使用阿里雲負載平衡(如CLB)的四層監聽(TCP/UDP協議)時,其後端伺服器預設採用DR(Direct Routing)模式。在該模式下,用戶端請求報文經由LVS到達後端ECS,但ECS的響應報文會繞過LVS直接返回給用戶端。這對ECS來說是典型的非對稱路由,如果ECS開啟了
rp_filterstrict 模式,就會丟棄來自LVS的請求報文。
解決方案
方式一:設定為寬鬆模式(推薦)
將rp_filter設定為寬鬆模式(值為2)。核心僅檢查源IP地址是否存在於路由表中並且可達,而不強制要求入口網卡為最佳出口,適用於所有非對稱路由情境。
臨時修改核心參數以立即生效。
# 將所有網卡的rp_filter模式設定為寬鬆模式 echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter echo 2 > /proc/sys/net/ipv4/conf/default/rp_filter測試業務是否恢複正常。如果問題解決,請繼續下一步將其永久化。
編輯
/etc/sysctl.conf檔案,添加或修改以下配置,使其在系統重啟後依然生效。# 編輯設定檔 vi /etc/sysctl.conf # 添加或修改以下兩行 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2執行
sysctl -p命令使永久配置生效。sudo sysctl -p
方式二:關閉指定網卡的驗證
如果只有特定的網卡(例如eth0)接收來自LVS的流量,可以選擇僅關閉該網卡的反向路由驗證。
臨時關閉
eth0網卡的rp_filter。echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter測試業務是否恢複正常。如果問題解決,請繼續下一步將其永久化。
編輯
/etc/sysctl.conf檔案,添加或修改以下配置。# 編輯設定檔 vi /etc/sysctl.conf # 添加或修改以下行 net.ipv4.conf.eth0.rp_filter = 0執行
sysctl -p命令使永久配置生效。sudo sysctl -p
方式三:全域關閉驗證
此方式將完全禁用反向路由驗證,會使系統面臨IP欺騙攻擊的風險。
臨時修改核心參數。
# 警告:此操作會降低系統安全性,請謹慎使用 echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter測試業務是否恢複正常。如果問題解決,請繼續下一步將其永久化。
編輯
/etc/sysctl.conf檔案,添加或修改以下配置。# 編輯設定檔 vi /etc/sysctl.conf # 警告:以下配置會使伺服器面臨IP欺騙攻擊的風險 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0執行
sysctl -p命令使永久配置生效。sudo sysctl -p
後續建議
遵循最小許可權原則:在調整rp_filter參數時,優先選擇影響範圍最小的方案。例如,使用寬鬆模式(rp_filter=2)優於完全關閉(rp_filter=0),修改單個網卡配置優於修改全域配置。