LVS-NAT实现
1.0网络拓扑图
![](https://img-blog.csdnimg.cn/img_convert/3e1e966d958a51b234e8f721e41c6b0f.png)
2.0全局搭建环境
2.1 之后,所有的虚拟机都部署2.2——2.6,除了特殊说明的主机
2.1准备5台虚拟机
分别作为 客户端(client),lvs调度器(LVS),路由器(route),服务器1(RS1),服务器2(RS2)
![](https://img-blog.csdnimg.cn/img_convert/726e200dd45a6f924a86e9d7f2c64abe.png)
2.2修改主机名
方便查看,防止记错,分别修改主机名
hostname client/LVS/ROUTE/RS1/RS2
生效
exec bash
2.3关闭防火墙
除了客户端都把防火墙关闭了
systemctl stop firewalld
2.4关闭selinux
vim /etc/slinux/config
修改 SELINUX===disabled==
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
配置生效
setenforce 0
2.5关闭NetworkManager
centos6
service NetworkManager stop
centos7
systemctl stop NetworkManager
2.6准备网卡
虚拟机 | 设备功能 | 网卡名称 | 网卡连接方式 |
centos6-10 | client | etho | 桥接 |
centos7-5 | LVS | ens36 ens33 | VMnet6仅 仅主机 |
7.9-1 | ROUTE | ens38 ens33 | VMnet6仅 仅主机 |
centos7.5 | RS1 | ens33 | 仅主机 |
centos7.9 | RS2 | ens33 | 仅主机 |
2.7 LVS 启用ip_forward
添加内容 ==ip_forward==
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
生效
sysctl -p
3.0实现网络拓扑
3.1client
配置路由
vim /etc/sysconfig/network-script/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.168.138.120
重启网络服务
service network restort
3.2 LVS
ens36
vim /etc/sysconfig/network-script/ifcfg-ens36
DEVICE=ens36
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.168.138.121
ens33
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.140.115
GATWAY=192.168.140.111
重启网络
systemcel restwrt network
3.3route
ens38
vim /etc/sysconfig/network-script/ifcfg-ens36
DEVICE=ens36
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.140.111
GATWAY=192.168.140.115
ens33
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.137.110
重启网络
systemcel restwrt network
3.4RS1
ens33
vim /etc/sysconfig/network-script/ifcfg-ens36
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.137.140
GATWAY=192.168.137.110
重启网络
systemcel restwrt network
3.5RS2
ens33
vim /etc/sysconfig/network-script/ifcfg-ens36
DEVICE=ens33
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.137.135
GATWAY=192.168.137.110
重启网络
systemcel restwrt network
4.0测试环境搭建
4.1 LVS
安装ipvs包
yum -y install ipvsadm
添加一条新的虚拟服务
ipvsadm -A -t 172.168.138.121:80 -s rr
虚拟服务中添加新的真实服务器
ipvsadm -a -t 172.168.138.121:80 -r 192.168.137.140
ipvsadm -a -t 172.168.138.121:80 -r 192.168.137.135
查看添加如下
ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.168.138.121:80 rr
-> 192.168.137.135:80 Masq 1 0 0
-> 192.168.137.140:80 Masq 1 0 0
4.2 route
4.2.1 RS1
安装httpd
yum -y install httpd
重新启动httpd
systemctl restart httpd
添加主页内容
echo RS1 > /var/www.html/index.html
查看80端口是否开启
ss -ntl
4.2.2 RS2
安装httpd
yum -y install httpd
重新启动httpd
systemctl restart httpd
添加主页内容
echo RS2 > /var/www.html/index.html
查看80端口是否开启
ss -ntl|grep 80
5.0测试
5.1 在client上访问RS1和rs2
curl 172.168.138.121
RS1
curl 172.168.138.121
RS2
访问的是==VIP==地址,由LVS调度后访问数据
两次出现不同的效果是因为在制定ipvs规则的时候使用了==rr==轮询的方式
5.2端口映射
1修改RS1的端口
vim /etc/httpd/conf/httpd.conf
![](https://img-blog.csdnimg.cn/img_convert/6a354cecff129e1672038e6b8f63888c.png)
2修改LVS调度地址
在LVS机器上
删除RS1的ipvs服务
ipvsadm -d -t 172.168.138.121:80 -r 192.168.137.140
重新添加
ipvsadm -a -t 172.168.138.121:80 -r 192.168.137.140:8080 -m
客户端测试
curl 172.168.138.121
RS1
curl 172.168.138.121
RS2
能够curl通,说明支持端口映射
5.3 权重 调度算法
编辑虚拟服务
LVS
ipvsadm -E 172.168.137.121:80 -s wrr
删除RS1的ipvs服务
ipvsadm -d -t 172.168.138.121:80 -r 192.168.137.140:8080
重新添加RS1的ipvs服务,添加权重
ipvsadm -a -t 172.168.138.121:80 -r 192.168.137.140:8080 -m -w 3
没有定义的RS2,权重为1
客户端多次访问VIP,RS1 :RS2 =3:1
5.4原地址哈希
只要客户端是同一个ip地址,永远访问的是同一个servers.只要是同一个ip客户端永远往一个固定的server来调度。现在往一个方向调度,就要换成sh算法,
修改ipvs配置
ipvsadm -E -t 172.168.138.121:80 -s sh
测试
curl 172.168.138.121
RS1
curl 172.168.138.121
RS1
5.5目标地址哈希
将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如宽带运营商
只要访问的目标地址是固定的,永远往固定上去调度,
模拟10个页面
RS1上
cd /var/www/html
创建10个页面
for i in {1..10};do echo test$i on RS1 > test$i.html ;done
RS2上执行相同的操作,注意把RS1改为==RS2==
LVS上
更改dh算法
ipvsadm -E -t 172.168.138.121:80 -s dh
测试
测试结果总是往一个机器上调度,权重也不受到影响,可能是之前的操作,LVS记录的分配结果,有缓存
重启ipvsadm .service
systemctl restart ipvsadm .service
ipvsadm -Ln
再重启reboot,让它丢了再缓存,重启后所有的规则全丢了
重启完毕后,通了重加
ipvsadm -Ln
如果没有了,重新添加IPVS规则
重新添加
ipvsadm -A -t 172.168.138.121:80 - s dh
ipvsadm -a -t 172.168.138.121:80 - r 192.168.137.140:8080 -m
ipvsadm -a -t 172.168.138.121:80 - r 192.168.137.135:80 -m
测试
client上
curl 172.168.137.121/test1.html
curl 172.168.137.121/test2.html
curl 172.168.137.121/test3.html
curl 172.168.137.121/test4.html
一旦调度到1上永远是1
6.0命令ipvsadm
6.1常用参数:
-A | 添加一条新的虚拟服务 | -t | TCP协议的虚拟服务 |
-E | 编辑虚拟服务 | -u | UDP协议的虚拟服务 |
-D | 删除虚拟服务 | -f | 说明是经过iptables 标记过的服务类型。 |
-C | 清除所有的虚拟服务规则 | -s | 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc. |
-R | 恢复虚拟服务规则 | -p | 持久稳固的服务。 |
-S | 保存虚拟服务器规则 | -M | 指定客户地址的子网掩码 |
-a | 在一个虚拟服务中添加一个新的真实服务器 | -r | 真实的服务器 |
-e | 编辑某个真实服务器 | -g | 指定LVS 的工作模式为直接路由模式 |
-d | 删除某个真实服务器 | -i | 指定LVS 的工作模式为隧道模式 |
-L | 显示内核中的虚拟服务规则 | -m | 指定LVS 的工作模式为NAT 模式 |
-Z | 将转发消息的统计清零 | -w | 真实服务器的权值 |
-h | 显示帮助信息 | -c | 显示ipvs中目前存在的连接 |
6.2参考实例 参考链接
添加一个虚拟服务,使用轮询算法:
ipvsadm -A -t 192.168.10.10:80 -s rr
修改虚拟服务的算法为加权轮询:
ipvsadm -E -t 192.168.10.10:80 -s wrr
删除一个虚拟服务:
ipvsadm -D -t 192.168.10.10:80
添加一个真实服务器,使用DR模式,设置权重为2:
ipvsadm -a -t 192.168.10.10:80 -r 192.168.10.12 -g -w 2
修改真是服务器的权重为5:
ipvsadm -a -t 192.168.10.10:80 -r 192.168.10.12 -g -w 5
删除一个真实服务器:
ipvsadm -d -t 192.168.10.10:80 -r 192.168.10.12
查看当前虚拟服务和各个RS的权重信息:
ipvsadm -Ln
查看当前ipvs模块中记录的链接信息(可用于观察转发情况):
ipvsadm -lnc
查看当前ipvs模块中的转发情况信息:
ipvsadm -Ln --stats | --rate
6.3命令扩展
查看
ipvsadm -Ln --
--numeric,-n:以数字形式输出地址和端口号
--exact:扩展信息,精确值
--connection,-c:当前IPVS连接输出 --stats:统计信息
--rate :输出速率信息
ipvs规则: /proc/net/ip_vs
ipvs连接: /proc/net/ip_vs_conn
保存及重载规则
保存:
建议保存至 /etc/sysconfig/ipvsadm
ipvsadm-save > /etc/sysconfig/ipvsadm
ipvsadm -Sn>/etc/sysconfig/ipvsadm
systemctl stop ipvsadm.service
重载:
ipvsadm-restore</etc/sysconfig/ipvsadm
ipvsadm -R</PATH/FROM/IPVSADM_FILE
systemctl restart ipvsadm.service