华子目录
- `lvs-dr`(企业当中最常用)
- dr模式数据逻辑
- dr模式数据传输过程
- dr模式的特点
- 实验拓扑
- 实验主机准备
- 解决vip响应问题
- 限制响应级别:`arp_ignore`
- 限制通告级别:`arp_announce`
- 实验步骤
- 1.`client`的`ip`设定
- 2.`router`上的`ip`设定
- 3.`router`开启路由转发功能
- 4.`lvs`主机中的`ip`设定
- 5.`webserver1`主机中的`ip`设定
- 6.`webserver2`主机中的`ip`设定
- 7.`RS`主机禁用`arp`响应功能(让其只有`lvs`进行`响应`)
- 8.`RS`上配置`web`服务
- 9.`RS`上启动`web`服务
- 10.安装`lvs`软件包`ipvsadm`并启动
- 11.设置`lvs`策略并保存
- 12.测试
lvs-dr(企业当中最常用)
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址源IP/PORT,以及目标IP/PORT均保持不变
dr模式数据逻辑

- 在
DR模式中,RS接收到访问请求后不需要回传给VS调度器,而是直接把回传数据发送给client客户端,所以RS和vs上都要有vip
dr模式数据传输过程

客户端发送数据帧给vs调度主机,数据帧中内容为客户端IP+客户端的MAC+VIP+VIP的MACVS调度主机接收到数据帧后把数据帧中的VIP的MAC改为RS1的MAC,此时数据帧中的数据为客户端IP+客户端的MAC+VIP+RS1的MACRS1收到数据包后做出响应回传数据包,响应数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC
dr模式的特点
Director(vs调度器)和各RS都配置有VIP- 确保
前端路由器将目标IP为VIP的请求报文发往Director RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络(中间不能加路由器)RIP的网关不能指向DIP,以确保响应报文不会经由Director。需要指向边界路由的内网地址RS和Director要在同一个物理网络请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client不支持端口映射(端口不能修改)- 由于
dr模式下源目ip不变,只有二层mac发生变化,所以vs和rs的端口必须保持一致 RS可使用大多数OS系统- 在
RS上修改内核参数以限制arp通告及应答级别(使其只能接收,不能响应) vs是知道rs的主机网卡的mac,所以vs和rs需要处于同一vlan中,中间不能加路由器
实验拓扑

内网由仅主机ip负责通信,vip负责对外client和router之间是互联网。由于实验环境有限,为了让client访问到rs上,我们让client的网关指向router的nat,来模拟外网互通。lvs和rs的网关都指向router的仅主机(边界路由器的内网地址)- 为了
简单配置,对lo网卡进行设定(也可以对eth0网卡设定),使其成为vip
实验主机准备
- 准备
5台机子,一台client,一台router,一台lvs,两台webserver充当RS client上一个nat网卡router上一个nat网卡,一个仅主机网卡lvs上一个仅主机网卡用于内网通信,lo网卡用作vipRS上一个仅主机网卡用于内网通信,lo网卡用作vipclient的网关指向router的nat网卡,lvs,RS的网关指向router的仅主机网卡
主机准备

client上一个nat网卡

router上一个nat网卡,一个仅主机网卡

- 由于
router的nat模式和仅主机模式的网卡处于不同vlan,两个网卡要想通信,就必须打开Linux内核路由转发功能
lvs上一个仅主机网卡用于内网通信,lo网卡用作vip

RS上一个仅主机网卡用于内网通信,lo网卡用作vip


解决vip响应问题
dr模型中各主机上均需要配置vip,解决地址冲突的方式有三种:
- 在
前端网关做静态绑定 - 在
各RS使用arptables - 在
各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告1:尽量避免将接口信息向非直接连接网络进行通告2:必须避免将接口信息向非本网络进行通告
实验步骤
1.client的ip设定
nat网卡:172.25.254.10/24- 网关:
172.25.254.100/24
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0[ethernet][ipv4]
address=172.25.254.10/24,172.25.254.100
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy]
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.25.254.100 0.0.0.0 UG 100 0 0 eth0
172.25.254.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
2.router上的ip设定
nat网卡:172.25.254.100/24仅主机网卡:192.168.0.10/24
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0[ethernet][ipv4]
address=172.25.254.100/24
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy]
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1[ethernet][ipv4]
address=192.168.0.10/24
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy]
3.router开启路由转发功能
[root@router ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #在文件末尾添加
[root@router ~]# sysctl -p #加载
net.ipv4.ip_forward = 1
4.lvs主机中的ip设定
仅主机网卡:192.168.0.200/24lo网卡设置为vip:192.168.0.100/32网关指向:192.168.0.10/24
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0[ethernet][ipv4]
address=192.168.0.200/24,192.168.0.10
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy]
[root@lvs ~]# ip addr add 192.168.0.100/32 dev lo
[root@lvs ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.0.100/32 scope global lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:35:a8:7c brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.0.200/24 brd 192.168.0.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::4e21:e4b4:36e:6d14/64 scope link noprefixroutevalid_lft forever preferred_lft forever
[root@lvs ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.10 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
5.webserver1主机中的ip设定
仅主机网卡:192.168.0.11/24lo网卡设置为vip:192.168.0.100/32网关指向:192.168.0.10/24
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0[ethernet][ipv4]
address=192.168.0.11/24,192.168.0.10
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy]
[root@webserver1 ~]# ip addr add 192.168.0.100/32 dev lo
[root@webserver1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.0.100/32 scope global lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:5f:4a:ff brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::7baa:9520:639b:5e48/64 scope link noprefixroutevalid_lft forever preferred_lft forever
[root@webserver1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.10 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
6.webserver2主机中的ip设定
仅主机网卡:192.168.0.22/24lo网卡设置为vip:192.168.0.100/32网关指向:192.168.0.10/24
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0[ethernet][ipv4]
address=192.168.0.22/24,192.168.0.10
method=manual[ipv6]
addr-gen-mode=default
method=auto[proxy]
[root@webserver2 ~]# ip addr add 192.168.0.100/32 dev lo
[root@webserver2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.0.100/32 scope global lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:ef:47:71 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.0.22/24 brd 192.168.0.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::5db8:7a0d:b282:fdbf/64 scope link noprefixroutevalid_lft forever preferred_lft forever
[root@webserver2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.10 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
7.RS主机禁用arp响应功能(让其只有lvs进行响应)
webserver1上- 只有先修改
all,才能再修改某一网卡
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
webserver2上- 只有先修改
all,才能再修改某一网卡
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
- 以上配置为
临时修改,重启无效。若想永久生效,则需要在/etc/sysctl.conf文件中添加
8.RS上配置web服务
webserver1上
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo webserver1 > /var/www/html/index.html
webserver2上
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver2 > /var/www/html/index.html
9.RS上启动web服务
webserver1上
[root@webserver1 ~]# systemctl enable --now httpd
webserver2上
[root@webserver2 ~]# systemctl enable --now httpd
10.安装lvs软件包ipvsadm并启动
[root@lvs ~]# yum install ipvsadm -y
[root@lvs ~]# touch /etc/sysconfig/ipvsadm #在启动之前必须要有这个文件,否则启动失败[root@lvs ~]# systemctl restart ipvsadm
[root@lvs ~]# systemctl enable ipvsadm
11.设置lvs策略并保存
-g表示dr模式
#当访问vip的80端口时,轮询调度到RS的80端口上
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.11:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.22:80 -g
[root@lvs ~]# 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.0.100:80 rr-> 192.168.0.11:80 Route 1 0 0-> 192.168.0.22:80 Route 1 0 0
[root@lvs ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.11:http -g -w 1
-a -t lvs:http -r 192.168.0.22:http -g -w 1
12.测试
client端访问vip
[root@client ~]# curl 192.168.0.100
webserver2
[root@client ~]# curl 192.168.0.100
webserver1
