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









