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原理介绍和配置实践

相关文章
相关标签/搜索