双机热备
防火墙高可用性也称双机热备,指基于两台设备的高可用性。双机热备的模式分为主备模式和主主模式。
主备模式
主-备方式即指的是一台设备处于某种业务的激活状态(即Active状态),另一台设备处于该业务的备用状态(即Standby状态)。
工作机和备用机通过心跳线连接,备用机实时监视工作机的情况,当工作机出现问题,备用机就接管工作。
在这个状态下,工作防火墙响应ARP请求,并且转发网络流量;备用防火墙不响应ARP请求,也不转发网络流量。主备之间同步状态信息和配置信息。
主主模式
而双主机方式即指两种不同业务分别在两台设备上互为主备状态(即Active-Standby和Standby-Active状态)。
主主模式下,两个防火墙并行工作,都响应ARP请求,并且都转发网络流量。主主模式可以提高数据包处理的吞吐量,平衡网络负载,优化网络性能。
双机热备原理
防火墙的双机热备功能实在虚拟路由冗余协议(VRRP)的基础上扩展而来。VRRP是一种容错协议,它保证当主机的下一条路由出现故障时,由备份路由器自动代替出现故障的路由器完成报文转发任务。
如上图所示,将局域网内的一组路由器划分为一个VRRP备份组,相当于一个虚拟路由器,这台虚拟路由器有自己的虚拟IP和虚拟MAC。局域网的主机可以将默认网关设置为虚拟IP地址,在主机看来是和虚拟路由器通信的。
VRRP备份组中的多个路由器会根据管理员制定的VRRP备份组优先级确定各自的状态。优先级高的路由器为Master,其余路由器为Backup。
Master 周期性向备份组内所有 Backup 发送 VRRP 通告报文,以公布其配置信息(优先级等)和工作状况。
Keepalived
Keepalived是基于vrrp协议的一款高可用软件。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
Keepalived + LVS
配置步骤:
- 安装软件
在LVS-1和LVS-2两台主机上安装ipvsadm和keepalived
yum install ipvsadm keepalived -y
- 配置Keepalived
keepalived底层有关于IPVS的功能模块,可以直接在其配置文件中实现LVS的配置,不需要通过ipvsadm命令再单独配置。
Master配置:/etc/keepalived/keepalived.conf
global_defs {
router_id LVS ## 不一定要与主机名相同,也不必与BACKUP的名字一致
}
vrrp_instance VI_1 {
state MASTER ## LVS-1配置了为主,另外一台LVS-2配置为BACKUP
interface eth0 ## 注意匹配网卡名
virtual_router_id 51 ## 虚拟路由ID(0-255),在一个VRRP实例中主备服务器ID必须一样
priority 150 ## 优先级值设定:MASTER要比BACKUP的值大
advert_int 3 ## 通告时间间隔:单位秒,主备要一致
authentication { ##认证机制
auth_type PASS ## 默认PASS; 有两种:PASS或AH
auth_pass 1111 ## 默认1111; 可多位字符串,但仅前8位有效
}
virtual_ipaddress {
138.138.82.222 ## 虚拟IP;可多个,写法为每行一个
}
}
virtual_server 138.138.82.222 80 {
delay_loop 3 ## 设置健康状态检查时间
lb_algo rr ## 调度算法,这里用了rr轮询算法,便于后面测试查看
lb_kind DR ## 这里测试用了Direct Route 模式,
# persistence_timeout 1 ## 持久连接超时时间,先注释掉,不然在单台上测试时,全部会被lvs调度到其中一台Real Server
protocol TCP
real_server 138.138.82.12 80 {
weight 1
TCP_CHECK {
connect_timeout 10 ##设置响应超时时间
nb_get_retry 3 ##设置超时重试次数
delay_before_retry 3 ##设置超时重试间隔时间
connect_port 80
}
}
real_server 138.138.82.13 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
BACKUP配置:/etc/keepalived/keepalived.conf
global_defs {
router_id LVS
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 120
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
138.138.82.222
}
}
virtual_server 138.138.82.222 80 {
delay_loop 3
lb_algo rr
lb_kind DR
# persistence_timeout 1
protocol TCP
real_server 138.138.82.12 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 138.138.82.13 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}