Saturday, January 9, 2016

Строим отказоустойчивую сетевую инфраструктуру предприятия.

Часть 3: Тюнинг настроек пограничных портов и портов доступа на Cisco и HP ProCurve.

Итак, сегодня подготовимся к подведению черты под настройкой нашей сети. Черта эта будет проведена между сетевым оборудованием и пользователями этого оборудования. А точнее, разберемся, что можно сделать, что бы обезопасить нашу STP топологию на портах доступа, а так же на пограничных портах с другими сетями. Начнем с самых базовых настроек, таких как PortFast, BPDUGuard, BPDUFilter и PVST-Filter на ProCurve.

PortFast

     PortFast - этот режим предназначен для того, что бы "ускорить" инициализацию портов которые подключены к серверам или пользовательским станциям. В нормальном состоянии, без PortFast, порт на котором работает Spanning Tree перед включением в режим передачи данных проходит несколько довольно долгих фаз: blocked, listening, learning и только потом, где-то через 40-50 секунд после включения кабеля, он переходит в состояние forwarding и начинает передавать данные. Делается это для того, что бы если на порту окажется дублирующий линк, то Spanning Tree успел бы это понять, и в сети не возникло петли и наша сеть не "сломалась" пусть даже на короткое время. В случае, если на порту находится рабочая станция или сервер, нам не нужно, что бы все включалось с такой осторожностью, даже вернее это вообще может оказаться вредно для работы рабочей станции или сервера, компьютер может например не суметь получить адрес по DHCP, если грузится быстрее, чем инициализируется порт.
     Итак, когда мы включаем PortFast, порт минует состояния listening и learning, и сразу становится forwarding. При включении этого режима, Spanning Tree продолжает работать на этих портах, он не отключается! BPDU принимаются и отправляются. Более того, если на порт в режиме PortFast придёт сообщение BPDU, он моментально потеряет свой статус PortFast не смотря на настройки.  Но тем не менее, не стоит включать PortFast на портах ведущих к другому сетевому оборудованию, так как это все-таки может привести к появлению петель маршрутизации пусть и на короткое время.

Cisco:
     На Cisco этот режим включается двумя способами: локально на конкретных портах либо глобально в режиме конфигурации.
глобально:
spanning-tree portfast default
Эта команда включает PortFast на всех портах которые находятся в режиме access.
локально на портах:
interface GigabitEthernet0/1
spanning-tree portfast
При активной глобальной настройке PortFast его можно отключить на портах где он не нужен:
interface GigabitEthernet0/1
spanning-tree portfast disable

Так же в некоторых случаях может понадобиться включить PortFast на trunk линках, например если данный транк ведёт к серверу, который принимает из него несколько VLAN'ов:
interface GigabitEthernet0/1
spanning-tree portfast trunk

Проверить включен ли PortFast на интерфейса можно при помощи команды:
sh spanning-tree int gi0/1 portfast
MST0                enabled
MST2                enabled

либо:
sh spanning-tree int gi0/1 detail 
 Port 1 (GigabitEthernet0/1) of MST0 is designated forwarding 
   Port path cost 20000, Port priority 128, Port Identifier 128.1.
   Designated root has priority 4096, address 001b.3fc1.a800
   Designated bridge has priority 32768, address 001d.e691.2800
   Designated port id is 128.1, designated path cost 0
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 3
   The port is in the portfast mode by default
   Link type is point-to-point by default, Internal
   Bpdu guard is enabled by default
   Loop guard is enabled by default on the port
   BPDU: sent 174100, received 0

 Port 1 (GigabitEthernet0/1) of MST2 is designated forwarding 
   Port path cost 20000, Port priority 128, Port Identifier 128.1.
   Designated root has priority 2, address 0018.71b6.a000
   Designated bridge has priority 32770, address 001d.e691.2800
   Designated port id is 128.1, designated path cost 22000
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 2
   The port is in the portfast mode by default
   Link type is point-to-point by default, Internal
   Bpdu guard is enabled by default
   Loop guard is enabled by default on the port
   BPDU: sent 174100, received 0

Тут будет видно, если порт потерял свой статус PortFast, для возвращения порту статуса PortFast нужно его положить и поднять:
interface GigabitEthernet0/1
shutdown
no shutdown

HP ProCurve:
     На ProCurve это называется edge-port, и насильно включается командой admin-edge-port для каждого порта, но по-умолчанию глобально работает функция auto-edge-port, которая сама определят, нужно на этом порту инициализироваться "по-быстрому" или нужно идти по полному циклу. И надо отметить, что на HP эта автоматическая функция работает очень хорошо! Порты без всякого тюнинга инициализируются быстро там, где стоят рабочие станции и сами переходят в EDGE режим, и так же теряют EDGE статус даже при активном admin-edge-port, если на порт приходят сообщение BPDU снаружи.

Включается это так:
spanning-tree A1-A2 admin-edge-port

В sh run это будет выглядеть так:
spanning-tree A1 admin-edge-port
spanning-tree A2 admin-edge-port

И можно насильно отключить авто определение EDGE порта, что бы он всегда инициализировался по долгому и безопасному сценарию:
no spanning-tree A1-A2 auto-edge-port

В sh run это будет выглядеть так:
no spanning-tree A1 auto-edge-port
no spanning-tree A2 auto-edge-port

Вернуть статус auto-edge-port и отключить admin-edge-port можно командами:
spanning-tree A1-A2 auto-edge-port
и
no spanning-tree A1-A2 admin-edge-port

Проверить статус порта можно при помощи команд:
sh spanning-tree A1
  Port   Type       | Cost      rity State        | Bridge        Time PtP Edge
  ------ ---------- + --------- ---- ------------ + ------------- ---- --- ----
  A1     100/1000T  | 20000     128  Forwarding   | 001b3f-582100 2    Yes No  

либо
sh spanning-tree A1 detail
  AdminEdgePort             : No 
  Auto Edge Port            : Yes         
  OperEdgePort              : No


BPDUFilter

     Эта функция отключает прием и передачу BPDU на конкретных портах. Это может применяться для разных целей, например для защиты от "чужого" Spanning Tree на линках к провайдеру или к иным соседям, с которыми у вас гарантировано один линк. Для защиты от атак на основе BPDU и как следствие, нестабильность работы вашей топологии.

Cisco:
     На Cisco BPDUFilter как и PortFast включается двумя способами: локально на интерфейсе и глобально. Но в отличие от PortFast, у BPDUFilter от способа включения меняется поведение.
Локально:
interface GigabitEthernet 0/1
spanning-tree bpdufilter enable / disable
Как и в случае Portfast, disable отключает глобальную настройка для конкретного порта.
Глобально (автоматически включает BPDUFilter на всех PortFast интерфейсах):
spanning-tree portfast bpdufilter default

     При локальном включении BPDUFilter работает как "стена", это равносильно отключению Spanning Tree на интерфейсе вообще. Никакие BPDU не проходят ни в одну сторону. В некоторых случаях это может быть опасно, например соединив случайно такой порт с соседним вы получите петлю, которую не устранит Spanning Tree, и если у вас не настроено других средств борьбы с петлями, то у вас рухнет сеть. Так что будьте внимательны и осторожны использую эту функцию локально на интерфейсе.
     При глобальном включении этой функции, она не настолько опасна, потому что включается на PortFast портах, и блокирует только отправку BPDU, а не приём. И как и PortFast, глобальный BPDUFilter снимается с порта при приёме первого же BPDU пакета снаружи. Эта функция используется скорее для маскировки вашего BPDU от соседей, но в случае если от соседей придёт BPDU, то вы начнете с ними работать по Spanning Tree.

     Причем при глобальном включении BPDUFilter, через порт на этапе инициализации будут отправлены несколько сообщений BPDU для того, что бы спровоцировать возможно расположенное за этим портом оборудование на ответ, или чтоб удостовериться, что там никого нет способного взаимодействовать по STP. При локальном включении через порт не будет отправляться и приниматься вообще никаких BPDU.

Узнать включен ли у вас BPDUFilter глобально:
sh spanning-tree summary 
Switch is in mst mode (IEEE Standard)
Root bridge for: none
Extended system ID           is enabled
Portfast Default             is enabled
PortFast BPDU Guard Default  is enabled
Portfast BPDU Filter Default is disabled
Loopguard Default            is enabled
EtherChannel misconfig guard is enabled
UplinkFast                   is disabled
BackboneFast                 is disabled

Узнать активен ли он на порту:
sh spanning-tree int gi0/1 detail 
 Port 1 (GigabitEthernet0/1) of MST0 is designated forwarding 
   Port path cost 20000, Port priority 128, Port Identifier 128.1.
   Designated root has priority 4096, address 001b.3fc1.a800
   Designated bridge has priority 32768, address 001d.e691.2800
   Designated port id is 128.1, designated path cost 0
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 3
   The port is in the portfast mode by default
   Link type is point-to-point by default, Internal
   Bpdu guard is enabled by default
   Bpdu filter is enabled
   Loop guard is enabled by default on the port
   BPDU: sent 174100, received 0

 Port 1 (GigabitEthernet0/1) of MST2 is designated forwarding 
   Port path cost 20000, Port priority 128, Port Identifier 128.1.
   Designated root has priority 2, address 0018.71b6.a000
   Designated bridge has priority 32770, address 001d.e691.2800
   Designated port id is 128.1, designated path cost 22000
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 2
   The port is in the portfast mode by default
   Link type is point-to-point by default, Internal
   Bpdu guard is enabled by default
   Bpdu filter is enabled
   Loop guard is enabled by default on the port
   BPDU: sent 174100, received 0

Если BPDUFilter не включен, то этой строки не будет вообще.

HP ProCurve:
     На ProCurve BPDUFilter включается для каждого порта:
spanning-tree A1-A2 bpdu-filter
В su run это будет выглядеть так:
spanning-tree A1 loop-guard bpdu-filter
spanning-tree A2 loop-guard bpdu-filter

Узнать список портов с включенным BPDUFilter:
sh spanning-tree | i Filter
 BPDU Filtered Ports  : A1-A2

либо:
sh spanning-tree A1 detail 
  BPDU Filtering            : Yes

Так же на HP есть еще одна хорошая функция, которая полезна в случае использования MSTP, и описанного мной в Часть 2: "Соединяем Cisco и ProCurve при помощи MSTP" случая, когда Cisco сходила с ума от приёма PVST пролетавшего сквозь топологию ProCurve.

PVST-FilterВключается так же, как и BPDUFilter:
spanning-tree A1-A2 pvst-filter

В sh run выглядит так:
spanning-tree A1 pvst-filter
spanning-tree A2 pvst-filter

посмотреть статус PVST-Filter:
sh spanning-tree | i PVST
  PVST Filtered Ports  : A1-A2

либо:
sh spanning-tree a1 det
  PVST Filtering            : Yes

     Возможно, если вы используете MSTP, эту функцию стоит активировать на всех портах, так как ничего хорошего от приёма чужого PVST не будет. Как минимум MSTP и PVST несовместимы, а как максимум может произойти крах всей сети, похуже описанного мной случая в  Часть 2: "Соединяем Cisco и ProCurve при помощи MSTP"...

BPDUGuard

     На Cisco BPDUGuard включается локально на интерфейсе и глобально. Ведет себя он независимо от способа включения, абсолютно одинаково. При приёме входящего BPDU на порту с активированным BPDUGuard, порт просто блокируется.

Cisco:
Локально:
interface GigabitEthernet 0/1
spanning-tree bpduguard enable / disable
Как и в случае Portfast, disable отключает глобальную настройка для конкретного порта.
Глобально (автоматически включает BPDUGuard на всех PortFast интерфейсах):
spanning-tree portfast bpduguard default

При блокировке порта восстановить его работоспособность можно выключением и включением:
interface GigabitEthernet0/1
shutdown
no shutdown

Либо настроив автоматическое включение при помощи механизма errdisable recovery:
errdisable recovery cause bpduguard
errdisable recovery interval 60

Включен ли BPDUGuard глобально:
sh spanning-tree summary 
PortFast BPDU Guard Default  is enabled

Узнать активен ли он на порту:
sh spanning-tree int gi0/1 detail 
 Port 1 (GigabitEthernet0/1) of MST0 is designated forwarding 
   Port path cost 20000, Port priority 128, Port Identifier 128.1.
   Designated root has priority 4096, address 001b.3fc1.a800
   Designated bridge has priority 32768, address 001d.e691.2800
   Designated port id is 128.1, designated path cost 0
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 3
   The port is in the portfast mode by default
   Link type is point-to-point by default, Internal
   Bpdu guard is enabled by default
   Loop guard is enabled by default on the port
   BPDU: sent 174100, received 0

 Port 1 (GigabitEthernet0/1) of MST2 is designated forwarding 
   Port path cost 20000, Port priority 128, Port Identifier 128.1.
   Designated root has priority 2, address 0018.71b6.a000
   Designated bridge has priority 32770, address 001d.e691.2800
   Designated port id is 128.1, designated path cost 22000
   Timers: message age 0, forward delay 0, hold 0
   Number of transitions to forwarding state: 2
   The port is in the portfast mode by default
   Link type is point-to-point by default, Internal
   Bpdu guard is enabled by default
   Loop guard is enabled by default on the port
   BPDU: sent 174100, received 0

HP Procurve:
На ProCurve он включается и мониторится абсолютно аналогично BPDU-Filter и PVST-Filter, но называется BPDU-Protection:

spanning-tree A1-A2 bpdu-protection

В sh run будет так:
spanning-tree A1 loop-guard bpdu-protection
spanning-tree A2 loop-guard bpdu-protection

Статус BPDU-Protection:
sh spanning-tree | i Protect
  BPDU Protected Ports : A1-A16,A18-A24,B1-B24,C1-C24,D1-D24,G...

sh spanning-tree a1 detail | i Protect
  BPDU Protection           : Yes

На мой взгляд BPDUGuard черезвычайно полезная штука, так как позволяет узнать, когда в порт несанкционированно воткнули сетевое оборудование, а так же BPDUGuard моментально спасает от большинства петель. Но с BPDUGuard можно поймать и проблемы, например активировав его на интерфейсе который смотрит к провайдеру. От провайдеров, по моему опыту, частенько прилетает STP, что моментально приведёт к блокировке порта. Я, конечно весьма осмотрительно, но на интерфейсах к провайдерам с которыми у нас нет дополнительных линков, обычно включаю BPDUFIlter :)


     В следующий раз добавлю про loop-guard, loop-protect, udld и дополнительно скомпоную в одну статью все что связано с борьбой против петель на управляемом и неуправляемом оборудовании. На этом закончим со Spanning Tree и петлями и пойдём дальше к резервированию каналов доступа и кластерам :)

Saturday, January 2, 2016

UnixDaemonReloader - обновление от 2016.01.03



     Обновилась версия программы. Добавились такие функции:

  1. Задержка перед выполнением перезапуска, после изменения файла;
  2. Возможность выполнения перед основным скриптом перезапуска, предварительного скрипта на пример с проверкой консистентности конфига или иных действий, и уже на основе возвращенного ответа от предварительного скрипта начинать перезапуск, или запускать скрипт с реакцией на ошибку. Все эти параметры опциональны, и не обязательны к использованию.


Конфигурацияонный файл:














Обновление от 2016.01.03: 
     Добавлены параметры "скрипт предварительной проверки", "результат удачной проверки" и "скрипт в случае ошибки проверки" в список файлов для отслеживания в кофигурационном файле. Скрипт предварительной проверки должен возвращать результат проверки на стандартный вывод. Например: "OK". Если Возвращенное текстовое значение равно тому что в конфиге - выполняется скрипт перезапуска, иначе после окончания попыток проверки исполнится скрипт ошибки. Смотри README.md для ознакомления с новым синтаксисом.
     PS: Вы можете добавить в скрипт предварительной проверки например проверку конфига на правильность или бекап конфига. В скрипт ошибки тоже можно добавить отправку E-Mail, SMS или возврат копии конфига из бэкапа.
     Добавлен параметр UDR_ScriptsPath, указывающий путь к предварительным скриптам.
     Добавлен параметр UDR_PreAppAttempt, указывающий количество попыток исполнения скрипта предварительной проверки, поселе чего исполняется скрипт обработки ошибки или попытки прекращаются.
     Исправлен тотальный перезапуск всего и вся после первого создания базы файлов.
Обновление от 2015.12.23: 
UDR_PauseBefore - пауза в секундах перед запуском скрипта. Этот параметр сделан для того, что бы если вы вдруг случайно во время редактирования конфига сохранили файл "недоделанным", то у вас было время на исправление ошибки до перезапуска демона.
Полное описание конфигурационного файла в: Полная статья про Unix Daemon Reloader

     Исходники:
          UnixDaemonReloader Source Code

     Скомпилированные версии для FreeBSD и Linux:
          UnixDaemonReloader on SourceForge
          UnixDaemonReloader on My Google Drive