У цій статті я хотів би навести покрокову інструкцію того, як можна швидко розгорнути схему, що наразі масштабується. Remote-Access VPN доступу на базі AnyConnect та Cisco ASA - VPN Load Balancing Cluster.
Вступ: Багато компаній у всьому світі через поточну обстановку з COVID-19 роблять зусилля з переведення своїх співробітників на віддалений режим роботи. Зважаючи на масовість переходу на віддалену роботу, критичним чином зростає навантаження на наявні VPN шлюзи компаній і потрібна дуже швидка можливість їх масштабування. З іншого боку, багато компаній змушені поспіхом освоювати з нуля таке поняття як віддалена робота.
Я підготував покрокову інструкцію простого варіанта розгортання VPN Load-Balancing кластера як технології VPN, що найбільш масштабується.
Нижченаведений приклад буде досить простим з точки зору застосовуваних алгоритмів аутентифікації та авторизації, але буде гарним варіантом для швидкого старту (чого зараз дуже багатьом не вистачає) з можливістю поглибленої адаптації під свої потреби в процесі розгортання.
Короткі відомості: Технологія VPN Load Balancing Cluster – це не failover і не функція кластеризації в її нативному розумінні, даною технологією можна поєднувати зовсім різні моделі ASA (з певними обмеженнями) з метою балансування навантаження Remote-Access VPN з'єднань. Cинхронізація сесій та конфігурацій між нодами такого кластера відсутня, зате можливе автоматичне балансування навантаження VPN з'єднань та забезпечення відмовостійкості з'єднань VPN доки не залишиться хоча б однієї активної ноди в кластері. Навантаження у кластері балансується автоматично залежно від завантаженості нод за кількістю VPN сесій.
Для стійкості до відмов конкретних нод кластера (якщо це потрібно) можна застосовувати файловер, таким чином, активне з'єднання буде оброблятися Primary нодою файловера. Файловер не є необхідною умовою забезпечення відмовостійкості всередині Load-Balancing кластера, сам кластер у разі відмови ноди переведе сесію користувача на іншу живу ноду, однак без збереження статусу з'єднання, що забезпечується файловером. Відповідно можна за необхідності комбінувати ці дві технології.
VPN Load-Balancing кластер може містити більше двох нод.
VPN Load-Balancing кластер підтримується на ASA 5512-X та вище.
Оскільки кожна ASA в рамках VPN Load-Balancing кластера є незалежною одиницею з точки зору налаштувань, то всі етапи конфігурації ми проводимо індивідуально на кожному окремому пристрої.
Розгортаємо з образу екземпляри ASAv потрібних нам шаблонів (ASAv5/10/30/50).
Призначаємо інтерфейси INSIDE/OUTSIDE на однакові VLAN (Outside у своєму VLAN, INSIDE у своєму, але загальному в рамках кластера див. Топологію), важливому щоб інтерфейси одного типу знаходилися в одному L2 сегменті.
Ліцензії:
На момент встановлення ASAv не матиме жодних ліцензій і буде обмежено продуктивністю 100кбіт/сек.
Для встановлення ліцензії Вам необхідно згенерувати токен у Вашому кабінеті Smart-Account: https://software.cisco.com/ -> Smart Software Licensing
У вікні після натисніть кнопку Новий маркер
Переконайтеся, що у вікні є активно поле і встановлена галочка Allow export-controlled функціональність… Без цього поля активного Ви не зможете використовувати функції сильного шифрування і VPN відповідно. Якщо це поле не активне, будь ласка, зверніться до Вашої облікової команди з запитом активації.
Після натискання кнопки Створити маркер, буде створено токен, який ми будемо використовувати для отримання ліцензії на ASAv, скопіюємо його:
Повторимо кроки C,D,E кожної розгорнутої ASAv.
Для того, щоб було простіше копіювати токен, дозволимо тимчасово telnet. Налаштуємо кожну ASA (приклад нижче ілюструє налаштування ASA-1). telnet з outside не працює, якщо дуже треба, змініть security-level на 100 на outside, потім поверніть назад.
!
ciscoasa(config)# int gi0/0
ciscoasa(config)# nameif outside
ciscoasa(config)# ip address 192.168.31.30 255.255.255.0
ciscoasa(config)# no shut
!
ciscoasa(config)# int gi0/1
ciscoasa(config)# nameif inside
ciscoasa(config)# ip address 192.168.255.2 255.255.255.0
ciscoasa(config)# no shut
!
ciscoasa(config)# telnet 0 0 inside
ciscoasa(config)# username admin password cisco priv 15
ciscoasa(config)# ena password cisco
ciscoasa(config)# aaa authentication telnet console LOCAL
!
ciscoasa(config)# route outside 0 0 192.168.31.1
!
ciscoasa(config)# wr
!
Для реєстрації токена у хмарі Smart-Account необхідно надати доступ в Інтернет для ASA, деталі тут.
Якщо коротко, то ASA потрібен:
доступ по HTTPS до Інтернету;
синхронізація часу (коректніше за NTP);
прописаний сервер DNS;
Заходимо telnet на наші ASA і проводимо налаштування для активації ліцензії через Smart-Account.
!
ciscoasa(config)# clock set 19:21:00 Mar 18 2020
ciscoasa(config)# clock timezone MSK 3
ciscoasa(config)# ntp server 192.168.99.136
!
ciscoasa(config)# dns domain-lookup outside
ciscoasa(config)# DNS server-group DefaultDNS
ciscoasa(config-dns-server-group)# name-server 192.168.99.132
!
! Проверим работу DNS:
!
ciscoasa(config-dns-server-group)# ping ya.ru
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 87.250.250.242, timeout is 2 seconds:
!!!!!
!
! Проверим синхронизацию NTP:
!
ciscoasa(config)# show ntp associations
address ref clock st when poll reach delay offset disp
*~192.168.99.136 91.189.94.4 3 63 64 1 36.7 1.85 17.5
* master (synced), # master (unsynced), + selected, - candidate, ~ configured
!
! Установим конфигурацию нашей ASAv для Smart-Licensing (в соответствии с Вашим профилем, в моем случае 100М для примера)
!
ciscoasa(config)# license smart
ciscoasa(config-smart-lic)# feature tier standard
ciscoasa(config-smart-lic)# throughput level 100M
!
! В случае необходимости можно настроить доступ в Интернет через прокси используйте следующий блок команд:
!call-home
! http-proxy ip_address port port
!
! Далее мы вставляем скопированный из портала Smart-Account токен (<token>) и регистрируем лицензию
!
ciscoasa(config)# end
ciscoasa# license smart register idtoken <token>
Перевіряємо, що пристрій успішно зареєстрував ліцензію та опції шифрування доступні:
Налаштовуємо базовий SSL-VPN на кожному шлюзі
Далі налаштовуємо доступ через SSH та ASDM:
ciscoasa(config)# ssh ver 2
ciscoasa(config)# aaa authentication ssh console LOCAL
ciscoasa(config)# aaa authentication http console LOCAL
ciscoasa(config)# hostname vpn-demo-1
vpn-demo-1(config)# domain-name ashes.cc
vpn-demo-1(config)# cry key gen rsa general-keys modulus 4096
vpn-demo-1(config)# ssh 0 0 inside
vpn-demo-1(config)# http 0 0 inside
!
! Поднимем сервер HTTPS для ASDM на порту 445 чтобы не пересекаться с SSL-VPN порталом
!
vpn-demo-1(config)# http server enable 445
!
Для роботи ASDM треба спочатку завантажити його з сайту cisco.com, у моєму випадку це наступний файл:
Для роботи AnyConnect клієнта треба завантажити на кожну ASA образ для кожної використовуваної десктопної ОС клієнта (планованої до використання Linux/Windows/MAC), потрібен буде файл з Headend Deployment Package у назві:
Завантажені файли можна викласти, наприклад, на FTP сервер і завантажити на кожну окрему ASA:
Налаштовуємо ASDM та Self-Signed сертифікат для SSL-VPN (у продуктиві сертифікат рекомендується використовувати довірений). Встановлений FQDN Віртуальної адреси кластера (vpn-demo.ashes.cc), а також кожен FQDN асоційований із зовнішньою адресою кожної ноди кластера повинен дозволятися в зовнішній зоні DNS на IP-адресу інтерфейсу OUTSIDE (або на mapped адресу, якщо використовується прокидання порту udp/443 (DTLS) та tcp/443(TLS)). Детальна інформація щодо вимог до сертифікату вказана в розділі Перевірка сертифіката документації.
!
vpn-demo-1(config)# crypto ca trustpoint SELF
vpn-demo-1(config-ca-trustpoint)# enrollment self
vpn-demo-1(config-ca-trustpoint)# fqdn vpn-demo.ashes.cc
vpn-demo-1(config-ca-trustpoint)# subject-name cn=*.ashes.cc, ou=ashes-lab, o=ashes, c=ru
vpn-demo-1(config-ca-trustpoint)# serial-number
vpn-demo-1(config-ca-trustpoint)# crl configure
vpn-demo-1(config-ca-crl)# cry ca enroll SELF
% The fully-qualified domain name in the certificate will be: vpn-demo.ashes.cc
Generate Self-Signed Certificate? [yes/no]: yes
vpn-demo-1(config)#
!
vpn-demo-1(config)# sh cry ca certificates
Certificate
Status: Available
Certificate Serial Number: 4d43725e
Certificate Usage: General Purpose
Public Key Type: RSA (4096 bits)
Signature Algorithm: SHA256 with RSA Encryption
Issuer Name:
serialNumber=9A439T02F95
hostname=vpn-demo.ashes.cc
cn=*.ashes.cc
ou=ashes-lab
o=ashes
c=ru
Subject Name:
serialNumber=9A439T02F95
hostname=vpn-demo.ashes.cc
cn=*.ashes.cc
ou=ashes-lab
o=ashes
c=ru
Validity Date:
start date: 00:16:17 MSK Mar 19 2020
end date: 00:16:17 MSK Mar 17 2030
Storage: config
Associated Trustpoints: SELF
CA Certificate
Status: Available
Certificate Serial Number: 0509
Certificate Usage: General Purpose
Public Key Type: RSA (4096 bits)
Signature Algorithm: SHA1 with RSA Encryption
Issuer Name:
cn=QuoVadis Root CA 2
o=QuoVadis Limited
c=BM
Subject Name:
cn=QuoVadis Root CA 2
o=QuoVadis Limited
c=BM
Validity Date:
start date: 21:27:00 MSK Nov 24 2006
end date: 21:23:33 MSK Nov 24 2031
Storage: config
Associated Trustpoints: _SmartCallHome_ServerCA
Для перевірки роботи ASDM не забувайте вказувати порт, наприклад:
Проведемо базові налаштування тунелю:
Зробимо доступним через тунель корпоративну мережу, а інтернет пустимо безпосередньо (не найбезпечніший метод за відсутності засобів захисту на хості, що підключається, можливе проникнення через заражений хост і виведення корп. даних, опція split-tunnel-policy tunnelall пустить весь трафік хоста у тунель. Проте Split-Tunnel дає можливість розвантажити шлюз VPN і не обробляти трафік Інтернету хоста)
Видамо хостам у тунель адреси з підмережі 192.168.20.0/24 (пул з 10 до 30 адрес (для ноди #1)). На кожній ноді кластера VPN пул має бути свій.
Проведемо базову аутентифікацію локально створеним користувачем на ASA (Так робити не рекомендується, це найпростіший метод), краще робити аутентифікацію через LDAP/RADIUS, а ще краще прив'язати Багатофакторна автентифікація (MFA), Наприклад Cisco DUO.
(ОПЦІОНАЛЬНО): У наведеному вище прикладі ми використовували локального користувача на МСЕ для автентифікації віддалених користувачів, що звичайно, крім як в лабораторії слабо застосовно. Я наведу приклад того, як швидко адаптувати налаштування для автентифікації на RADIUS сервер, для прикладу використаний Движок Cisco Identity Services:
Дана інтеграція дала можливість не тільки швидко інтегрувати процедуру аутентифікації з сервісом каталогів AD, але і розрізняти належність комп'ютера до AD, що підключається, розуміти корпоративний цей пристрій або особисте і проводити оцінку стану пристрою, що підключається.
Зробимо налаштування Transparent NAT щоб трафік між клієнтом та ресурсами мережі корпоративної мережі не натувався:
vpn-demo-1(config-network-object)# subnet 192.168.20.0 255.255.255.0
!
vpn-demo-1(config)# nat (inside,outside) source static any any destination static vpn-users vpn-users no-proxy-arp
(ОПЦІОНАЛЬНО): Щоб випустити наших клієнтів в Інтернет через ASA (при використанні tunnelall опції) з використанням PAT, а також виходити через той самий інтерфейс OUTSIDE, звідки вони з'єднуються потрібно зробити наступні настройки
Вкрай важливо при використанні кластера дати можливість внутрішньої мережі зрозуміти на яку ASA маршрутизувати зворотний трафік до користувачів, для цього необхідно зробити редистрибуцію маршрутів /32 адрес, що видаються клієнтам.
На даний момент кластер ми ще не налаштовували, але ми вже маємо працюючі VPN шлюзи, до яких можна індивідуально підключитися за FQDN або IP.
Ми бачимо підключеного клієнта у таблиці маршрутизації першої ASA:
Щоб весь наш VPN кластер і вся корпоративна мережа знала маршрут до нашого клієнта, проведемо редистрибуцію префіксу клієнта в протокол динамічної маршрутизації, наприклад OSPF:
Тепер у нас є маршрут до клієнта з другого шлюзу ASA-2 і користувачі, підключені до різних VPN шлюзів в рамках кластера, можуть, наприклад, спілкуватися через корпоративний софтфон безпосередньо, також як і зворотний трафік від ресурсів, що запитують користувач, буде приходити на потрібний VPN шлюз:
Переходимо до налаштування Load-Balancing кластера.
Адреса 192.168.31.40 буде використовуватися як Virtual IP (VIP - до нього будуть первинно з'єднуватися всі VPN клієнти), з цієї адреси Master кластера буде робити REDIRECT на менш завантажену ноду кластера. Не забудьте прописати прямий та зворотний DNS запис як кожної зовнішньої адреси/FQDN кожної ноди кластера, так VIP.
Перевіряємо роботу кластера з двома підключеними клієнтами:
Зробимо досвід роботи клієнта зручнішим з автоматичним завантаженням профілем AnyConnect через ASDM.
Називаємо профіль зручним чином та асоціюємо нашу групову політику з ним:
Після наступного підключення клієнта цей профіль буде автоматично завантажений і встановлений у AnyConnect клієнт, таким чином залишиться за необхідності підключення просто вибрати його зі списку:
Оскільки, використовуючи ASDM, ми створили цей профіль тільки на одній ASA, не забудьте повторити дії на інших ASA кластерах.
Висновок: Таким чином, ми швидко розгорнули кластер з кількох VPN шлюзів з автоматичним балансуванням навантаження. Додати нові ноди до кластера не важко, отримавши просте горизонтальне масштабування шляхом розгортання нових віртуальних машин ASAv або використання апаратних ASA. Багатофункціональний клієнт AnyConnect може розширити можливості безпечного віддаленого підключення з використанням функції Posture (оцінки стану), що найбільш ефективно застосовується спільно з системою централізованого контролю та обліку доступу Identity Services Engine.