CIP:192.168.10.193
VIP:192.168.10.152:8000
DIP:100.10.8.152:8000
RIP:100.10.8.101:8000 和 100.10.8.102:8000
從CIP到RIP的TCP連接,總是超時。
在Director上看到,lvs已經把來着client的消息轉發,但狀態是SYN_RECV
===================
# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:58 SYN_RECV 192.168.10.193:45346 192.168.10.152:8000 100.10.8.102:8000
==================
抓包分析一下:
在realserver抓包,看到realserver已經收到了director轉發的syn,而且在第一時間返回了syn ack。這是沒有問題的。

在client抓包,看到client收到了syn ack,但是地址卻是RIP。按照LVS-NAT的原理,在經過director之后,應該把RIP轉換為VIP才對。

所以clinet雖然收到了syn ack,但無法和之前發送給VIP的syn配對起來,因此client一直處在等待VIP回復syn ack的狀態。
之后檢查了網絡,發現從RIP到CIP存在多條路由,syn ack沒有經過director就路由到了CIP。
解決方案:刪除多條路由,將dip作為realserver的網關。
完成上述操作之后,發現lvs狀態仍然是SYN_RECV。抓包后的pcap文件中,沒有syn ack。於是想到是不是在什么地方丟掉了。
看到官方文檔中有描述要設置re_ filter。
查了一下這個參數的解釋
======================================
rp_filter參數有三個值,0、1、2,具體含義:
- 0:不開啟源地址校驗。
- 1:開啟嚴格的反向路徑校驗。對每個進來的數據包,校驗其反向路徑是否是最佳路徑。如果反向路徑不是最佳路徑,則直接丟棄該數據包。
- 2:開啟松散的反向路徑校驗。對每個進來的數據包,校驗其源地址是否可達,即反向路徑是否能通(通過任意網口),如果反向路徑不同,則直接丟棄該數據包。
=======================================
default的值是1,這里改為2
echo 2 > /proc/sys/net/ipv4/conf/ 網卡名/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/ 網卡名/rp_filter
systemctl restart network.service
再次嘗試,succeed
