LVS-DR

ARP協議(address resolve protocol)
如:本機要 ping 172.16.2.8
過程爲:
本機廣播在局域網內 "誰是172.16.2.8,請把你的MAC告訴我",只有172.16.2.8這個迴應,並把它的MAC返回給本機。本機就獲得了172.16.2.8的MAC,並把它存放到本地的MAC地址表中緩存(經過ip neigh或arp -a等命令查看獲得),緩存時間在linux下默認爲15分鐘.在這15分鐘內,若是本機再找172.16.2.8,就直接在緩存裏去找。15分鐘過了,緩存被清除了,再去找172.16.2.8,那麼就重複上面的過程.
    DNS ARP
域名或主機名 ---> IP ----> MAC
張三的家 xx區xx站xx小區xx樓xxx室
路由器
用戶1 用戶2
P2P終結者
    路由器ip--用戶1的mac
-----------------------------------------------------------------------------------------
LVS-DR 直接路由 (direct routing)
客戶端 172.16.2.9 (宿主機5模擬)
|
|
| 172.16.2.8 eth0
[router] 192.168.122.8 <<-----------------------------
| eth1 |
| |
| |
[director] 192.168.100.10 eth0 |
| |
| |
|-------------------------------------| |
|
web1 web2 |
192.168.122.11 eth0 192.168.122.12 eth0 網關指向router的同網段IP 192.168.122.8
虛擬192.168.122.10 lo:0 虛擬192.168.122.10 lo:0
1,客戶端請求
sip:172.16.2.9 dip:172.16.2.8
smac:客戶端MAC dmac:172.16.2.8的MAC
在router上DNAT
sip:172.16.2.9 dip:192.168.122.10
smac:客戶端MAC dmac:192.168.122.10的mac
2,在director上調度(假設調給web1)
數據包裏的sip和dip不變,只把dmac變爲web1的,而後調給web1
sip:172.16.2.9 dip:192.168.122.10
smac:客戶端MAC dmac:192.168.122.11的mac
3,數據包到web1後(由於是經過mac地址到的),這裏又會有一個問題,web1收到這個包,但它並無192.168.122.10這個IP,因此不會解析這個包
若是在web1上虛擬192.168.122.10這個IP,那麼它會與director的衝突
因此解決方法爲:在web1和web2上用lo:0來虛擬192.168.122.10這個IP,那麼又能夠響應解析調度過來的包,又能夠互相不衝突 (由於lo:0爲本地迴環網卡,是不與其它人通訊的)
4,請求到數據後,須要返回給客戶端
sip:192.168.122.10 dip:172.16.2.9
smac:192.168.122.11的mac dmac:客戶端MAC
5,返回給172.16.2.9這個IP,但web1和web2並無這個網段路由,因此把網關指向公司路由器的IP192.168.122.8(不能指director的192.168.122.10,由於DR-LVS回去時不經過director)
第一大步:配置router
1,打開ip_forward
2,先清空原來的iptables全部規則,再在router上加上兩條防火牆規則(我這裏使用iptables作的,你也能夠換成firewall來作)
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.122.10
--這條是表示從eth0網卡(也就是172.16.2.8的網卡)進來訪問80的包,DNAT到192.168.122.10(也就是lvs調度器的IP)
# iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth1 -j SNAT --to-source 192.168.122.8
--關於這一條(爲了172.16.2.9訪問172.16.2.8,變成192.168.122.8訪問192.168.122.10),這樣能夠實現LVS調度器能回客戶端。若是你不用這條SNAT的話,也能夠在LVS調度器上route add default gw 192.168.122.8指一個網關回去也能夠,由於DNAT的目標機器須要一個網關才能回給client)
# iptables-save > /etc/sysconfig/iptables
# systemctl start iptables.service
# systemctl enable iptables.service
第二大步:
配置LVS調度器
1, yum install ipvsadm
--若是是用lvs-nat作過的機器來作,先使用ipvsadm -C清空規則
2,配置調度規則
# ipvsadm -A -t 192.168.122.10:80 -s rr
# ipvsadm -a -t 192.168.122.10:80 -r 192.168.122.11:80 -g
# ipvsadm -a -t 192.168.122.10:80 -r 192.168.122.12:80 -g
--這裏的-g就是表示使用路由架構;LVS調度器就會把數據包調給192.168.122.11或192.168.122.12時,就只修改MAC地址,不修改目標IP直接路由過去
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.122.10:80 rr
-> 192.168.122.11:80 Route 1 0 0
-> 192.168.122.12:80 Route 1 0 0
# ipvsadm -Sn > /etc/sysconfig/ipvsadm
# systemctl start ipvsadm
# systemctl enable ipvsadm
第三大步:
配置後臺的兩個web(不管調度幾個web,每一個web服務器都要作下面的步驟)
2,ifconfig lo:0 192.168.122.10 netmask 255.255.255.255 --注意掩碼爲4個255,想要永久生效,寫一個ifcfg-lo:0的網卡配置文件就行了
--這一步是很是重要的,由於路由方式扔過來的包,目標IP不變,也就是說仍是192.168.122.10,只是經過找192.168.122.11或者192.168.122.12的MAC地址扔過來的;
--因此web服務器上須要也須要有一個192.168.122.10這個IP來解析請求;用lo網卡來虛擬就是爲了儘可能不要與lvs的網卡形成ARP廣播問題
問題:爲何netmask爲4個255,而不是255.255.255.0;
答案:若是爲255.255.255.0,那麼192.168.122.0/24整個網段都沒法和web服務器通迅。而咱們這裏只要求lvs調度器和web不能通迅就能夠了(後面使用arp -s綁定解決)
3,真實服務器(兩個web端)把默認路由指向router同物理網段的IP
route add default gw 192.168.122.8 --想要永久生效,寫到網卡配置文件 
--網關指向router的網卡,就是爲了回去時跳過lvs調度器(提升調度器性能),直接回到router,再回給客戶端(若是前面router上作了SNAT,那麼這個網關能夠不用加,緣由能夠直接分析數據包變化過程獲得)
4,# vim /etc/sysctl.conf ----加上下面四句(在兩個web端操做)
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
# sysctl -p使它生效
arp_ignore = 1 --表示系統只回答目的IP是本地的IP的包,也就是對廣播包不作響應
arp_announce = 2 --表示系統忽略IP包的源地址,而根據目標主機選擇地址
5, yum install arptables_jf ----安裝arp防火牆對目錄地址爲192.168.122.10的包都drop掉(在兩個web端操做)
arptables -A INPUT -d 192.168.122.10 -j DROP --添加這條規則
arptables-save -n > /etc/sysconfig/arptables
systemctl start arptables
systemctl enable arptables
--上面的第4和5小步都是用來解決DR架構中的arp問題;只須要用其中一個就能夠了;固然兩步都作也是能夠的;(或者在router上使用arp -s 192.168.122.10 52:54:00:16:13:8d把調度ip和lvs調度器的的網卡mac永久綁定,這樣也能夠解決這個arp問題)
第四大步:
一個重要的補充步驟
1,回到lvs調度器上用ip neigh命令或者arp -a命令來查看是否有192.168.122.11或者192.168.122.12的物理地址;
就算是有,也只是你剛纔可能和它們通迅過,這些MAC地址還保存着(通常15分鐘後就會消失),你須要再和192.168.122.11和192.168.122.12通迅;
但你會發現你都ping不通192.168.122.11和192.168.122.12了;
緣由是由於你在web服務器上配置了lo:0 192.168.122.10這個網卡
因此LVS調度器192.168.122.10去ping 192.168.122.11能夠過去,但回不來,由於回來時他會直接找本身的lo:0的192.168.122.10
解決這個問題:
在LVS調度器上永久綁定web1和web2的MAC地址(能夠加入/etc/rc.local裏永久生效)
arp -s 192.168.122.11 00:0C:29:C3:3C:54
arp -s 192.168.122.12 00:0C:29:B8:10:8A
第五大步:
測試
在客戶端172.16.2.9上elinks 172.16.2.8測試
=====================================================
關於lvs的防火牆標記的討論
作好DR架構後,而後在LVS調度器上作下面的操做
--注意:我這裏是把80和3306端口設置同一個mark ,只是爲測試(實際狀況應該爲80和443)
1,在lvs調度器上配置以下
# iptables -t mangle -A PREROUTING -p tcp -d 192.168.122.10 --dport 80 -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -p tcp -d 192.168.122.10 --dport 3306 -j MARK --set-mark 10
# iptables -t mangle -L PREROUTING -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK tcp -- 0.0.0.0/0 192.168.122.10 tcp dpt:80 MARK set 0xa
MARK tcp -- 0.0.0.0/0 192.168.122.10 tcp dpt:3306 MARK set 0xa
# ipvsadm -A -f 10 -s rr
# ipvsadm -a -f 10 -r 192.168.122.11 -g
# ipvsadm -a -f 10 -r 192.168.122.12 -g
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 rr
-> 192.168.122.11:0 Route 1 0 0
-> 192.168.122.12:0 Route 1 0 0
2,在上面的基礎上作的,全部在router上對3306也要加SNAT和DNAT
# iptables -t nat -A PREROUTING -p tcp --dport 3306 -i eth0 -j DNAT --to 192.168.122.10
# iptables -t nat -A POSTROUTING -p tcp --dport 3306 -o eth1 -j SNAT --to 192.168.122.8
3,在web1和web2上分別安裝兩個mysql用於測試(創建兩個不一樣的庫方便測試)
這兩個mysql要受權,受權以下
mysql> grant all on *.* to 'abc'@'192.168.122.8' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
再回到客戶端測試
測試結果:80和3306均可以被調度
相關文章
相關標籤/搜索