一、部署NAT模式集群案例
1.1 nat模式的简介
1.1.1 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
1.1.2 RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
1.1.3 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
1.1.4 支持端口映射,可修改请求报文的目标PORT
1.1.5 VS必须是Linux系统,RS可以是任意OS系统
1.2 配置要求
1.2.1 Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连
1.2.2 Web服务器采用仅主机网卡与director相连
1.2.3 Web服务器网关指向192.168.248.100
1.2.4 后端web服务器不需要连接外网
1.3 实验环境
| 主机名 | ip | 角色 | |
|---|---|---|---|
| VS | NAT:192.168.198.100 host-only:192.168.248.100 | 调度器(VS) | |
| RS1 | host-only:192.168.248.10,WG192.168.248.100 | 真实服务器(RS) | |
| RS2 | host-only:192.168.248.20,GW 192.168.248.100 | 真实服务器(RS) |
1.3.1 如图所示,已经搭建的VS

1.3.2 如图所示,已经搭建的RS1
1.3.3 如图所示,已经搭建的RS2
1.3.4 在两台服务器上设置业务真实数据
VS
bash
[root@RS1 ~]# dnf install ipvsadm -y
[root@RS1 ~]# systemctl enable --now ipvsadm
RS1
bash
[root@RS1 ~]# dnf install httpd -y
[root@RS1 ~]# systemctl enable --now httpd
[root@RS1 ~]# echo RS2 - 192.168.248.10 > /var/www/html/index.html
RS2
bash
[root@RS2 ~]# dnf install httpd -y
[root@RS2 ~]# systemctl enable --now httpd
[root@RS2 ~]# echo RS2 - 192.168.248.20 > /var/www/html/index.html
--注意因为RS1和RS2因为网关指向内网无法与外网互通,不能下载资源,所以我们需在VS上开启内核路由功能
临时开启(重启失效) echo 1 > /proc/sys/net/ipv4/ip_forward
永久开启(需重启网络或系统) echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
两者任选其一即可
对从VS的eth0网卡发出的数据包进行IP伪装,现 Linux 服务器的 NAT 转发(路由器功能),让内网设备可以通过这台服务器的公网 IP 访问互联网。
#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
验证能VS否正常访问两台服务器上的业务

1.4 NAT模式的实现方法
1.4.1 开启VS内核路由功能
bash
[root@VS ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@VS ~]# sysctl -p
net.ipv4.ip_forward = 1
1.4.2 VS上的编写策略
bash
[root@VS ~]# ipvsadm -C
[root@VS ~]# ipvsadm -A -t 192.168.198.100:80 -s wrr
[root@VS ~]# ipvsadm -a -t 192.168.198.100:80 -r 192.168.248.10:80 -m -w 1
[root@VS ~]# ipvsadm -a -t 192.168.198.100:80 -r 192.168.248.20:80 -m -w 1
[root@VS ~]# ipvsadm -Ln[root@VS ~]# 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.198.100:80 wrr
-> 192.168.248.10:80 Masq 1 0 0
-> 192.168.248.20:80 Masq 1 0 0
测试

1.4.3 更改权重
根据实际情况,可以让性能好的机器比性能差的机器多做一些工作
bash
[root@VS ~]# 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.198.100:80 wrr
-> 192.168.248.10:80 Masq 1 0 0
-> 192.168.248.20:80 Masq 1 0 0
[root@VS ~]# ipvsadm -e -t 192.168.198.100:80 -r 192.168.248.20:80 -m -w 2
#更改RS2的权重为2,RS1的权重为1保持不变
[root@VS ~]# 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.198.100:80 wrr
-> 192.168.248.10:80 Masq 1 0 0
-> 192.168.248.20:80 Masq 2 0 0
测试
1.4.4 ipvsadm规则持久化
利用自定义文件实现规则持久化
bash
[root@VS ~]# ipvsadm-save -n > /mnt/ipvs.rule
[root@VS ~]# ipvsadm -C
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@VS ~]# ipvsadm-restore < /mnt/ipvs.rule
[root@VS ~]# 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.198.100:80 wrr
-> 192.168.248.10:80 Masq 1 0 0
-> 192.168.248.20:80 Masq 2 0 0
利用守护进程进行规则持久化
bash
[root@VS ~]# ipvsadm -C
[root@VS ~]# ipvsadm-restore < /mnt/ipvs.rule
[root@VS ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@VS ~]# systemctl enable --now ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
[root@VS ~]# 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.198.100:80 wrr
-> 192.168.248.10:80 Masq 1 0 0
-> 192.168.248.20:80 Masq 2 0 0
二、 部署DR模式集群案例
2.1 DR模式简介
直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
2.2 配置要求
2.2.1 Director服务器采用双IP桥接网络,一个是VPP,一个DIP
2.2.2Web服务器采用和DIP相同的网段和Director连接
2.2.3每个Web服务器配置VIP
2.2.4每个web服务器可以出外网
2.3 实验环境
| 主机名 | ip | 角色 |
| VS | lo:(vip):192.168.248.200,host-only(dip):192.168.248.50 | 调度器(VS) |
| RS1 | host-only:192.168.248.10,WG192.168.248.100,lo:192.168.248.200 | 真实服务器(RS) |
| RS2 | host-only:192.168.248.20,GW 192.168.248.100,lo:192.168.248.200 | 真实服务器(RS) |
| route | NAT:192.168.198.100 host-only:192.168.248.100 | 路由器(route) |
| client | NAT:192.168.198.10 GW:192.168.198.100 | 客户端 (client) |
|---|
2.3.1 搭建VS的vip和dip
vip
bash
[root@VS ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
method=manual
address=192.168.248.50/24,192.168.248.100
[root@VS ~]# nmcli connection reload
[root@VS ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/9)
dip
bash
[root@VS ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection
[root@VS ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.248.200/32
[root@VS ~]# nmcli connection reload
[root@VS ~]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/29)

2.3.2 在RS1的lo上搭建dip
bash
[root@RS1 ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection
[root@RS1 ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ethernet]
[ipv4]
address1=127.0.0.1/8
address2=192.168.248.200/32
method=manual
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
因为VS,RS1和RS2配置同一个VIP,抑制ARP相应以免发生ARP 冲突和流量劫持状况。
bash
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
2.3.3 在RS2的lo上搭建dip
bash
[root@RS2 ~]# cp -p /etc/NetworkManager/system-connections/eth0.nmconnection /etc/NetworkManager/system-connections/lo.nmconnection
[root@RS2 ~]# cat /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ethernet]
[ipv4]
address1=127.0.0.1/8
address2=192.168.248.200/32
method=manual
[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
因为VS,RS1和RS2配置同一个VIP,抑制ARP相应以免发生ARP 冲突和流量劫持状况。
bash
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
2.3.4 route ip配置

--注意因为RS1和RS2因为网关指向内网无法与外网互通,不能下载资源,所以我们需在VS上开启内核路由功能
临时开启(重启失效) echo 1 > /proc/sys/net/ipv4/ip_forward
永久开启(需重启网络或系统) echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
两者任选其一即可
对从VS的eth0网卡发出的数据包进行IP伪装,现 Linux 服务器的 NAT 转发(路由器功能),让内网设备可以通过这台服务器的公网 IP 访问互联网。
#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
2.3.5 客户端配置

2.4 VS上的编写策略及测试
bash
[root@VS ~]# ipvsadm -A -t 192.168.248.200:80 -s wrr
[root@VS ~]# ipvsadm -a -t 192.168.248.200:80 -r 192.168.248.10:80 -g
[root@VS ~]# ipvsadm -a -t 192.168.248.200:80 -r 192.168.248.20:80 -g
[root@VS ~]# ipvsadm-save -n
-A -t 192.168.248.200:80 -s wrr
-a -t 192.168.248.200:80 -r 192.168.248.10:80 -g -w 1
-a -t 192.168.248.200:80 -r 192.168.248.20:80 -g -w 1
在客户端上测试

三、 防火墙标签解决轮询错误
3.1 概念
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题;当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上。
3.2 问题呈现
在RS1和RS2上下寨mod_ssl并重启httpd
bash
[root@RS1 ~]# dnf install mod_ssl -y
[root@RS1 ~]# systemctl restart httpd
[root@RS2 ~]# dnf install mod_ssl -y
[root@RS2 ~]# systemctl restart httpd
给VS调度器添加ipvsadm策略如tu所示


当访问vip时两次调度都到了20
3.3 防火墙标记解决轮询调度问题
3.3.1 解决方案:使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载
在VS中添加https的轮询策略
bash
[root@VS ~]# iptables -t mangle -A PREROUTING -d 192.168.248.200 -p tcp -m multiport --d
ports 80,443 -j MARK --set-mark 6666
[root@VS ~]# ipvsadm -A -f 6666 -s rr
[root@VS ~]# ipvsadm -a -f 6666 -r 192.168.248.10 -g
[root@VS ~]# ipvsadm -a -f 6666 -r 192.168.248.20 -g
[root@VS ~]# ipvsadm-save -n
-A -f 6666 -s rr
-a -f 6666 -r 192.168.248.10:0 -g -w 1
-a -f 6666 -r 192.168.248.20:0 -g -w 1
在客户端上测试

四、利用持久连接实现会话粘滞(该实验建立在防火墙标签实验环境的基础上)
4.1 解决的问题
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡
4.2 解决方案
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上,如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
4.3 VS的ipvsadm策略编写
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@VS ~]# ipvsadm -A -f 6666 -s rr -p 20
[root@VS ~]# ipvsadm -a -f 6666 -r 192.168.248.20:0 -g
[root@VS ~]# ipvsadm -a -f 6666 -r 192.168.248.10:0 -g
[root@VS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 6666 rr persistent 20
-> 192.168.248.10:0 Route 1 0 0
-> 192.168.248.20:0 Route 1 0 0
测试;使用客户机访问vip在超时连接断开20秒后再次访问变成另一台服务器,未超时断开链接20秒之前时将实现会话粘滞



