LVS-NAT原理介紹和配置實踐

前言

本文主要講述LVS-NAT原理介紹和配置實踐,HA高可用方案基於Keepalived。html

LVS-NAT原理介紹和配置實踐

更新歷史

2019年09月03日 - 拆分LVS-Keepalived中LVS-NAT
2019年08月23日 - 更新LVS/NAT、LVS/DR、LVS/TUN三種模式的原理和配置實踐
2018年12月03日 - 精簡和更新配置步驟
2018年07月31日 - 初稿前端

閱讀原文 - https://wsgzao.github.io/post...linux

擴展閱讀git

LVS - http://www.linuxvirtualserver...
Keepalived - http://www.keepalived.org/github


ReadMe

參考文章

Virtual Server via NAT - http://www.linuxvirtualserver...
LVS和Keepalived官方中文手冊PDF - https://pan.baidu.com/s/1s0P6...算法

相關術語

如下術語涉及LVS三種工做模式的原理
  • LB (Load Balancer 負載均衡)
  • HA (High Available 高可用)
  • Failover (失敗切換)
  • Cluster (集羣)
  • LVS (Linux Virtual Server Linux 虛擬服務器)
  • DS (Director Server),指的是前端負載均衡器節點
  • RS (Real Server),後端真實的工做服務器
  • VIP (Virtual IP),虛擬的IP地址,向外部直接面向用戶請求,做爲用戶請求的目標的 IP 地址
  • DIP (Director IP),主要用於和內部主機通信的 IP 地址
  • RIP (Real Server IP),後端服務器的 IP 地址
  • CIP (Client IP),訪問客戶端的 IP 地址

LVS三種模式的主要區別

VS/NAT VS/TUN VS/DR
server any tunneling non-arp device
server network private LAN/WAN LAN
server number low (10~20) high high
server gateway load balancer own router own router
模式與特色 NAT 模式 IPIP 模式 DR 模式
對服務器的要求 服務節點可使任何操做系統 必須支持 IP 隧道,目前只有 Linux 系統支持 服務器節點支持虛擬網卡設備,可以禁用設備的 ARP 響應
網絡要求 擁有私有 IP 地址的局域網絡 擁有合法 IP 地址的局域,網或廣域網 擁有合法 IP 地址的局域,服務器節點與負載均衡器必須在同一個網段
一般支持節點數量 10 到 20 個,根據負載均衡器的處理能力而定 較高,能夠支持 100 個服務節點 較高,能夠支持 100 個服務節點
網關 負載均衡器爲服務器節點網關 服務器的節點同本身的網關或者路由器鏈接,不通過負載均衡器 服務節點同本身的網關或者路由器鏈接,不通過負載均衡器
服務節點安全性 較好,採用內部 IP,服務節點隱蔽 較差,採用公用 IP 地址,節點安全暴露 較差,採用公用 IP 地址,節點安全暴露
IP 要求 僅須要一個合法的 IP 地址做爲 VIP 地址 除了 VIPO 地址外,每一個服務器界定啊須要擁有合法的 IP 地址,能夠直接從路由到客戶端 除了 VIP 外,每一個服務節點需擁有合法的 IP 地址,能夠直接從路由到客戶端
特色 地址轉換 封裝 IP 修改 MAC 地址
配置複雜度 簡單 複雜 複雜

LVS基本工做原理

  1. 當用戶向負載均衡調度器(Director Server)發起請求,調度器將請求發往至內核空間
  2. PREROUTING鏈首先會接收到用戶請求,判斷目標IP肯定是本機IP,將數據包發往INPUT鏈
  3. IPVS是工做在INPUT鏈上的,當用戶請求到達INPUT時,IPVS會將用戶請求和本身已定義好的集羣服務進行比對,若是用戶請求的就是定義的集羣服務,那麼此時IPVS會強行修改數據包裏的目標IP地址及端口,並將新的數據包發往POSTROUTING鏈
  4. POSTROUTING連接收數據包後發現目標IP地址恰好是本身的後端服務器,那麼此時經過選路,將數據包最終發送給後端的服務器

LVS的組成

LVS 由2部分程序組成,包括 ipvs 和 ipvsadm。
  1. ipvs(ip virtual server):一段代碼工做在內核空間,叫ipvs,是真正生效實現調度的代碼。
  2. ipvsadm:另一段是工做在用戶空間,叫ipvsadm,負責爲ipvs內核框架編寫規則,定義誰是集羣服務,而誰是後端真實的服務器(Real Server)

LVS和Keepalived

在lvs+keepalived環境裏面,lvs主要的工做是提供調度算法,把客戶端請求按照需求調度在real服務器,keepalived主要的工做是提供lvs控制器的一個冗餘,而且對real服務器作健康檢查,發現不健康的real服務器,就把它從lvs集羣中剔除,real服務器只負責提供服務。vim

LVS/NAT

重點理解NAT方式的實現原理和數據包的改變。

(1). 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP
(2). PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
(3). IPVS比對數據包請求的服務是否爲集羣服務,如果,修改數據包的目標IP地址爲後端服務器IP,而後將數據包發至POSTROUTING鏈。 此時報文的源IP爲CIP,目標IP爲RIP
(4). POSTROUTING鏈經過選路,將數據包發送給Real Server
(5). Real Server比對發現目標爲本身的IP,開始構建響應報文發回給Director Server。 此時報文的源IP爲RIP,目標IP爲CIP
(6). Director Server在響應客戶端前,此時會將源IP地址修改成本身的VIP地址,而後響應給客戶端。 此時報文的源IP爲VIP,目標IP爲CIP後端

LVS/NAT模型的特性
  • RS應該使用私有地址,RS的網關必須指向DIP
  • DIP和RIP必須在同一個網段內
  • 請求和響應報文都須要通過Director Server,高負載場景中,Director Server易成爲性能瓶頸
  • 支持端口映射
  • RS可使用任意操做系統
  • 缺陷:對Director Server壓力會比較大,請求和響應都需通過director server

NAT(Network Address Translation 網絡地址轉換)是一種外網和內外地址映射的技術,內網能夠是私有網址,外網可使用NAT方法修改數據報頭,讓外網與內網可以互相通訊。NAT模式下,網絡數據報的進出都要通過LVS的處理。LVS需做爲RS(真實服務器)的網關。當包到達LVS時,LVS作目標地址轉換(DNAT),將目標IP改成RS的IP。RS接收到包之後,彷彿是客戶端直接發給它的同樣。RS處理完,返回響應時,源IP是RS IP,目標IP是客戶端的IP。這時RS的包經過網(LVS)中轉,LVS會作源地址轉換(SNAT),將包的源地址改成VIP,這樣,這個包對客戶端看起來就彷彿是LVS直接返回給它的。客戶端沒法感知到後端RS的存在。安全

(1)RIP和DIP必須在同一個IP網絡,且應該使用私網地址;RS的網關要指向DIP;
(2)請求報文和響應報文都必須經由Director轉發;Director易於成爲系統瓶頸;
(3)支持端口映射,可修改請求報文的目標PORT;
(4)vs必須是Linux系統,rs能夠是任意系統;bash

缺點:在整個過程當中,全部輸入輸出的流量都要通過LVS 調度服務器。顯然,LVS 調度服務器的網絡I/O壓力將會很是大,所以很容易成爲瓶頸,特別是對於請求流量很小,而響應流量很大的Web類應用來講尤其如此。

優勢:NAT模式的優勢在於配置及管理簡單,因爲了使用NAT技術,LVS 調度器及應用服務器能夠在不一樣網段中,網絡架構更靈活,應用服務器只須要進行簡單的網絡設定便可加入集羣。

配置LVS-NAT

DS

# Install keepalived
# Ubuntu
apt-get install keepalived ipvsadm
# CentOS
yum install keepalived ipvsadm

# update iptables
vim /etc/sysconfig/iptables

# For keepalived:
# allow vrrp 
-A INPUT -p vrrp -j ACCEPT
-A INPUT -p igmp -j ACCEPT
# allow multicast
-A INPUT -d 224.0.0.18 -j ACCEPT

# reload iptables
service iptables reload

# open ip_forward
echo "1" > /proc/sys/net/ipv4/ip_forward
# edit sysctl.conf
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p

# keepalived for lvs-nat
vim /etc/keepalived/keepalived.conf

vrrp_sync_group NC-MAIN-API {
    group {
        NC-MAIN-API-PUB
    }
}

vrrp_instance NC-MAIN-API-PUB {
    state BACKUP
    interface bond1
    virtual_router_id 222
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        xx.xx.xx.xx/25 dev bond1
    }
}

virtual_server xx.xx.xx.xx 15000 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    protocol TCP

    real_server 10.71.12.69 15000 {
        weight 100
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 15000
        }
    }
    real_server 10.71.12.76 15000 {
        weight 100
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 15000
        }
    }
}

RS

修改默認網關指向NAT的VIP地址

LVS和Keepalived系列

LVS和Keepalived的原理介紹和配置實踐
LVS原理介紹和配置實踐
Keepalived原理介紹和配置實踐
LVS-NAT原理介紹和配置實踐
LVS-DR原理介紹和配置實踐
LVS-TUN原理介紹和配置實踐

相關文章
相關標籤/搜索