Поиск...

понедельник, 8 августа 2011 г.

Настройка Failover на cisco PIX/ASA

Доброго времени суток!!!


Наверное, многие уже сталкивались с проблемой падения линий в сторону провайдеров и, как следствие, остановки рабочего процесса на предприятии. Иногда это случается на стороне самого провайдера, иногда из-за отказа внутреннего оборудования или линий.
Есть масса способов организовать отказоустойчивое соединение. Сегодня я расскажу, как сделать отказоустойчивую схему, имея под рукой два устройства 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.
Задача у нас, чтобы сетевая доступность loopback – интерфейса на Remote_Router с локального компьютера (Local_PC) не прерывалась (ну или прерывалась на небольшое время) при падении линии на outside интерфейсе FW1, либо полном отключении FW1. Другими словами, если что-то произойдет с FW1, трафик должен пойти через FW2.
Приступаем к настройкам. Настроим для начала 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)#
Все необходимое на primary FW1 настроили. Вот для ориентировки конфигурация:

  • 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
Если этих сообщений нет, то перезапустите ваши устройства (в GNS3 «Stop» и «Start»). Первым запускайте primary.
Теперь посмотрим, что у нас получилось.
FW1:


    Где:
  • 1 – показано, что Failover включен;
  • 2 – это устройство является главным (Primary);
  • 3 – интерфейсом для failover является Ethernet2 и оно в состоянии UP;
  • 4 – настроенные интервалы;
  • 5 – primary устройство в состоянии Active;
  • 6 – интерфейсы находятся в рабочем состоянии;
  • 7 – secondary устройство находится в состоянии Standby Ready;
  • 8 – показывается обмен сообщениями для Stateful failover.
FW2:


    Где:
  • 1 – видно, что мы находимся на FW2, но название и остальная конфигурация устройства взята с primary unit;
  • 2 – данное устройство является secondary failover unit.
Ну что, всё готово, можно переходить к проверкам :). Переходим на нашу локальную машину Local_PC и посмотрим ее настройки и сетевую доступность:


    Где:
  • 1 – настройки IP на локальном компьютере;
  • 2 – успешный ping интерфейса inside на FW1 (так как он на данный момент активный);
  • 3 – успешный ping интерфейса Remote_Router, смотрящего на устройства FW1 и FW2;
  • 4 – успешный ping loopback – интерфейса на Remote_Router.
Для проверки отказоустойчивости будем запускать бесконечный ping на loopback – интерфейс Remote_Router и по очереди выключать сначала сам FW1, затем связь через outside интерфейс.
Итак, выключение самого 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.
Итак, первая проверка прошла успешно. Для того, чтобы вернуть наш failover в прежнее состояние (primary – active, secondary – Standby Ready), необходимо на FW2 (на устройстве, которое сейчас в состоянии Active) выполнить команду FW1# no failover active.
Приступаем к проверке отказоустойчивости при пропадании сетевой доступности на интерфейсе outside. Для этого снова запустим бесконечный ping с Local_PC, зайдем на SW1 и выключим интерфейс в сторону FW1.





Видно, что произошло детектирование, что интерфейс outside не доступен на удаленной стороне (выключили на SW1, рисунок 1) и primary FW1 переходит в режим Standby (рисунок 3), то есть трафик пошел через FW2. В итоге видно, что потерялось 3 ping-а (рисунок 2), что очень даже неплохо.
Ну что, всё у нас получилось!!!! Поздравляю вас!!!!

На этом хочу закончить этот пост. Надеюсь, он стал для вас полезным и интересным.

По всем возникающим вопросам пишите мне лично (координаты вот тут) либо оставляйте комментарии. Постараюсь всем на всё ответить :).

С нетерпением жду вас в следующих постах!!!

С уважением, Ant0ni0n

17 комментариев:

  1. Добрый день! А зачем нужно асы соединять двумя линками, не достаточно ли одного линка? В чем принципиальная разница?

    ОтветитьУдалить
    Ответы
    1. Добрый день!!
      Принципиальная разница в том, что здесь мы реализовывали схему с 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 сессии) придется устанавливать заново.

      Удалить
    2. Что мешает использовать один интерфейс для обмена как технической информацией, так и информацией о состоянии сессий, т.е. указать failover link state Ethernet2? Как я понял, именно эта команда отвечает за statefull failover.

      Удалить
    3. Ну в принципе ничего не мешает. Но как я читал в мануалах, рекомендуют использовать два отдельных интерфейса (по которым даже полезный (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. Варианты есть, здесь я выбрал такой случай (использовать независимые от трафика интерфейсы).

      Удалить
  2. Анонимно4 мая 2012 г., 10:31

    Я что-то не пойму почему при конфигурировании secondary асы, не включали интерфейс ethernet3, который "failover link state".
    И не рассмотрены настройки групп здесь, у меня задача настроить несколько контекстов, и что бы "primary" для них были разные физические асы.
    И после того как я дал команду "failover" на "secondary asa" у меня доступ к ней пропал и большее его нет, это нормально?

    ОтветитьУдалить
    Ответы
    1. Анонимно4 мая 2012 г., 10:58

      Доступ появился, надо было прописать standby адрес на интерфейсе менеджмент.

      Удалить
    2. Доброго времени суток!!!
      Не включал я интерфейс ethernet3 на secondary ASA, так как он был поднят по умолчанию (no shutdown). А его настройка в качестве IP и так далее подтягивается, я так понимаю, от primary. По крайней мере в мануалах от cisco они не настраивают этот интерфейс на secondary, а просто делают ему no shutdown и все...
      Насчет нескольких контекстов, на момент написания поста GNS3 их не поддерживал (да и сейчас есть небольшие проблемы с этим). Думаю, как такая возможность будет, то напишу и про это :)

      Удалить
  3. Добрый день!
    А если на FW1 жестко проброшена статика - ну типа:
    static (inside,outside) tcp interface ftp 10.10.10.200 ftp netmask 255.255.255.255
    - как быть? Пробрасывать только с виртуальных адресов? Или делать какие то изменения в конфигурации Remote_Router?

    ОтветитьУдалить
  4. Здравствуйте,
    Сделал как было написано, вырубаю primary ASA включается автоматом Standby ASA и на этом все. Пакеты не идут.
    Подскажите что не так?
    ASA 8.0(2)

    ОтветитьУдалить
  5. Опять ничего не выходит. Опустим настройку 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-е, но где никак не пойму, третий день мучаюсь.

    ОтветитьУдалить
    Ответы
    1. Доброго времени суток!!!
      Подозреваю, что в вашей конфигурации 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 не проходит. Так что попробуйте добавить это себе, должно получиться.

      Удалить
    2. Добрый день!
      Вы оказались правы. Инспектирования icmp пакетов не хватало. Добавил и пинги до хоста 1.1.1.200 пошли. Но outside хост 1.1.1.1 не пингуется, так и должно быть ? Почему он не пингуется ? Как сделать, чтобы пинговался ?

      Удалить
    3. Рад что помогло :) Кошелечки для благодарностей есть, если что :)
      Насчет второго вопроса - это специфика ASA. Скорее всего у вас не получится пинговать outside интерфейс из внутренней сети (за интерфейсом inside).

      Удалить
  6. Добрый день!
    А существует ли возможность проверять не падение интерфейса на wan порте FW1, а скажем отсутствие пингов к какому-либо внешнему ресурсу?
    какой-нибудь ip sla monitor на 8.8.8.8 и в случае недоступности no failover active ...

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Да, такое вполне возможно. Можно проверять доступность IP. И эта настройка очень похожа на ip sla.

      Удалить
    2. тут ( 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.

      Удалить
  7. Не нашел как прописана маршрутизация на 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?

    ОтветитьУдалить