LVS系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. 使用ipvsadm 1.1 安裝ipvsadm 1.2 ipvsadm語法2.實現VS/NAT模式的負載均衡3 VS/DR模式的數據包流向分析4.實現VS/DR模式的負 ...
LVS系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
本文目錄:
1. 使用ipvsadm
1.1 安裝ipvsadm
1.2 ipvsadm語法
2.實現VS/NAT模式的負載均衡
3 VS/DR模式的數據包流向分析
4.實現VS/DR模式的負載均衡(CIP、VIP、RIP同網段)
5.實現VS/DR模式的負載均衡(CIP、VIP、RIP不同網段)
5.1 CIP、RIP不同網段時為何特殊?
5.2 反向路徑過濾rp_filter參數的作用
5.3 實現VS/DR模式的負載均衡(CIP、RIP不同網段)
1.使用ipvsadm
ipvsadm是ipvs的命令行管理工具,可以定義、刪除、查看virtual service和Real Server的屬性。
1.1 安裝ipvsadm
可以直接yum安裝。以下是編譯安裝ipvsadm的過程,對於內核版本2.6.xx,需要安裝的ipvsadm版本要大於1.24。
# 下載ipvsadm
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz -P /tmp
cd /tmp
# 安裝依賴包
yum -y install libnl* popt*
# 安裝ipvsadm,註意不需要./configure
tar xf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make && make install
編譯安裝完之後,會在/etc/init.d/ (CentOS6)或/usr/lib/systemd/system/ (CentOS7)目錄下自動生成ipvsadm服務管理腳本,這和一般的編譯不一樣,比較人性化。
安裝ipvsadm後,生成以下文件。
[root@xuexi ~]# rpm -ql ipvsadm
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm # ipvs規則管理工具
/usr/sbin/ipvsadm-restore # ipvs規則恢復工具
/usr/sbin/ipvsadm-save # ipvs規則保存工具
/usr/share/doc/ipvsadm-1.27
/usr/share/doc/ipvsadm-1.27/README
/usr/share/man/man8/ipvsadm-restore.8.gz
/usr/share/man/man8/ipvsadm-save.8.gz
/usr/share/man/man8/ipvsadm.8.gz
1.2 ipvsadm語法
使用ipvsadm --help
可以查看使用方法。ipvs的更多功能以及ipvsadm的更詳細用法,請man ipvsadm
ipvsadm的選項中,大寫選項管理虛擬服務virtual service,小寫選項管理關聯了虛擬服務的真實伺服器RealServer,"-L"和"-l"除外,它們同義。
(1).管理virtual services:
添加:-A -t|u|f service-address [-s scheduler]
-t:tcp協議的集群
-u:udp協議的集群
service-address格式為IP:PORT
-f:firewall-mark防火牆標記
service-address:a num for mark
-s:調度演算法
修改:-E -t|u|f service-address [-s scheduler] 和-A使用方法一樣
刪除:-D -t|u|f service-address
示例:
# ipvsadm -A -t 172.16.10.20:80 -s rr (對外的地址,也就是VIP)
(2).管理virtual service中的RealServer:
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:指定Real server所綁定的virtual service
-r server-address:某RS地址,在NAT模型中,可IP:PORT實現埠映射,即埠無需等於VIP對應的port
-g|i|m:指定lvs的類型,有三種:
-g:gataway即DR類型(預設的模型)
-i:--ipip,即TUN類型
-m:masquerade地址偽裝即NAT
-w:指定權重(需要調度演算法支持權重)
修改:-e和-a用法一樣
刪除:-d -t|u|f service-address -r server-address表示從哪個virtual service中刪除哪個realserver
示例:
# ipvsadm -a -t 172.16.10.20:80 -r 192.168.100.9 -m
# ipvsadm -a -t 172.16.10.20:80 -r 192.168.100.10 -m
(3).查看:
-L或者-l:列出狀態信息,配合以下選項用於顯示更精確數據
-n:只顯示數字格式,不反解IP地址和埠
--stats:顯示統計信息
--rate:顯示速率信息(每秒的值)
--timeout:顯示tcp/tcpfin/udp的會話超時時間長度
--daemon:顯示進程狀態和多播埠(不太用)
--sort:對-n列出來的進行排序(按協議、IP、埠號升序排序)
-c:顯示當前ipvs的連接狀況(不能和stats選項同用)
(4).其他項:
-Z:清空統計數據
-C:刪除一個或所有virtual service,連同與之綁定的real server也刪除
-S:保存規則 ipvsadm -S > /path/to/somefile 或者使用ipvsadm-save > /path/to/somefile
-R:載入規則 ipvsadm -R < /path/to/somefile 或者使用ipvsadm-restore < /path/to/somefile
service ipvsadm save
service ipvsadm restore
2.實現VS/NAT模式的負載均衡
實驗環境如下:
其中:
CIP:172.16.10.22
VIP:172.16.10.21
DIP:192.168.100.17
RIP1:192.168.100.39
RIP2:192.168.100.23
在開始操作前,先回顧下VS/NAT模式的相關內容:
請求過程:CIP-->VIP--ip_forward-->DIP-->RIP
響應過程:RIP-->DIP--ip_forward-->VIP-->CIP
由於director接收到CIP發送的數據包後,需要轉發給Real Server進行處理,但Real Server的RIP和DIP是同一網段的,因此Director必須將VIP介面上收到的數據包轉發給DIP,也就是說Director需要開啟ip_forward功能。
當RS處理完成後,響應數據需要先轉發給Director,但因為響應數據的目標地址為CIP,因此需要將RS的網關指向Director的DIP,這樣CIP目的的數據包才能保證交給director進行處理並返回給客戶端。
因此,如下操作Director:假設該實驗中的VS/NAT採用wrr調度演算法。
echo 1 >/proc/sys/net/ipv4/ip_forward
ipvsadm -A -t 172.16.10.21:80 -s wrr
ipvsadm -a -t 172.16.10.21:80 -r 192.168.100.39 -m -w 2
ipvsadm -a -t 172.16.10.21:80 -r 192.168.100.23 -m -w 3
如下操作各RS:
yum -y install httpd
echo "from RS1:192.168.100.39" >/var/www/html/index.html # 在RS1上操作
echo "from RS2:192.168.100.23" >/var/www/html/index.html # 在RS2上操作
service httpd start
route add default gw 192.168.100.17
然後在客戶端Win2003上的瀏覽器上輸入http://172.16.10.21
進行測試,同時測試調度演算法的比例。可以使用下麵的命令查看統計數據:
[root@xuexi ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.10.21:80 wrr
-> 192.168.100.23:80 Masq 3 0 0
-> 192.168.100.39:80 Masq 2 0 0
[root@xuexi ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 172.16.10.21:80 25 113 95 10293 8913
-> 192.168.100.23:80 15 67 55 6059 4921
-> 192.168.100.39:80 10 46 40 4234 3992
註意點:
(1).建議不要使用win7/win8/win10作為客戶端進行測試,而是使用win server類系統或直接使用unix系統測試。
(2).調度演算法是對連接進行調度,而不是對數據包、位元組等調度,因此查看統計數據時,應該比較的是Conns列的比例。另外,如果連接數大致滿足比例,但數據包或者位元組數卻遠不符合比例(高的多或低的多),那麼可能對應的那台RS主機性能比其它RS的性能要好或差。
實驗完成後,刪除Director上的virtual service,並重新設置RS上的預設路由。
ipvsadm -C
route del default gw 192.168.100.17 # 在RS1和RS2上操作
3.VS/DR模式的數據包流向分析
如圖:
在分析數據包流向前,需要釐清一個容易產生疑惑的要點:在VS/DR模式下,TCP連接是客戶端和RS之間建立的,Director只是負責改造、轉發建立TCP連接時的數據包給後端RealServer;當TCP連接建立完成後,就有了客戶端和服務端(RS)的概念,這時客戶端將直接和RS進行數據通信,而Director已經退出舞臺,不再負責改造、轉發請求數據包。也就是說,Director改造、轉發的數據包只有客戶端第一次發送的syn包,其它數據包和它無關。可以想象,這樣的Director相比NAT模式,性能高的不是一點點。
- (1).當客戶端發起
http://VIP
的請求時,數據包的源和目標地址為CIP-->VIP
。這個數據包最終會到達Director。 - (2).當Director收到請求數據包後,將根據調度演算法選擇一臺後端RealServer作為調度的目標。於是修改數據包的目標MAC地址為該RealServer的RIP所在MAC地址。數據包將轉發給該RS,此時數據包的源和目標IP地址仍然為
CIP-->VIP
,但源和目標MAC地址為DIP_MAC-->RIP_MAC
。- 需要註意的是,Director要將數據包交給RS,需要從VIP介面轉發給DIP介面,因此Director需要開啟ip_forward功能。但如果VIP和DIP/RIP處於同一個網段,則無需開啟該轉發功能,因為VIP介面可以直接和RIP介面通信,這時DIP沒有存在的必要。
- (3).被調度到的RS收到Director轉發的數據包後,發現目標IP地址已經配置在自身內核,因此會收下該數據包。之後會處理請求,並構建響應數據。
- (4).RS將響應數據響應給客戶端,該響應數據包的源和目標IP地址為
VIP-->CIP
。- 由於RS上的VIP一般配置在lo的別名介面上,它無法和外界直接通信,因此數據包最終會從普通網卡上流出,如RIP所在介面。根據TCP/IP協議,響應數據包的源MAC地址也將是普通網卡(如RIP所在介面)的MAC地址。這一細節在後面配置CIP、VIP、RIP不同網段時會引出一種特殊問題,詳情見後文。
4.實現VS/DR模式的負載均衡(CIP、VIP、RIP同網段)
CIP、VIP和RIP同網段時,配置非常簡單,幾乎無需考慮額外的路由問題,也都無需分析數據包流向問題。
實驗環境如下:
其中:
CIP:192.168.100.46
VIP:192.168.100.11
DIP:192.168.100.17(由於VIP和RIP同網段,因此它是多餘的)
RIP1:192.168.100.47
RIP2:192.168.100.23
配置過程:
如下操作各RS:
# (1).提供web服務和測試頁面
yum -y install httpd
echo "from RS1:192.168.100.47" >/var/www/html/index.html # 在RS1上操作
echo "from RS2:192.168.100.23" >/var/www/html/index.html # 在RS2上操作
service httpd start
# (2).設置arp參數
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
# (3).設置VIP
ifconfig lo:0 192.168.100.11/32 up
route add -host 192.168.100.11 dev lo:0
如下操作Director:由於VIP和RIP同網段,因此無需開啟ip_forward
ipvsadm -C
ipvsadm -A -t 192.168.100.11:80 -s wrr
ipvsadm -a -t 192.168.100.11:80 -r 192.168.100.47:80 -g -w 2
ipvsadm -a -t 192.168.100.11:80 -r 192.168.100.23:80 -g -w 1
測試時,建議不要使用win7/win8/win10作為客戶端,而是使用win server類系統或直接使用unix系統測試。
5.實現VS/DR模式的負載均衡(CIP、VIP、RIP不同網段)
5.1 CIP、RIP不同網段時為何特殊?
考慮實際的生產環境,由於公網地址有限,一般只給web server的負載均衡系統分配一個公網地址。這個公網地址可能直接分配給VIP,這樣CIP、VIP、RIP兩兩都處於不同網段;還可能分配給路由器或防火牆,然後VIP和RIP都是用私網地址,這樣VIP/RIP同網段,但它們和CIP不同網段。
不管公網地址分配給誰,CIP、RIP總是不同網段的。這時需要考慮以下幾個問題:
- RS將響應數據響應給客戶端,該響應數據包的源和目標IP地址為
VIP-->CIP
,但因為是從RIP所在網卡流出的,這個響應數據包的源MAC地址為MAC_RIP; - 由於RIP和CIP不同網段,因此RS需要藉助某個路由設備來轉發這個數據包;
- 由於RS上的VIP被隱藏,DIP/RIP所在網段的所有主機(包括這個路由設備)上緩存的關於VIP的arp記錄都是Director上的(即
VIP<-->MAC_V
),即使重新發起arp請求,也只能獲取到這樣的對應關係。因此,響應數據包的源IP、源MAC的對應關係和路由設備arp緩存中記錄不一致,這個響應數據包是"非法"數據包。就像同宿舍的人都知道你和你的身份證號碼,但如果有一個人拿著你的身份證去找你的舍友辦事,他肯定知道這個人是冒充的; - 這個路由設備發現數據包的源MAC地址、源IP和它arp緩存中的記錄不一致,它會丟棄這個數據包嗎?分三種情況:
- (1).如果這個數據包的目標IP就是自身的,它會收下這個數據包並處理。當RIP和Client的某個網卡同網段時,就是這種情況,此時Client就是最終的路由目標。
- (2).如果這個數據包被路由到普通的路由設備上,路由設備預設會將這個數據包丟棄,因為會檢查源地址。這稱為"reverse path filter"(反向路徑過濾)功能。Linux上控制該功能的參數為rp_filter。
- (3).如果這個數據包被路由到Director所在主機(Linux)上,預設會丟棄這個數據包,因為源IP地址正好在本機上。但可以為內核打上forward_shared補丁,以便使用forward_shared和rp_filter參數來開啟轉發源IP地址為自身地址數據包的功能。轉發時,需要設置轉發介面為VIP所在介面,這樣數據包的源MAC地址和VIP相互對應,之後的路由過程會一路順暢。
根據第四點的三種情況,RS上的路由表可以按需設置成三種情況。當然,第一種情況在實際環境中是不可能的。第二種情況設置很簡單,但路由設備關閉源IP地址檢查功能後,將更容易受到DDos攻擊。第三種情況可以忽略,不僅要重新編譯內核,更重要的是VS/DR模式的優點本就在於讓Director專註於調度工作來實現高性能。
因此,本文將以第二種情況來做實驗測試。第三種情況可參考網上一篇博文:LVS-DR VIP和RIP不同網段的配置方法。
5.2 反向路徑過濾rp_filter參數的作用
以下是Linux內核文檔中關於rp_filter變數的描述:
rp_filter - INTEGER
0 - No source validation.
1 - Strict mode as defined in RFC3704 Strict Reverse Path
Each incoming packet is tested against the FIB and if the interface
is not the best reverse path the packet check will fail.
By default failed packets are discarded.
2 - Loose mode as defined in RFC3704 Loose Reverse Path
Each incoming packet's source address is also tested against the FIB
and if the source address is not reachable via any interface
the packet check will fail.
Current recommended practice in RFC3704 is to enable strict mode
to prevent IP spoofing from DDos attacks. If using asymmetric routing
or other complicated routing, then loose mode is recommended.
The max value from conf/{all,interface}/rp_filter is used
when doing source validation on the {interface}.
Default value is 0. Note that some distributions enable it
in startup scripts.
大致說明下:rp_filter參數有三個值,0、1、2,Linux上預設為1。
- 0:不開啟源地址校驗。
- 1:開啟嚴格的反向路徑校驗。對每個進來的數據包,校驗其反向路徑是否是最佳路徑。如果反向路徑不是最佳路徑,則直接丟棄該數據包。
- 2:開啟鬆散的反向路徑校驗。對每個進來的數據包,校驗其源地址是否可達,即反向路徑是否能通(通過任意網口),如果反向路徑不通,則直接丟棄該數據包。這個值是只是為了防止轉發無效或冒充的源IP地址,如192.16.10這樣的不完整IP。
- 取/proc/sys/net/ipv4/conf/{all,interface}/rp_filter中的最大值生效。註意,對lo介面設置該參數是無意義的。
對於CIP、RIP不同網段的VS/DR模式來說,當RS將響應數據包(ack+syn)交給Linux路由設備,數據包源IP是VIP,源MAC地址是RIP_MAC。Linux充當路由設備時:
如果設置rp_filter=1(預設),會反向檢查源IP是否是最佳路徑。顯然,由於Linux Router上只能獲取到Director上的VIP<-->MAC_VIP
arp緩存記錄,因此反向檢查時總是查找到Director上去,但這不是到RIP_MAC的路徑,因此丟棄該數據包。
如果設置rp_filter=2,由於Router反向檢查時能和VIP能互相通信(儘管是和Director上的VIP通信),因此數據包保留。
如果設置rp_filter=0,則完全不檢查源地址,直接轉發。
一般情況下,保持預設值比較安全,這樣可以防止DDos攻擊。如果有修改該參數的需要,則應該將其設置為2。無可奈何的情況下才設置為0。
5.3 實現VS/DR模式的負載均衡(CIP、VIP不同網段)
實驗環境如下:之所以Client-->Router-->Director
給出了虛線,是因為這裡CIP和VIP同網段,它會直接和Director通信,而不會經過Router,但這並不影響結果。
為了測試的便利性,將Director自身也設置為一個RS,其RIP設置為127.0.0.1。
因此:
CIP:172.16.10.22
Route IP1:172.16.10.23
Route IP2:192.168.100.32
VIP:172.16.10.21
DIP:192.168.100.17
RIP1:192.168.100.47
RIP2:192.168.100.23
RIP3:127.0.0.1(在Director上的RIP)
配置過程:
如下操作各RS:不包括Director上的本地RS
# (1).提供web服務和測試頁面
yum -y install httpd
echo "from RS1:192.168.100.47" >/var/www/html/index.html # 在RS1上操作
echo "from RS2:192.168.100.23" >/var/www/html/index.html # 在RS2上操作
service httpd start
# (2).設置arp參數
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
# (3).設置VIP
ifconfig lo:0 172.16.10.21/32 up
route add -host 172.16.10.21 dev lo:0
# (4).修改RS數據包流出的網關為Router,以保證能和外界客戶端通信
route del default
route add default gw 192.168.100.32
如下操作Router:開啟轉發功能,但暫時不設置rp_filter,以查看實驗結果
echo 1 > /proc/sys/net/ipv4/ip_forward
最後如下操作Director:
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -C
ipvsadm -A -t 172.16.10.21:80 -s wrr
ipvsadm -a -t 172.16.10.21:80 -r 192.168.100.47:80 -g -w 1
ipvsadm -a -t 172.16.10.21:80 -r 192.168.100.23:80 -g -w 1
ipvsadm -a -t 172.16.10.21:80 -r 127.0.0.1:80 -g -w 1
# 提供本地RS
yum -y install httpd
echo "from RS3:127.0.0.1" >/var/www/html/index.html
service httpd start
# 添加目標地址為CIP的路由,以便調度到本地RS時,數據包能經過Router轉發,而非Director直接返回給Client
route add -host 172.16.10.22 gw 172.16.10.23
測試時,只有當調度到RS3時,才能得到正確的響應結果,而調度器調度到RS1和RS2時,將無法得到正確的響應。實際上是客戶端和RS1、RS2無法建立TCP連接。
查看Director上的狀態。
[root@xuexi ~]# ipvsadm -ln -c
IPVS connection entries
pro expire state source virtual destination
TCP 14:58 ESTABLISHED 172.16.10.22:1683 172.16.10.21:80 127.0.0.1:80
TCP 00:57 SYN_RECV 172.16.10.22:1679 172.16.10.21:80 192.168.100.23:80
TCP 00:55 SYN_RECV 172.16.10.22:1681 172.16.10.21:80 192.168.100.47:80
註意,這裡顯示的狀態是RS上的TCP連接狀態,不是Director的。SYN_RECV表示RS1/RS2發送的syn+ack得不到客戶端的回應。如果在Router和Client機器上抓包分析的話,會發現syn+ack數據包到Router上就斷了,Client根本就沒收到syn+ack。
正如前面的分析,只有調度到RS3時,響應數據包的源MAC地址、源IP地址和Router上的arp緩存記錄是對應的。預設rp_filter=1反向檢查時,這正好是最佳路徑。而調度到RS1和RS2時,Router反向檢查時由於只能檢查到Director上的VIP,因此數據包會被丟棄。
現在,將Router上和RS通信的介面rp_filter設置為2。
echo 2 >/proc/sys/net/ipv4/conf/eth0/rp_filter
再測試時,發現無論是RS1、RS2、RS3都能正確響應結果。
回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到資料庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/8472744.html
註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!