lvs-dr模式实验详解

华子目录

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
相关推荐
GeW11 小时前
新质生产力路线图Linux、数据库、国产化替代一次讲透
linux
aningx13 小时前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位14 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
骑着蜗牛撵大象32716 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
众壹新能源科技16 小时前
逆变器自带无功不够用,加装5MVar SVG后功率因数从0.85回到0.99
运维·人工智能·自动化
..Dauntless..16 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
裕晟资质规划16 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
QMCY_jason16 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特16 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器
轻舟技术A16 小时前
Provider 不属于 Agent 核心:rpi 的分层理由与收益
服务器·网络