华子目录
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的MAC
VS调度主机
接收到数据帧
后把数据帧
中的VIP的MAC
改为RS1的MAC
,此时数据帧
中的数据
为客户端IP+客户端的MAC
+VIP+RS1的MAC
RS1
收到数据包
后做出响应回传数据包
,响应数据包
中的内容
为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
网卡用作vip
RS
上一个仅主机
网卡用于内网通信
,lo
网卡用作vip
client
的网关
指向router
的nat
网卡,lvs,RS
的网关
指向router
的仅主机
网卡
主机准备
client
上一个nat
网卡
router
上一个nat
网卡,一个仅主机
网卡
- 由于
router
的nat模式
和仅主机模式
的网卡
处于不同vlan
,两个网卡要想通信
,就必须打开Linux内核路由转发功能
lvs
上一个仅主机
网卡用于内网通信
,lo
网卡用作vip
RS
上一个仅主机
网卡用于内网通信
,lo
网卡用作vip
实验步骤
1.client
的ip
设定
nat
网卡:172.25.254.10/24
- 网关:
172.25.254.100/24
bash
[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]
bash
[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
bash
[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]
bash
[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
开启路由转发功能
bash
[root@router ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #在文件末尾添加
bash
[root@router ~]# sysctl -p #加载
net.ipv4.ip_forward = 1
4.lvs
主机中的ip
设定
仅主机
网卡:192.168.0.200/24
lo
网卡设置为vip
:192.168.0.100/32
网关
指向:192.168.0.10/24
bash
[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]
bash
[root@lvs ~]# ip addr add 192.168.0.100/32 dev lo
bash
[root@lvs ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:35:a8:7c brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 192.168.0.200/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::4e21:e4b4:36e:6d14/64 scope link noprefixroute
valid_lft forever preferred_lft forever
bash
[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/24
lo
网卡设置为vip
:192.168.0.100/32
网关
指向:192.168.0.10/24
bash
[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]
bash
[root@webserver1 ~]# ip addr add 192.168.0.100/32 dev lo
bash
[root@webserver1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:5f:4a:ff brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::7baa:9520:639b:5e48/64 scope link noprefixroute
valid_lft forever preferred_lft forever
bash
[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/24
lo
网卡设置为vip
:192.168.0.100/32
网关
指向:192.168.0.10/24
bash
[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]
bash
[root@webserver2 ~]# ip addr add 192.168.0.100/32 dev lo
bash
[root@webserver2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.100/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:ef:47:71 brd ff:ff:ff:ff:ff:ff
altname enp3s0
altname ens160
inet 192.168.0.22/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::5db8:7a0d:b282:fdbf/64 scope link noprefixroute
valid_lft forever preferred_lft forever
bash
[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
,才能再修改某一网卡
bash
[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
,才能再修改某一网卡
bash
[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
上
bash
[root@webserver1 ~]# yum install httpd -y
bash
[root@webserver1 ~]# echo webserver1 > /var/www/html/index.html
webserver2
上
bash
[root@webserver2 ~]# yum install httpd -y
bash
[root@webserver2 ~]# echo webserver2 > /var/www/html/index.html
9.RS
上启动web
服务
webserver1
上
bash
[root@webserver1 ~]# systemctl enable --now httpd
webserver2
上
bash
[root@webserver2 ~]# systemctl enable --now httpd
10.安装lvs
软件包ipvsadm
并启动
bash
[root@lvs ~]# yum install ipvsadm -y
bash
[root@lvs ~]# touch /etc/sysconfig/ipvsadm #在启动之前必须要有这个文件,否则启动失败
[root@lvs ~]# systemctl restart ipvsadm
[root@lvs ~]# systemctl enable ipvsadm
11.设置lvs
策略并保存
-g
表示dr模式
bash
#当访问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
bash
[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
bash
[root@client ~]# curl 192.168.0.100
webserver2
[root@client ~]# curl 192.168.0.100
webserver1