LVS-NAT实现
LVS-NAT实现
1.0网络拓扑图

2.0全局搭建环境
2.1 之后,所有的虚拟机都部署2.2——2.6,除了特殊说明的主机
2.1准备5台虚拟机
分别作为 客户端(client),lvs调度器(LVS),路由器(route),服务器1(RS1),服务器2(RS2)

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.7LVS 启用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.2LVS
- 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.1LVS
-
安装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.140ipvsadm -a -t 172.168.138.121:80 -r 192.168.137.135 -
查看添加如下
ipvsadm -lnIP 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.2route
4.3RS1
-
安装httpd
yum -y install httpd -
重新启动httpd
systemctl restart httpd -
添加主页内容
echo RS1 > /var/www.html/index.html -
查看80端口是否开启
ss -ntl
4.4RS2
-
安装httpd
yum -y install httpd -
重新启动httpd
systemctl restart httpd -
添加主页内容
echo RS2 > /var/www.html/index.html -
查看80端口是否开启
ss -ntl
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

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.121RS1curl 172.168.138.121RS2能够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.121RS1curl 172.168.138.121RS1
5.5目标地址哈希
将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如宽带运营商
只要访问的目标地址是固定的,永远往固定上去调度,
-
模拟10个页面
RS1上
cd /var/www/html创建10个页面
for i in {1..10};do echo test$i on RS1 > test$i.html ;doneRS2上执行相同的操作,注意把RS1改为RS2
-
LVS上
更改dh算法
ipvsadm -E -t 172.168.138.121:80 -s dh -
测试
测试结果总是往一个机器上调度,权重也不受到影响,可能是之前的操作,LVS记录的分配结果,有缓存
重启ipvsadm .service
systemctl restart ipvsadm .serviceipvsadm -Ln
再重启reboot,让它丢了再缓存,重启后所有的规则全丢了
重启完毕后,通了重加
ipvsadm -Ln
如果没有了,重新添加IPVS规则
重新添加
ipvsadm -A -t 172.168.138.121:80 - s dhipvsadm -a -t 172.168.138.121:80 - r 192.168.137.140:8080 -mipvsadm -a -t 172.168.138.121:80 - r 192.168.137.135:80 -m -
测试
client上
curl 172.168.137.121/test1.htmlcurl 172.168.137.121/test2.htmlcurl 172.168.137.121/test3.htmlcurl 172.168.137.121/test4.html一旦调度到1上永远是1
6.0命令ipvsadm
常用参数:
| -A | 添加一条新的虚拟服务 |
|---|---|
| -E | 编辑虚拟服务 |
| -D | 删除虚拟服务 |
| -C | 清除所有的虚拟服务规则 |
| -R | 恢复虚拟服务规则 |
| -S | 保存虚拟服务器规则 |
| -a | 在一个虚拟服务中添加一个新的真实服务器 |
| -e | 编辑某个真实服务器 |
| -d | 删除某个真实服务器 |
| -L | 显示内核中的虚拟服务规则 |
| -Z | 将转发消息的统计清零 |
| -h | 显示帮助信息 |
| -t | TCP协议的虚拟服务 |
| -u | UDP协议的虚拟服务 |
| -f | 说明是经过iptables 标记过的服务类型。 |
| -s | 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc. |
| -p | 持久稳固的服务。 |
| -M | 指定客户地址的子网掩码 |
| -r | 真实的服务器 |
| -g | 指定LVS 的工作模式为直接路由模式 |
| -i | 指定LVS 的工作模式为隧道模式 |
| -m | 指定LVS 的工作模式为NAT 模式 |
| -w | 真实服务器的权值 |
| -c | 显示ipvs中目前存在的连接 |
| -6: | 如果fwmark用的是ipv6地址需要指定此选项。 |
参考实例
添加一个虚拟服务,使用轮询算法:
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

浙公网安备 33010602011771号