Доброго времени суток!!!
Наверное, многие уже сталкивались с проблемой падения линий в сторону провайдеров и, как следствие, остановки рабочего процесса на предприятии. Иногда это случается на стороне самого провайдера, иногда из-за отказа внутреннего оборудования или линий.
Есть масса способов организовать отказоустойчивое соединение. Сегодня я расскажу, как сделать отказоустойчивую схему, имея под рукой два устройства cisco PIX/ASA. Для этого нам придется настроить LAN-Based Failover («Failover через локальную сеть»).
Приглашаю под кат…
Схема у нас будет следующая:
Итак, что у нас есть на схеме:
- FW1 (primary) – первый firewall, который будет главным по умолчанию. Outside интерфейс – 1.1.1.1/24 (standby IP – 1.1.1.2/24), inside интерфейс – 10.10.10.1/24 (standby IP – 10.10.10.2/24), интерфейс для failover IP – 192.168.1.1/24 (standby IP – 192.168.1.2/24), интерфейс state failover IP – 172.16.1.1/24 (standby IP – 172.16.1.2/24).
- FW2 (standby) – второй firewall, который будет резервным по умолчанию. Outside интерфейс – 1.1.1.2/24 (standby IP – 1.1.1.1/24), inside интерфейс – 10.10.10.2/24 (standby IP – 10.10.10.1/24), интерфейс для failover IP – 192.168.1.2/24 (standby IP – 192.168.1.1/24), интерфейс state failover IP – 172.16.1.2/24 (standby IP – 172.16.1.1/24). (но пока не ставьте IP – адреса на интерфейсы, по ходу настроек все поймете :)).
- Remote_Router – роутер для эмуляции провайдера (или интернета). IP – адрес на интерфейсе в сторону наших устройств безопасности 1.1.1.200/24, Loopback интерфейс IP – 2.2.2.2/32 (будем его пинговать с локальной машины).
- SW1 – обычный коммутатор для сбора линий в одном устройстве. Все интерфейсы в одном vlan.
- SW2 – обычный коммутатор для организации связи между FW1 и FW2. Имеется 2 vlan (один используется для интерфейсов firewall, второй – для интерфейсов state failover).
- SW3 – обычный коммутатор для сбора линий в локальной сети. Все интерфейсы в одном vlan.
- Local_PC – компьютер в локальной сети. IP – 10.10.10.200/24. Шлюз по умолчанию 10.10.10.1/24.
Приступаем к настройкам. Настроим для начала Remote_Router.
Router>en
Router#conf t
Router(config)#hostname Remote_Router
Remote_Router(config)#int fa 0/0
Remote_Router(config-if)#ip address 1.1.1.200 255.255.255.0
Remote_Router(config-if)#no sh
Remote_Router(config-if)#exit
Remote_Router(config)#int loopback 0
Remote_Router(config-if)#ip address 2.2.2.2 255.255.255.255
Remote_Router(config-if)#exit
Remote_Router(config)#exit
Remote_Router#wr
Все в порядке. Идем дальше.
Для настройки Failover в GNS3 необходимо включить данные возможности на устройствах (я использую PIX 525 с IOS pix723.bin). Как это делать, можно посмотреть вот тут (если вы делаете на реальном оборудовании, то просто проверьте, позволяет ли вам делать Failover ваша лицензия командой show version).
Вот что у меня позволено делать на устройствах после включения дополнительных функций:
Надеюсь, у вас получилось включить нужные нам функции. Теперь заходим на первый (главный) PIX/ASA и делаем следующее:
pixfirewall> en
Password:
pixfirewall# conf t
pixfirewall(config)# hostname FW1
FW1(config)# enable password cisco
FW1(config)# int ethernet 0
FW1(config-if)# nameif outside
INFO: Security level for "outside" set to 0 by default.
FW1(config-if)# ip address 1.1.1.1 255.255.255.0 standby 1.1.1.2 – назначаем IP – адрес на интерфейсе и сразу прописываем дополнительный;
FW1(config-if)# no shutdown
FW1(config-if)# exit
FW1(config)# int ethernet 1
FW1(config-if)# nameif inside
INFO: Security level for "inside" set to 100 by default.
FW1(config-if)# ip address 10.10.10.1 255.255.255.0 standby 10.10.10.2
FW1(config-if)# no shutdown
FW1(config-if)# exit
FW1(config)# access-list FOR_NAT extended permit ip 10.10.10.0 255.255.255.0 any – создаем список для NAT;
FW1(config)# nat (inside) 1 access-list FOR_NAT – определяем сети для NAT, согласно списка;
FW1(config)# global (outside) 1 interface – включаем NAT на интерфейсе outside;
INFO: outside interface address added to PAT pool
FW1(config)# route outside 0.0.0.0 0.0.0.0 1.1.1.200 – прописываем маршрут по умолчанию;
FW1(config)# failover lan enable – включаем failover через локальную сеть;
FW1(config)# failover lan unit primary – определяем это устройство как главное (primary);
FW1(config)# failover lan interface failover ethernet2 – определяем интерфейс для failover;
INFO: Non-failover interface config is cleared on Ethernet2 and its sub-interfaces
FW1(config)# failover interface ip failover 192.168.1.1 255.255.255.0 standby 192.168.1.2 – назначаем IP – адрес на этот интерфейс и прописываем сразу дополнительный IP;
FW1(config)# interface ethernet 2
FW1(config-if)# no shutdown – включаем интерфейс;
FW1(config-if)# exit
FW1(config)# failover link state ethernet3 – определяем интерфейс для Stateful failover (опционально);
INFO: Non-failover interface config is cleared on Ethernet3 and its sub-interfaces
FW1(config)# failover interface ip state 172.16.1.1 255.255.255.0 standby 172.16.1.2 – назначаем ему IP – адрес и прописываем дополнительный IP;
FW1(config)# int ethernet 3
FW1(config-if)# no shutdown – включаем интерфейс;
FW1(config-if)# exit
FW1(config)# failover polltime interface 2 holdtime 10 – изменяем интервалы для опроса интерфейсов;
FW1(config)# failover polltime unit 2 holdtime 10 – изменяем интервалы для опроса соседнего устройства;
FW1(config)# failover – глобально включаем failover;
FW1(config)# wr
FW1(config)#
FW1# sh run
: Saved
PIX Version 7.2(3)
hostname FW1
enable password 2KFQnbNIdI.2KYOU encrypted
names
interface Ethernet0
nameif outside
security-level 0
ip address 1.1.1.1 255.255.255.0 standby 1.1.1.2 interface
Ethernet1
nameif inside
security-level 100
ip address 10.10.10.1 255.255.255.0 standby 10.10.10.2
interface Ethernet2
description LAN Failover Interface
interface Ethernet3
description STATE Failover Interface
interface Ethernet4
shutdown
no nameif
no security-level
no ip address
passwd 2KFQnbNIdI.2KYOU encrypted
ftp mode passive
access-list FOR_NAT extended permit ip 10.10.10.0 255.255.255.0 any
pager lines 24
mtu outside 1500
mtu inside 1500
failover
failover lan unit primary
failover lan interface failover Ethernet2
failover lan enable
failover polltime unit 2 holdtime 10
failover polltime interface 2 holdtime 10
failover link state Ethernet3
failover interface ip failover 192.168.1.1 255.255.255.0 standby 192.168.1.2
failover interface ip state 172.16.1.1 255.255.255.0 standby 172.16.1.2
icmp unreachable rate-limit 1 burst-size 1
no asdm history enable
arp timeout 14400
global (outside) 1 interface
nat (inside) 1 access-list FOR_NAT
route outside 0.0.0.0 0.0.0.0 1.1.1.200 1
timeout xlate 3:00:00
timeout conn 1:00:00 half-closed 0:10:00 udp 0:02:00 icmp 0:00:02
timeout sunrpc 0:10:00 h323 0:05:00 h225 1:00:00 mgcp 0:05:00 mgcp-pat 0:05:00
timeout sip 0:30:00 sip_media 0:02:00 sip-invite 0:03:00 sip-disconnect 0:02:00
timeout uauth 0:05:00 absolute
no snmp-server location
no snmp-server contact
snmp-server enable traps snmp authentication linkup linkdown coldstart
telnet timeout 5
ssh timeout 5
console timeout 0
class-map inspection_default
match default-inspection-traffic
policy-map type inspect dns preset_dns_map
parameters message-length maximum 512
policy-map global_policy
class inspection_default
inspect dns preset_dns_map
inspect ftp
inspect h323 h225
inspect h323 ras
inspect rsh
inspect rtsp
inspect esmtp
inspect sqlnet
inspect skinny
inspect sunrpc
inspect xdmcp
inspect sip
inspect netbios
inspect tftp
inspect icmp
service-policy global_policy global
prompt hostname context
Cryptochecksum:8499dd46ec5f004723e91795c7c52015
: end
FW1#
Переходим к настройке secondary FW2. Там настроек будет меньше (придется настроить только интерфейсы для failover и включить его):
pixfirewall> en
Password:
pixfirewall# conf t
pixfirewall(config)# hostname FW2
FW2(config)# enable password cisco
FW2(config)# failover lan enable
FW2(config)# failover lan interface failover ethernet2
INFO: Non-failover interface config is cleared on Ethernet2 and its sub-interfaces
FW2(config)# failover interface ip failover 192.168.1.1 255.255.255.0 standby 192.168.1.2
FW2(config)# interface ethernet 2
FW2(config-if)# no shutdown
FW2(config-if)# exit
FW2(config)# failover lan unit secondary
FW2(config)# failover polltime interface 2 holdtime 10
FW2(config)# failover polltime unit 2 holdtime 10
FW2(config)# failover
FW2(config)# wr
- FW1# Beginning configuration replication: Sending to mate.
- FW1# End Configuration Replication to mate
Теперь посмотрим, что у нас получилось.
FW1:
- Где:
- 1 – показано, что Failover включен;
- 2 – это устройство является главным (Primary);
- 3 – интерфейсом для failover является Ethernet2 и оно в состоянии UP;
- 4 – настроенные интервалы;
- 5 – primary устройство в состоянии Active;
- 6 – интерфейсы находятся в рабочем состоянии;
- 7 – secondary устройство находится в состоянии Standby Ready;
- 8 – показывается обмен сообщениями для Stateful failover.
- Где:
- 1 – видно, что мы находимся на FW2, но название и остальная конфигурация устройства взята с primary unit;
- 2 – данное устройство является secondary failover unit.
- Где:
- 1 – настройки IP на локальном компьютере;
- 2 – успешный ping интерфейса inside на FW1 (так как он на данный момент активный);
- 3 – успешный ping интерфейса Remote_Router, смотрящего на устройства FW1 и FW2;
- 4 – успешный ping loopback – интерфейса на Remote_Router.
Итак, выключение самого FW1.
Запускаем бесконечный ping на Local_PC в сторону Remote_Router (2.2.2.2), затем выключаем FW1 и смотрим, сколько ping-ов у нас потерялось:
Видно, что после выключения FW1 пропало всего лишь 2 ping-а (рисунок 1). Вроде работает :). Посмотрим, что в это время творилось на secondary FW2:
- Где:
- 1 – по истечении интервала «неответа» соседнего устройства, FW2 переключается в активное состояние (Active);
- 2 – состояние secondary устройства Active;
- 3 – состояние primary устройства помечено как Failed.
Приступаем к проверке отказоустойчивости при пропадании сетевой доступности на интерфейсе outside. Для этого снова запустим бесконечный ping с Local_PC, зайдем на SW1 и выключим интерфейс в сторону FW1.
Видно, что произошло детектирование, что интерфейс outside не доступен на удаленной стороне (выключили на SW1, рисунок 1) и primary FW1 переходит в режим Standby (рисунок 3), то есть трафик пошел через FW2. В итоге видно, что потерялось 3 ping-а (рисунок 2), что очень даже неплохо.
Ну что, всё у нас получилось!!!! Поздравляю вас!!!!
На этом хочу закончить этот пост. Надеюсь, он стал для вас полезным и интересным.
По всем возникающим вопросам пишите мне лично (координаты вот тут) либо оставляйте комментарии. Постараюсь всем на всё ответить :).
С нетерпением жду вас в следующих постах!!!
С уважением, Ant0ni0n
Добрый день! А зачем нужно асы соединять двумя линками, не достаточно ли одного линка? В чем принципиальная разница?
ОтветитьУдалитьДобрый день!!
УдалитьПринципиальная разница в том, что здесь мы реализовывали схему с LAN-Based Failover (Stateful Failover), которая подразумевает под собой использование двух соединений. По одному, устройства обмениваются технической информацией о состоянии друг друга (keepalive и так далее), а по второму - для обмена информацией об активных соединениях пользователей. Вот какая информация там передается:
The NAT translation table
The TCP connection states
The UDP connection states
The ARP table
The Layer 2 bridge table (when it runs in the transparent firewall mode)
The HTTP connection states (if HTTP replication is enabled)
The ISAKMP and IPSec SA table
The GTP PDP connection database
Другими словами, если упадет active, то сессии у пользователей не разорвутся, а будут работать дальше.
Если это не настроить, то при пропадании связи с active, связь пойдет через standby, но все установленные соединения (TCP сессии) придется устанавливать заново.
Что мешает использовать один интерфейс для обмена как технической информацией, так и информацией о состоянии сессий, т.е. указать failover link state Ethernet2? Как я понял, именно эта команда отвечает за statefull failover.
УдалитьНу в принципе ничего не мешает. Но как я читал в мануалах, рекомендуют использовать два отдельных интерфейса (по которым даже полезный (data) трафик не ходит).
УдалитьNote: If the stateful failover link uses the failover link or a data interface, you only need to supply the if_name argument. - отсюда видно, что для задания statefull failover можно использовать любой интерфейс и чтобы это сделать, достаточно задать if_name параметр, без указания физического интерфейса.
Failover можно вообще собрать, используя только интерфейсы, предназначенные для data. Варианты есть, здесь я выбрал такой случай (использовать независимые от трафика интерфейсы).
Я что-то не пойму почему при конфигурировании secondary асы, не включали интерфейс ethernet3, который "failover link state".
ОтветитьУдалитьИ не рассмотрены настройки групп здесь, у меня задача настроить несколько контекстов, и что бы "primary" для них были разные физические асы.
И после того как я дал команду "failover" на "secondary asa" у меня доступ к ней пропал и большее его нет, это нормально?
Доступ появился, надо было прописать standby адрес на интерфейсе менеджмент.
УдалитьДоброго времени суток!!!
УдалитьНе включал я интерфейс ethernet3 на secondary ASA, так как он был поднят по умолчанию (no shutdown). А его настройка в качестве IP и так далее подтягивается, я так понимаю, от primary. По крайней мере в мануалах от cisco они не настраивают этот интерфейс на secondary, а просто делают ему no shutdown и все...
Насчет нескольких контекстов, на момент написания поста GNS3 их не поддерживал (да и сейчас есть небольшие проблемы с этим). Думаю, как такая возможность будет, то напишу и про это :)
Добрый день!
ОтветитьУдалитьА если на FW1 жестко проброшена статика - ну типа:
static (inside,outside) tcp interface ftp 10.10.10.200 ftp netmask 255.255.255.255
- как быть? Пробрасывать только с виртуальных адресов? Или делать какие то изменения в конфигурации Remote_Router?
Здравствуйте,
ОтветитьУдалитьСделал как было написано, вырубаю primary ASA включается автоматом Standby ASA и на этом все. Пакеты не идут.
Подскажите что не так?
ASA 8.0(2)
Опять ничего не выходит. Опустим настройку failover и тупо уберем FW2 и SW2. Оставим Local PC - SW3 - FW1 - SW1 - Remote_Router. Надо добиться чтобы хотя бы пинги ходили от Local PC до Remote_Router. Соответственно все настройки в части сетевых адаптеров и NAT мы оставляем. Вот листинг с моей PIX-ы :
ОтветитьУдалитьFW1# show run
: Saved
:
PIX Version 7.2(3)
!
hostname FW1
enable password 2KFQnbNIdI.2KYOU encrypted
names
!
interface Ethernet0
nameif outside
security-level 0
ip address 1.1.1.1 255.255.255.0
!
interface Ethernet1
nameif inside
security-level 100
ip address 10.10.10.1 255.255.255.0
passwd 2KFQnbNIdI.2KYOU encrypted
ftp mode passive
access-list FOR_NAT extended permit ip 10.10.10.0 255.255.255.0 any
pager lines 24
mtu outside 1500
mtu inside 1500
icmp unreachable rate-limit 1 burst-size 1
no asdm history enable
arp timeout 14400
global (outside) 1 interface
nat (inside) 1 access-list FOR_NAT
route outside 0.0.0.0 0.0.0.0 1.1.1.200 1
Ну никак пинги не идут. Local PC пингует 10.10.10.1 и все, 1.1.1.1 и 1.1.1.200 не пингуются. FW1 пингует и Local_PC и Remote_Router. Remote_Router пингует только 1.1.1.1
Тупо вставляю вместо PIX-ы роутер 3745, даже Nat не настраиваю, на Remote_Router прописываю ip route 0.0.0.0 0.0.0.0 1.1.1.1 и все летает. Понятное дело, что косяк в PIX-е, но где никак не пойму, третий день мучаюсь.
Доброго времени суток!!!
УдалитьПодозреваю, что в вашей конфигурации ASA не хватает вот такой конфигурации:
class-map inspection_default
match default-inspection-traffic
policy-map type inspect dns preset_dns_map
parameters message-length maximum 512
policy-map global_policy
class inspection_default
inspect dns preset_dns_map
inspect ftp
inspect h323 h225
inspect h323 ras
inspect rsh
inspect rtsp
inspect esmtp
inspect sqlnet
inspect skinny
inspect sunrpc
inspect xdmcp
inspect sip
inspect netbios
inspect tftp
inspect icmp
service-policy global_policy global
Здесь присутствует параметр инспектирования icmp. Без него ping через ASA/PIX не проходит. Так что попробуйте добавить это себе, должно получиться.
Добрый день!
УдалитьВы оказались правы. Инспектирования icmp пакетов не хватало. Добавил и пинги до хоста 1.1.1.200 пошли. Но outside хост 1.1.1.1 не пингуется, так и должно быть ? Почему он не пингуется ? Как сделать, чтобы пинговался ?
Рад что помогло :) Кошелечки для благодарностей есть, если что :)
УдалитьНасчет второго вопроса - это специфика ASA. Скорее всего у вас не получится пинговать outside интерфейс из внутренней сети (за интерфейсом inside).
Добрый день!
ОтветитьУдалитьА существует ли возможность проверять не падение интерфейса на wan порте FW1, а скажем отсутствие пингов к какому-либо внешнему ресурсу?
какой-нибудь ip sla monitor на 8.8.8.8 и в случае недоступности no failover active ...
Добрый день!
УдалитьДа, такое вполне возможно. Можно проверять доступность IP. И эта настройка очень похожа на ip sla.
тут ( https://supportforums.cisco.com/discussion/12272601/asa-failover-based-ip-sla ) ребята говорят, что вариантов решения проблемы нет.
Удалитьвыдержка из гайда ( http://www.cisco.com/c/en/us/td/docs/security/asa/asa83/asdm63/configuration_guide/config/ha_active_standby.pdf ):
The unit can fail if one of the following events occurs:
1. The unit has a hardware failure or a power failure.
2. The unit has a software failure.
3. Too many monitored interfaces fail.
4. You force a failover
из этого можно предположить, что ip sla не поддерживается для вызова fail.
Не нашел как прописана маршрутизация на PC в сторону Remote Router и на Remote Router в сторону PC.
ОтветитьУдалитьВидимо на PC статика через 10.10.10.1. Тогда при выключении FW1 его адрес (10.10.10.1) подхватит FW2? FW2 будет иметь два IP-адреса: 10.10.10.1 и 10.10.10.2?