背景
?前面一章我们整体介绍了LVS的概念和功能。其中提到了LVS的几个关键的工作模型(NAT,DR,TRUN),这一章我们就针对NAT工作模型来具体介绍,同时通过一套基础架构实验来帮助理解。
上一章:LVS详解
LVS? NAT模型介绍
?????????Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的数据包经过调度器,导致调度器压力过大。 ?
?
??数据包流转的过程如上图所示:
(1)当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(2) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
(3) IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ,在这个过程完成了目标IP的转换。
(4) POSTROUTING链通过选路,将数据包发送给Real Server。
(5) Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 。
(6) Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
?补充:
(1)lvs-nat的本质是多目标ip的DNAT,通过将请求报文中的目标地址和目标端口修改为后端real server的ip和port
(2)DIP和Rip建议在同一网段(也可以不在),
(3)请求报文和相应报文必须经过lvs服务器,因此lvs就会成为该架构的瓶颈
(4)支持端口映射可以更改请求报文的目标端口
(5)lvs服务器必须是linux系统,real server可以为任意os系统
LVS-NAT 实验?
?转发流程:
? ? ? ? 1.? Client端发送请求到路由器; ? ? ? ? 2.? 由于是linux系统模拟的路由器,因此路由器节点开启ip转发功能,同时通过iptable设置端口映射,将访问路由器的10.10.10.129的信息映射到后端的LVS的192.168.10.200; ? ? ? ? 3.? 到达lvs节点之后,通过lvs配置的LVS-NAT模型(四层负载)转发发哦NGinx节点; ? ? ? ? 4.? 到达Nginx节点之后,通过Nginx的七层负载均衡转发到web节点
?1.? ? ?网络规划
设备 | ip | 网关 | Client | 10.10.10.128/24 | - | Route-link1 | 10.10.10.129/24 | - | Route-link2 | 192.168.10.10/24 | - | LVS-vip | 192.168.10.100/24 | 192.168.10.10 | nginx-1 | 192.168.10.12/24 | 192.168.10.100 | nginx-2 | 192.168.10.13/24 | 192.168.10.100 | web-1 | 192.168.10.15/24 | - | web-2 | 192.168.10.16/24 | - |
?2.? ? Route节点配置
? ? ? ? 配置Route节点的路由转发,以及配置设备ip。结合实际生产环境路由器上面需要开启端口映射。
## 由于是linux模拟的路由器,设置Route节点ip转发功能
root@Route:~# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
root@Route:~# sysctl -p
##开启端口映射
root@Route:~# iptables -t nat -A PREROUTING -d 10.10.10.129 -j DNAT --to 192.168.10.200
?
?3.? ? LVS 节点配置
? ? ? ? ?1.? ?配置路由转发; ? ? ? ? 2.? 配置IP地址,网关指向路由; ? ? ? ? 3.? 配置keepalived设置vip。 ? ? ? ? 4.? ?配置ipvs转发
3.1? ? ? ? 配置路由转发
## 主备节点均配置
root@Lvs-Master:~#echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
root@Lvs-Master:~# sysctl -p
3.2? ? ? ? 配置ip和网关
?
?3.3? ? 配置keepalived
###Master节点
root@Lvs-Master:~# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from xhz@qq.com
smtp_server 192.168.65.129
smtp_connect_timeout 30
router_id keepalived-MASTER
}
vrrp_instance VI_1 {
state MASTER
interface ens33
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
##Backup节点
root@LVS-Backup:~# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from xhz@qq.com
smtp_server 192.168.65.129
smtp_connect_timeout 30
router_id keepalived-MASTER
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 10
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
?3.4? ? 配置ipvs转发
## 主备节点均要配置
##192.168.10.12和192.168.10.13节点为后端的nginx服务器
##192.168.10.200为VIP
root@Lvs-Master:~# ipvsadm -A -t 192.168.10.200:80 -s rr
root@Lvs-Master:~# ipvsadm -a -t 192.168.10.200:80 -r 192.168.10.12:80 -m
root@Lvs-Master:~# ipvsadm -a -t 192.168.10.200:80 -r 192.168.10.13:80 -m
root@Lvs-Master:~# 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.10.200:80 rr
-> 192.168.10.12:80 Masq 1 0 0
-> 192.168.10.13:80 Masq 1 0 0
4.? ? Nginx节点配置
? ? ? ? ?Nginx配置七层负载均衡!
root@proxy-1:/etc/nginx/conf.d# cat web1.conf
upstream lvsservers {
server 192.168.10.15:80;
server 192.168.10.16:80;
}
server {
listen 80;
server_name lvs_test.com www.lvs_test.com;
root /https;
location / {
proxy_pass http://lvsservers;
include proxy_params;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
?5.? 配置web节点
## web1节点
root@web-1:~# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name lvs_test.com www.lvs_test.com;
location / {
root /https;
index index.html;
}
}
root@web-1:~# cat /https/index.html
web1
root@web-1:~#
##web2节点
root@web-2:~# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name lvs_test.com www.lvs_test.com;
location / {
root /https;
index index.html;
}
}
root@web-2:~# cat /https/index.html
web2
root@web-2:~#
6.? ?测试
?前面在介绍keepalived说过,keepalived是为了LVS而生的,因此我们在配置lvs四层转发的时候可以直接通过keepalived的配置文件进行设置,后续我们在说DR模型的时候,在着重通过该方式进行实验配置。
|