借助 Keepalived 就无需手动配置 LVS 只需要编写 keepalived.conf
并且启动他就能自动把 LVS 拉起来。 但是 RS 还是需要手动配置。
Keepalived 配置在第五小节。
前面几个小节全都是针对于手动配置 LVS 和 RS 的实验。

LVS 的 DR 模式工作在二层数据链路层。主要是需要修改转发的 mac 地址
测试过程,需要准备 5 台机器。分别代表Client、Router(路由器)、LVS、RealServer*2 简称 (RS)
准备好一个 VIP 独立网段,工作在 LVS、RealServer*2 三台机器上 172.10.10.2
模拟作为公网接入地址
准备好三个同网段的 IP ,作为 LVS 的 DIP 192.168.22.3
、RealServer *2 的两个 RIP 192.168.223.4
、192.168.223.6
我们就暂时把 Client
放在 172.10.10.100
这个 IP 上
路由器的网卡上配置 172.10.10.1
、192.168.223.2
两个 IP,用于链接 172.10.10.1
和 192.168.223.2
这两个网段
规整:如下
- Client:
172.10.10.100
- 路由器:
172.10.10.1
、192.168.223.2
- LVS DIP
192.168.223.3
- LVS VIP
172.10.10.2
- RS RIP
192.168.223.4
、192.168.223.6
- RS VIP
172.10.10.2
网络拓扑如下:

不区分 Client、Router 、LVS、RS 统一执行安装命令,将相关工具安装完成
yum install -y wget tcpdump vim ipvsadm nginx keepalived
systemctl stop firewalld
配置内核的 IP 转发
vim /etc/sysctl.conf
# 所以使用如下命令可以开发Linux的路由转发功能。
net.ipv4.ip_forward=1
sysctl -p
二、配置 Client 模拟用户
Client
vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 添加如下内容
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=bd95f732-d9a4-4aed-a883-94937fe1272z
DEVICE=ens33
ONBOOT=yes
IPADDR=172.10.10.100
NETMASK=255.255.255.0
DNS1=223.5.5.5
重启网卡
systemctl restart network
二、配置 RealServer
1. 设置两台 RealServer 的 RIP
RS1
vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 添加如下内容
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=bd95f732-d9a4-4aed-a883-94937fe1272z
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.223.4
NETMASK=255.255.255.0
GATEWAY=172.10.10.1
DNS1=223.5.5.5
RS2
# 添加如下内容
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=bd95f732-d9a4-4aed-a883-94937fe1272z
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.223.6
NETMASK=255.255.255.0
GATEWAY=172.10.10.1
DNS1=223.5.5.5
配置完成后准备配置 VIP 地址。但是在配置前需要先关闭 ARP,关闭 ARP 的目的是为了让 RS 的 VIP 不要主动在局域网内被发现。
vim /etc/sysctl.conf
# 添加如下内容
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
sysctl -p
刷新生效
2. 配置两台 RealServer 的 VIP
为 Lo 网卡配置 VIP ,两台 RS 均需要
vim /etc/sysconfig/network-scripts/ifcfg-lo:8
# 添加如下内容
DEVICE=lo:8
IPADDR=172.10.10.2
NETMASK=255.255.255.255
ONBOOT=yes
配置完毕重启两台机器的网卡
systemctl restart network
三、配置 LVS 机器
1. 配置 LVS 的 VIP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=bd95f732-d9a4-4aed-a883-94937fe1272z
DEVICE=ens33
ONBOOT=yes
IPADDR=172.10.10.2
NETMASK=255.255.255.0
GATEWAY=172.10.10.1
DNS1=223.5.5.5
2. 配置 LVS 的 DIP
vim /etc/sysconfig/network-scripts/ifcfg-ens33:1
IPADDR=192.168.223.3
DEVICE="ens33:1"
NAME="ens33:1"
重启网卡
systemctl restart network
3. 配置 LVS 规则
# 创建一条 LVS 规则, VIP 为 172.10.10.2 端口为 80 采用轮询的规则
ipvsadm -A -t 172.10.10.2:80 -s rr
# 给 172.10.10.2:80 这条 LVS 规则添加一条 RS IP 为 192.168.223.6
ipvsadm -a -t 172.10.10.2:80 -r 192.168.223.6
# 给 172.10.10.2:80 这条 LVS 规则添加一条 RS IP 为 192.168.223.4
ipvsadm -a -t 172.10.10.2:80 -r 192.168.223.4
查看是否已经创建完毕 ipvsadm -Ln
清空 LVS 策略 ipvsadm -C
四、测试验证
配置完成后,我们需要再各个节点测试路由状态是否正常。尤其是 RS 节点要尝试 ping 一下 Client 这主要用于测试默认网关是否有配置。
RS、LVS 的网关配置至关重要。常需要根据 ip ro 查看。
启动 RS 的 ngx
nginx -c /etc/nginx/nginx.conf
curl -v 'http://172.10.10.2'
在 LVS 节点上抓包,抓来自 Client 请求的数据报文 -e 可以抓到 mac 地址
tcpdump -i ens33 -nne src host 172.10.10.100
从中我们可以看相同的数据报文在修改 mac 地址为 RS 的 mac 后,转发给了 RS
节点
五、Keepalived 配置
LVS 只是一个转发 IP 报文的功能,但是他自身是没有健康探测能力的,如果后端 RS 死了,他自身是不知道的。因此我们还是需要接入 Keepalived 这个组件。
Keepalived
他自己能支持 LVS
因此我们写好 Keepalived
配置文件后就无需手动配置 LVS 了。
启动 Keepalived
他会自动配置 LVS
但是 RS
还是需要根据上面的 第二点
手动配置一下。
我们采用双 LVS 架构,一个作为 Master
另一个作为 BackUp
当 Master
下线后 VIP
会自动飘移到 BackUp
上。
keepalived 启动命令:
systemctl restart keepalived
keepalived 配置路径:
/etc/keepalived/keepalived.conf
如下 Master 的配置
global_defs {
router_id LVS1 # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state MASTER # 两个 DS,一个为 MASTER,一个为 BACKUP
interface ens33 # 当前 IP 对应的网络接口
virtual_router_id 62 # 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样
priority 1000 # 优先级值设定:MASTER 要比 BACKUP 的值大
advert_int 1 # 通告时间间隔:单位秒,主备要一致
# 启用抢占
preempt
preempt_delay 3 # 延迟3秒抢占
# 快速切换设置
garp_master_delay 1
garp_master_repeat 3
authentication { # 认证机制,主从节点保持一致即可
auth_type PASS
auth_pass 1111
}
unicast_src_ip 192.168.223.3 # LVS master 的内网 IP
unicast_peer {
192.168.223.8 # 配置上 LVS BackUp 的内网 IP
}
virtual_ipaddress {
# 无需手动配置 vim /etc/sysconfig/network-scripts/ifcfg-ens33:200
# 在 keepalived 配置文件中修改这条记录,keepalived 会自动帮你操作
172.10.10.2/24 dev ens33 label ens33:200
}
}
# VIP 与端口
virtual_server 172.10.10.2 80 {
delay_loop 3 # 设置健康状态检查时间
lb_algo rr # 设置负载调度的算法,wrr/rr等
lb_kind DR # 这里测试用了 Direct Route 模式
persistence_timeout 0 # 持久连接超时时间即会话保持时间,这段时间内同一ip发起的请求将被转发到同一个 RS
protocol TCP
# RIP 与端口
real_server 192.168.223.4 80 {
weight 1
TCP_CHECK {
connect_timeout 2
retry 3 # 旧版本为 nb_get_retry
delay_before_retry 3
connect_port 80
}
}
# RIP 与端口
real_server 192.168.223.6 80 {
weight 1
TCP_CHECK {
connect_timeout 2
retry 3
delay_before_retry 3
connect_port 80
}
}
}
如下 BackUp 的配置
global_defs {
router_id LVS1 # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state BACKUP # 两个 DS,一个为 MASTER,一个为 BACKUP
interface ens33 # 当前 IP 对应的网络接口
virtual_router_id 62 # 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样
priority 80 # 优先级值设定:MASTER 要比 BACKUP 的值大
advert_int 1 # 通告时间间隔:单位秒,主备要一致
# 添加更快的故障检测
garp_master_delay 1
garp_master_repeat 1
authentication { # 认证机制,主从节点保持一致即可
auth_type PASS
auth_pass 1111
}
unicast_src_ip 192.168.223.8 # # LVS backup 自己的内网 IP
unicast_peer {
192.168.223.3 # 如果有多个主机组成集群,把其它主机ip都写上
}
virtual_ipaddress {
172.10.10.2/24 dev ens33 label ens33:200
}
}
# 关注一下
# LB 配置,定义对外提供服务的LVS的VIP以及port
virtual_server 172.10.10.2 80 {
delay_loop 3 # 设置健康状态检查时间
lb_algo rr # 设置负载调度的算法,wrr/rr等
lb_kind DR # 这里测试用了 Direct Route 模式
persistence_timeout 0 # 持久连接超时时间即会话保持时间,这段时间内同一ip发起的请求将被转发到同一个 RS
protocol TCP
real_server 192.168.223.4 80 {
weight 1
TCP_CHECK {
connect_timeout 2
retry 3 # 旧版本为 nb_get_retry
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.223.6 80 {
weight 1
TCP_CHECK {
connect_timeout 2
retry 3
delay_before_retry 3
connect_port 80
}
}
}
六、ARP 相关
# 查看所有 ARP 缓存
ip neigh show
# 查看指定设备的 ARP 缓存
ip neigh show dev eth0
# 查看指定 IP 的 ARP
ip neigh show 192.168.1.100
# 清除所有 ARP 缓存
ip neigh flush all
# 清除指定设备的缓存
ip neigh flush dev eth0
# 删除特定 IP 的 ARP
ip neigh del 192.168.1.100 dev eth0
七、路由配置相关快捷命令
ip ro 查看路由 当然也可以用 route -n
ip ro 返回如下
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 scope link
default via 192.168.1.1 dev eth0
表示默认路由,所有无法匹配其他路由的流量将发送到网关192.168.1.1
,通过eth0
接口。192.168.1.0/24 dev eth0 scope link
表示本地网络192.168.1.0/24
直接连接到eth0
,没有需要经过网关的中转。
添加默认路由
这将添加一条默认路由,指示所有无法匹配其他路由的流量通过 192.168.1.1 网关转发,使用 eth0 网络接口。
sudo ip route add default via <网关地址> dev <网络接口>
sudo ip route add default via 192.168.1.1 dev eth0
添加特定网络路由
你可以添加路由来指示如何到达特定的网络。例如,要到达 10.0.0.0/24
网络并通过 192.168.1.1
网关转发,可以使用以下命令:
sudo ip route add 10.0.0.0/24 via 192.168.1.1 dev eth0
这表示:所有要到达 10.0.0.0/24
网络的流量将通过 192.168.1.1
网关转发,使用 eth0
网络接口。
添加直接连接路由
如果你要在本地网络内配置路由,通常不需要网关。例如,要到达 192.168.2.0/24
网络,并且该网络直接连接到 eth1
,可以使用:
sudo ip route add 192.168.2.0/24 dev eth1
这表示:要到达 192.168.2.0/24
网络,直接通过 eth1
网络接口。
删除路由使用 del
选项。
删除默认路由
如果你想删除默认路由,可以执行:
sudo ip route del default
删除特定网络路由
要删除到特定网络的路由,可以指定目标网络。例如,要删除到 10.0.0.0/24
网络的路由:
sudo ip route del 10.0.0.0/24
修改路由
修改路由是通过删除现有路由并添加新路由来实现的。例如,如果你想将 10.0.0.0/24
网络的路由网关从 192.168.1.1
改为 192.168.2.1
,你可以执行以下操作:
sudo ip route del 10.0.0.0/24 via 192.168.1.1
sudo ip route add 10.0.0.0/24 via 192.168.2.1
路由表字段详解
- Destination:目标地址,可以是单个 IP 地址(例如
192.168.1.0/24
)或default
(表示默认路由)。 - Gateway:转发该流量的网关地址。如果没有网关,说明这是直接连接的网络。
- Interface:用于此路由的网络接口(例如
eth0
,wlan0
)。 - Scope:作用范围,通常为
link
(表示直接连接的网络)或global
(表示可以通过网络到达的地址)。 - Metric:路由的优先级,值越小优先级越高,通常用于多个路由指向相同目的地时的选择。
文章评论(0)