前言

本文主要讲述 LVS-NAT 原理介绍和配置实践,HA 高可用方案基于 Keepalived。

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/lvs-nat/

扩展阅读

LVS - http://www.linuxvirtualserver.org/zh/index.html
Keepalived - http://www.keepalived.org/


ReadMe

参考文章

Virtual Server via NAT - http://www.linuxvirtualserver.org/VS-NAT.html
LVS 和 Keepalived 官方中文手册 PDF - https://pan.baidu.com/s/1s0P6nUt8WF6o_N3wdE3uKg

相关术语

以下术语涉及 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 服务器只负责提供服务。

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 可以是任意系统;

缺点:在整个过程中,所有输入输出的流量都要经过 LVS 调度服务器。显然,LVS 调度服务器的网络 I/O 压力将会非常大,因此很容易成为瓶颈,特别是对于请求流量很小,而响应流量很大的 Web 类应用来说尤为如此。

优点:NAT 模式的优点在于配置及管理简单,由于了使用 NAT 技术,LVS 调度器及应用服务器可以在不同网段中,网络架构更灵活,应用服务器只需要进行简单的网络设定即可加入集群。

配置 LVS-NAT

DS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# 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
}
}
}

# enable and start keepalived
systemctl start keepalived
systemctl enable keepalived
watch ipvsadm -L -n --stats

RS

修改默认网关指向 NAT 的 VIP 地址

LVS 和 Keepalived 系列

LVS 和 Keepalived 的原理介绍和配置实践
LVS 原理介绍和配置实践
Keepalived 原理介绍和配置实践
LVS-NAT 原理介绍和配置实践
LVS-DR 原理介绍和配置实践
LVS-TUN 原理介绍和配置实践

文章目录
  1. 1. 前言
  2. 2. 更新历史
  3. 3. ReadMe
    1. 3.1. 参考文章
    2. 3.2. 相关术语
  4. 4. LVS 三种模式的主要区别
  5. 5. LVS 基本工作原理
    1. 5.1. LVS 的组成
    2. 5.2. LVS 和 Keepalived
    3. 5.3. LVS/NAT
  6. 6. 配置 LVS-NAT
    1. 6.1. DS
    2. 6.2. RS
  7. 7. LVS 和 Keepalived 系列