Failover介绍
Failover特性是Cisco安全产品高可用性的一个解决方案,目的是为了提供不间断的服务,当主设备down掉的时候,备用设备能够马上接管主设备的工作,进而保持通信的连通性
A/S_Failover技术
一对ASA能够配对成为一个A/S_Failover组,提供设备级冗余,设备的健康状况式通过LAN-F0接口来监控的
一个Failover组,存在两组角色:
1)关于Primary/Secondary
一个物理设备被指定为primary设备
一个物理设备被指定为secondary设备
Primary和Secondary是物理概念,不会被切换
2)关于Active/Standby
一个物理设备被选择成为Active(转发流量)
一个物理设备被选择成为Standby(热备用状态,等待)
Active和Standby是逻辑概念,可以互相切换
A/A_Failover技术
安全设备可以成对搭配成A/A的F0来提供设备及冗余和负载分担,设备彼此互为备份也能同时转发流量。使用虚拟子防火墙,被归为两个F0组,一个物理防火墙指挥再一个F0组中成为active
Fai lover管理
Failover的部署方式
无状态化的FO
1)只提供硬件冗余
2)当切换发生时,所有已经建立的状态话跟踪的连接都将被丢弃
3)用户必须重新建立连接
状态化的F0
1)扩展了无状态化F0的功能
2)提供了硬件和状态话装项的冗余
3)故障切换期间,连接依旧保持
4)用户没必要重新建立连接
5)在两个设备之间需要一个状态化链路(是LAN・F0链路之外的另外一条链路)
Failover的接口类型
LAN FO接口
用来确定每一个单元的运行状态并复制和同步配置(心跳线)
Link F0接口 (状态化接口)
1)用于传递状态信息到Standby单元
2)可以是一个独立的接口,或者和其他接口共享,包括F0接口(不推荐,最好是独立接口)
3)可以考虑将两个功能置于一根线上,不推荐。
Failover的健康监控
1、单元健康监控
1)ASA通过监控F0链路来确认其他单元的健康状况
2)设备通过F0接口来交换helo消息
3)当收不到来自于Active设备的响应时,切换发生
2、接口健康监控
1)每一个网络接口都可以被监控
2)设备通过监控接口交换helo消息
3)当Active设备上一个被指定为监控的接口出现故障时,切换发生
FaiIover部署方针
- 部署FO时,考虑如下的部署方针:
1)可以使用密钥来保护F0通讯
2)如果状态化链路和F0链路共享接口,需要使用一个可用的高速率的接口
3)调整F0的各项参数来实现快速切换
4)在active和standby设备上手动指定MAC地址,来阻止一些可能阻断网络流量的偶然事件
5)在所有连接防火墙设备的交换机接口上,考虑配置端口快速(PortFast)
- 如果发现备用配置与主用有区分,可通过“write standby”命令,实现现有主用配置完全覆盖备用设备配置
- 在有需求的情况下,可通过“logging standbyw命令同时输出备用设备日志信息,但这会同时输出两份日志
- 备用设备永远不参与路由进程
Failover实验拓扑
Python脚本化,配置完毕后通过show failove 、show failove statu查看效果
#需要先配置SSH
# ********************************************************************
# Author: LinWeiWei
# Date: 2022-03-06
# Description: paramiko SSH module and provides Cisco ASA configuration services
# ********************************************************************
# The standard library
import paramiko
import time
# Create input info
def input_select():
print("""------------Life is short,use python------------
1、VLAN Access config
2、pass
3、pass
4、pass
5、pass
6、pass
7、pass
8、pass
9、pass
10、quit
""")
temp = input('Hello world!Please enter 1-10 numbers choice effect : ')
global guess
guess = int(temp)
# Create an SSH class
class MySSH(object):
# Create an SSH info
def __init__(self, ip, username, password):
self._ip = ip
self._username = username
self._password = password
# Create an SSH connection
def connect(self):
global ssh
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Trusting SSH Connections
ssh.connect(hostname=self._ip, port=22, username=self._username, password=self._password, timeout=3)
print("Successful connection", self._ip)
# Exective command
def exec_command(object,
cd1='', cd2='', cd3='', cd4='', cd5='', cd6='', cd7='', cd8='', cd9='', cd10='',
cd11='', cd12='', cd13='', cd14='', cd15='', cd16='', cd17='', cd18='', cd19='', cd20='',
cd21='', cd22='', cd23='', cd24='', cd25='', cd26='', cd27='', cd28='', cd29='', cd30='',
cd31='', cd32='', cd33='', cd34='', cd35='', cd36='', cd37='', cd38='', cd39='', cd40='',
cd41='', cd42='', cd43='', cd44='', cd45='', cd46='', cd47='', cd48='', cd49='', cd50='',
cd51='', cd52='', cd53='', cd54='', cd55='', cd56='', cd57='', cd58='', cd59='', cd60=''):
cli = ssh.invoke_shell()
cli.send(cd1 + "\n")
cli.send(cd2 + "\n")
cli.send(cd3 + "\n")
cli.send(cd1 + "\n")
cli.send(cd2 + "\n")
cli.send(cd3 + "\n")
cli.send(cd4 + "\n")
cli.send(cd5 + "\n")
cli.send(cd6 + "\n")
cli.send(cd7 + "\n")
cli.send(cd8 + "\n")
cli.send(cd9 + "\n")
cli.send(cd10 + "\n")
cli.send(cd11 + "\n")
cli.send(cd12 + "\n")
cli.send(cd13 + "\n")
cli.send(cd14 + "\n")
cli.send(cd15 + "\n")
cli.send(cd16 + "\n")
cli.send(cd17 + "\n")
cli.send(cd18 + "\n")
cli.send(cd19 + "\n")
cli.send(cd20 + "\n")
cli.send(cd21 + "\n")
cli.send(cd22 + "\n")
cli.send(cd23 + "\n")
cli.send(cd24 + "\n")
cli.send(cd25 + "\n")
cli.send(cd26 + "\n")
cli.send(cd27 + "\n")
cli.send(cd28 + "\n")
cli.send(cd29 + "\n")
cli.send(cd30 + "\n")
cli.send(cd31 + "\n")
cli.send(cd32 + "\n")
cli.send(cd33 + "\n")
cli.send(cd34 + "\n")
cli.send(cd35 + "\n")
cli.send(cd36 + "\n")
cli.send(cd37 + "\n")
cli.send(cd38 + "\n")
cli.send(cd39 + "\n")
cli.send(cd40 + "\n")
cli.send(cd41 + "\n")
cli.send(cd42 + "\n")
cli.send(cd43 + "\n")
cli.send(cd44 + "\n")
cli.send(cd45 + "\n")
cli.send(cd46 + "\n")
cli.send(cd47 + "\n")
cli.send(cd48 + "\n")
cli.send(cd49 + "\n")
cli.send(cd50 + "\n")
cli.send(cd51 + "\n")
cli.send(cd52 + "\n")
cli.send(cd53 + "\n")
cli.send(cd54 + "\n")
cli.send(cd55 + "\n")
cli.send(cd56 + "\n")
cli.send(cd57 + "\n")
cli.send(cd58 + "\n")
cli.send(cd59 + "\n")
cli.send(cd60 + "\n")
time.sleep(3)
output = cli.recv(65535).decode('utf-8').replace('\r', '')
print(output)
ssh.close()
# Modify configuration commands based on scenarios
input_select()
a = MySSH(ip="10.88.1.26", username="admin", password="P@ssw0rd!@#")
a.connect()
a.exec_command() #键入代码
ASA1
int g0/2
no shut
fai lan unit primary
fai lan int F0 g0/2
fai link F0 g0/2
fai int ip F0 5.2.9.1 255.255.255.0 s 5.2.9.2
ASA2
int g0/2
no shut
fai lan unit secondary
fai lan int F0 g0/2
fai link F0 g0/2
fai int ip F0 5.2.9.1 255.255.255.0 s 5.2.9.2