一、LVS的NAT模式介紹 html
參考自官網:http://www.linuxvirtualserver.org/zh/lvs3.html linux
因爲IPv4中IP地址空間的日益緊張和安全方面的緣由,不少網絡使用保留IP地址(10.0.0.0/255.0.0.0、 172.16.0.0/255.128.0.0和192.168.0.0/255.255.0.0)[64, 65, 66]。這些地址不在Internet上使用,而是專門爲內部網絡預留的。當內部網絡中的主機要訪問Internet或被Internet訪問時,就須要 採用網絡地址轉換(Network Address Translation, 如下簡稱NAT),將內部地址轉化爲Internets上可用的外部地址。NAT的工做原理是報文頭(目標地址、源地址和端口等)被正確改寫後,客戶相信 它們鏈接一個IP地址,而不一樣IP地址的服務器組也認爲它們是與客戶直接相連的。由此,能夠用NAT方法將不一樣IP地址的並行網絡服務變成在一個IP地址 上的一個虛擬服務。 web
VS/NAT的體系結構如圖所示。在一組服務器前有一個調度器,它們是經過Switch/HUB相鏈接的。這些服務器 提供相同的網絡服務、相同的內容,即無論請求被髮送到哪一臺服務器,執行結果是同樣的。服務的內容能夠複製到每臺服務器的本地硬盤上,能夠經過網絡文件系 統(如NFS)共享,也能夠經過一個分佈式文件系統來提供。 算法
客戶經過Virtual IP Address(虛擬服務的IP地址)訪問網絡服務時,請求報文到達調度器,調度器根據鏈接調度算法從一組真實服務器中選出一臺服務器,將報文的目標地址 Virtual IP Address改寫成選定服務器的地址,報文的目標端口改寫成選定服務器的相應端口,最後將修改後的報文發送給選出的服務器。同時,調度器在鏈接Hash 表中記錄這個鏈接,當這個鏈接的下一個報文到達時,從鏈接Hash表中能夠獲得原選定服務器的地址和端口,進行一樣的改寫操做,並將報文傳給原選定的服務 器。當來自真實服務器的響應報文通過調度器時,調度器將報文的源地址和源端口改成Virtual IP Address和相應的端口,再把報文發給用戶。咱們在鏈接上引入一個狀態機,不一樣的報文會使得鏈接處於不一樣的狀態,不一樣的狀態有不一樣的超時值。在TCP 鏈接中,根據標準的TCP有限狀態機進行狀態遷移,這裏咱們不一一敘述,請參見W. Richard Stevens的《TCP/IP Illustrated Volume I》;在UDP中,咱們只設置一個UDP狀態。不一樣狀態的超時值是能夠設置的,在缺省狀況下,SYN狀態的超時爲1分鐘,ESTABLISHED狀態的超 時爲15分鐘,FIN狀態的超時爲1分鐘;UDP狀態的超時爲5分鐘。當鏈接終止或超時,調度器將這個鏈接從鏈接Hash表中刪除。 vim
這樣,客戶所看到的只是在Virtual IP Address上提供的服務,而服務器集羣的結構對用戶是透明的。對改寫後的報文,應用增量調整Checksum的算法調整TCP Checksum的值,避免了掃描整個報文來計算Checksum的開銷。 後端
在一些網絡服務中,它們將IP地址或者端口號在報文的數據中傳送,若咱們只對報文頭的IP地址和端口號做轉換,這樣就會出現不一致性,服務會中斷。因此,針 對這些服務,須要編寫相應的應用模塊來轉換報文數據中的IP地址或者端口號。咱們所知道有這個問題的網絡服務有FTP、IRC、H.32三、 CUSeeMe、Real Audio、Real Video、Vxtreme / Vosiac、VDOLive、VIVOActive、True Speech、RSTP、PPTP、StreamWorks、NTT AudioLink、NTT SoftwareVision、Yamaha MIDPlug、iChat Pager、Quake和Diablo。 安全
簡單來講,這種模式藉助iptables的nat表來實現 服務器
用戶的請求到分發器後,經過預設的iptables規則,把請求的數據包轉發到後端的rs上去 網絡
rs須要設定網關爲分發器的內網ip 負載均衡
用戶請求的數據包和返回給用戶的數據包所有通過分發器,因此分發器成爲瓶頸
在nat模式中,只須要分發器有公網ip便可,因此比較節省公網ip資源
缺點:擴展性有限。高負載模式下,director可能成爲瓶頸
優勢:支持任意操做系統,節點服務器使用私有IP地址,與負載調度器位於同一個物理網絡,安全性比DR模式和TUN模式要高。
部署過程
環境:
lvs eth0:10.0.0.3 gateway:10.0.0.254 eth1:192.168.1.3
web01 eth0:192.168.1.7 gateway:192.168.1.3
web02 eth0:192.168.1.8 gateway:192.168.1.3
一、配置lvs服務器爲路由器
web01和web02只有內網卡,配置lvs爲路由器使其上網
[root@lvs ~]# vim /etc/sysctl.conf
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs ~]# iptables -F
[root@lvs ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
二、web服務器準備
在web服務器上安裝httpd服務來進行模擬,每臺服務器的web首頁不一樣,在負載均衡測試的時候以便區分
web01
[root@web01 ~]# yum install -y httpd
[root@web01 ~]# systemctl start httpd.service
[root@web01 ~]# systemctl enable httpd.service
[root@web01 ~]# echo 'web01'> /var/www/html/index.html
[root@web01 ~]# curl 127.0.0.1
web01
web02
[root@web02 ~]# yum install -y httpd
[root@web02 ~]# systemctl start httpd.service
[root@web02 ~]# systemctl enable httpd.service
[root@web02 ~]# echo 'web02'> /var/www/html/index.html
[root@web02 ~]# curl 127.0.0.1
web02
三、lvs服務器配置
[root@lvs ~]# yum install -y ipvsadm #安裝lvs核心管理軟件包
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 10.0.0.3:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.0.0.3:80 -r 192.168.1.7 -m
[root@lvs ~]# ipvsadm -a -t 10.0.0.3:80 -r 192.168.1.8 -m
參數說明:
-C --clear清除內核虛擬服務器表中的全部記錄
-A --add-service在內核的虛擬服務器表中添加一條新的虛擬服務器記錄
-t --tcp-service service-address說明虛擬服務器提供的是tcp 的服務
-s --scheduler scheduler使用的調度算法,調度算法能夠指定如下8種:rr(輪詢),wrr(權重),lc(最後鏈接),wlc(權重),lblc(本地最後鏈接),lblcr(帶複製的本地最後鏈接),dh(目的地址哈希),sh(源地址哈希),sed(最小指望延遲),nq(永不排隊)
-a --add-server在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄。也就是在一個虛擬服務器中增長一臺新的真實服務器
-r --real-server server-address指定真實的服務器[Real-Server:port]
-m --masquerading指定LVS 的工做模式爲NAT 模式
調度測試
[root@lvs ~]# curl 10.0.0.3
web01
[root@lvs ~]# curl 10.0.0.3
web02
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 rr
-> 192.168.1.7:80 Masq 1 0 0
-> 192.168.1.8:80 Masq 1 0 1
-L --list 顯示內核虛擬服務器表
-n 不解析端口使用的協議
四、keepalived結合lvs_NAT模式
配置keepalived增長虛擬ip,從而管理到lvs,能夠進一步配置爲lvs服務器的高可用
[root@lvs ~]# yum install keepalived -y
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL #表示keepalived服務器的一個標識
}
vrrp_instance VI_1 { #定義一個vrrp組,組名惟一
state MASTER #定義改主機爲keepalived的master主機
interface eth0 #監控eth0號端口
virtual_router_id 51 #虛擬路由id號爲51,id號惟一,這個id決定了多播的MAC地址
priority 100 #節點優先級
advert_int 1 #檢查間隔,默認爲1秒
authentication {
auth_type PASS #認證方式,密碼認證
auth_pass 1111 #認證密碼
}
virtual_ipaddress {
10.0.0.4 #虛擬ip地址
}
}
virtual_server 10.0.0.4 80 { #虛擬主機設置
delay_loop 6 #每隔6秒查詢realserver狀態
lb_algo rr #lvs的調度算法
lb_kind NAT #lvs的集羣模式
persistence_timeout 50 #同一IP的鏈接50秒內被分配到同一臺realserver
protocol TCP #用TCP協議檢查realserver狀態
real_server 192.168.1.7 80 { #後端真實主機ip
weight 1 #每臺機器的權重,0表示不給該機器轉發請求,直到它恢復正常
TCP_CHECK { #如下爲健康檢查項目
connect_timeout 3 #鏈接超時時間,單位爲秒
nb_get_retry 3 #檢測失敗後的重試次數,若是達到重試次數仍然失敗,將後端從服務器池中移除
delay_before_retry 3 #失敗重試的間隔時間,單位爲秒
connect_port 80 #檢查的鏈接端口
}
}
real_server 192.168.1.8 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@lvs ~]# systemctl start keepalived.service
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 rr
-> 192.168.1.7:80 Masq 1 0 0
-> 192.168.1.8:80 Masq 1 0 0
TCP 10.0.0.4:80 rr
-> 192.168.1.7:80 Masq 1 0 0
-> 192.168.1.8:80 Masq 1 0 0
這裏keepalived服務啓動後,配置的vip也成功實現了lvs負載均衡,還須要作的就是在web服務器上增長輔助ip10.0.0.33便可