У цій статті я хотів би навести покрокову інструкцію того, як можна швидко розгорнути схему, що наразі масштабується. Remote-Access VPN доступу на базі AnyConnect та Cisco ASA - VPN Load Balancing Cluster.
Вступ: Багато компаній у всьому світі через поточну обстановку з COVID-19 роблять зусилля з переведення своїх співробітників на віддалений режим роботи. Зважаючи на масовість переходу на віддалену роботу, критичним чином зростає навантаження на наявні VPN шлюзи компаній і потрібна дуже швидка можливість їх масштабування. З іншого боку, багато компаній змушені поспіхом освоювати з нуля таке поняття як віддалена робота.
Для того, щоб допомогти бізнесу реалізувати в найкоротший термін зручний, безпечний і масштабований доступ VPN для співробітників, компанія Cisco надає на строк до 13 тижнів ліцензії на багатофункціональний SSL-VPN клієнт AnyConnect. .
.
Я підготував покрокову інструкцію простого варіанта розгортання 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: -> 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.
! vpn-demo-1(config)# ip local pool vpn-pool 192.168.20.10-192.168.20.30 mask 255.255.255.0 ! vpn-demo-1(config)# access-list split-tunnel standard permit 192.168.0.0 255.255.0.0 ! vpn-demo-1(config)# group-policy SSL-VPN-GROUP-POLICY internal vpn-demo-1(config)# group-policy SSL-VPN-GROUP-POLICY attributes vpn-demo-1(config-group-policy)# vpn-tunnel-protocol ssl-client vpn-demo-1(config-group-policy)# split-tunnel-policy tunnelspecified vpn-demo-1(config-group-policy)# split-tunnel-network-list value split-tunnel vpn-demo-1(config-group-policy)# dns-server value 192.168.99.132 vpn-demo-1(config-group-policy)# default-domain value ashes.cc vpn-demo-1(config)# tunnel-group DefaultWEBVPNGroup general-attributes vpn-demo-1(config-tunnel-general)# default-group-policy SSL-VPN-GROUP-POLICY vpn-demo-1(config-tunnel-general)# address-pool vpn-pool ! vpn-demo-1(config)# username dkazakov password cisco vpn-demo-1(config)# username dkazakov attributes vpn-demo-1(config-username)# service-type remote-access ! vpn-demo-1(config)# ssl trust-point SELF vpn-demo-1(config)# webvpn vpn-demo-1(config-webvpn)# enable outside vpn-demo-1(config-webvpn)# anyconnect image disk0:/anyconnect-win-4.8.03036-webdeploy-k9.pkg vpn-demo-1(config-webvpn)# anyconnect enable !- (ОПЦІОНАЛЬНО): У наведеному вище прикладі ми використовували локального користувача на МСЕ для автентифікації віддалених користувачів, що звичайно, крім як в лабораторії слабо застосовно. Я наведу приклад того, як швидко адаптувати налаштування для автентифікації на RADIUS сервер, для прикладу використаний Движок Cisco Identity Services:
vpn-demo-1(config-aaa-server-group)# dynamic-authorization vpn-demo-1(config-aaa-server-group)# interim-accounting-update vpn-demo-1(config-aaa-server-group)# aaa-server RADIUS (outside) host 192.168.99.134 vpn-demo-1(config-aaa-server-host)# key cisco vpn-demo-1(config-aaa-server-host)# exit vpn-demo-1(config)# tunnel-group DefaultWEBVPNGroup general-attributes vpn-demo-1(config-tunnel-general)# authentication-server-group RADIUS !Дана інтеграція дала можливість не тільки швидко інтегрувати процедуру аутентифікації з сервісом каталогів 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, звідки вони з'єднуються потрібно зробити наступні настройки
vpn-demo-1(config-network-object)# nat (outside,outside) source dynamic vpn-users interface vpn-demo-1(config)# nat (inside,outside) source dynamic any interface vpn-demo-1(config)# same-security-traffic permit intra-interface !- Вкрай важливо при використанні кластера дати можливість внутрішньої мережі зрозуміти на яку ASA маршрутизувати зворотний трафік до користувачів, для цього необхідно зробити редистрибуцію маршрутів /32 адрес, що видаються клієнтам.
На даний момент кластер ми ще не налаштовували, але ми вже маємо працюючі VPN шлюзи, до яких можна індивідуально підключитися за FQDN або IP.

Ми бачимо підключеного клієнта у таблиці маршрутизації першої ASA:

Щоб весь наш VPN кластер і вся корпоративна мережа знала маршрут до нашого клієнта, проведемо редистрибуцію префіксу клієнта в протокол динамічної маршрутизації, наприклад OSPF:
! vpn-demo-1(config)# route-map RMAP-VPN-REDISTRIBUTE permit 1 vpn-demo-1(config-route-map)# match ip address VPN-REDISTRIBUTE ! vpn-demo-1(config)# router ospf 1 vpn-demo-1(config-router)# network 192.168.255.0 255.255.255.0 area 0 vpn-demo-1(config-router)# log-adj-changes vpn-demo-1(config-router)# redistribute static metric 5000 subnets route-map RMAP-VPN-REDISTRIBUTEТепер у нас є маршрут до клієнта з другого шлюзу ASA-2 і користувачі, підключені до різних VPN шлюзів в рамках кластера, можуть, наприклад, спілкуватися через корпоративний софтфон безпосередньо, також як і зворотний трафік від ресурсів, що запитують користувач, буде приходити на потрібний VPN шлюз:

Переходимо до налаштування Load-Balancing кластера.
Адреса 192.168.31.40 буде використовуватися як Virtual IP (VIP - до нього будуть первинно з'єднуватися всі VPN клієнти), з цієї адреси Master кластера буде робити REDIRECT на менш завантажену ноду кластера. Не забудьте прописати прямий та зворотний DNS запис як кожної зовнішньої адреси/FQDN кожної ноди кластера, так VIP.
vpn-demo-1(config)# vpn load-balancing vpn-demo-1(config-load-balancing)# interface lbpublic outside vpn-demo-1(config-load-balancing)# interface lbprivate inside vpn-demo-1(config-load-balancing)# priority 10 vpn-demo-1(config-load-balancing)# cluster ip address 192.168.31.40 vpn-demo-1(config-load-balancing)# cluster port 4000 vpn-demo-1(config-load-balancing)# redirect-fqdn enable vpn-demo-1(config-load-balancing)# cluster key cisco vpn-demo-1(config-load-balancing)# cluster encryption vpn-demo-1(config-load-balancing)# cluster port 9023 vpn-demo-1(config-load-balancing)# participate vpn-demo-1(config-load-balancing)#- Перевіряємо роботу кластера з двома підключеними клієнтами:

- Зробимо досвід роботи клієнта зручнішим з автоматичним завантаженням профілем AnyConnect через ASDM.

Називаємо профіль зручним чином та асоціюємо нашу групову політику з ним:

Після наступного підключення клієнта цей профіль буде автоматично завантажений і встановлений у AnyConnect клієнт, таким чином залишиться за необхідності підключення просто вибрати його зі списку:

Оскільки, використовуючи ASDM, ми створили цей профіль тільки на одній ASA, не забудьте повторити дії на інших ASA кластерах.
Висновок: Таким чином, ми швидко розгорнули кластер з кількох VPN шлюзів з автоматичним балансуванням навантаження. Додати нові ноди до кластера не важко, отримавши просте горизонтальне масштабування шляхом розгортання нових віртуальних машин ASAv або використання апаратних ASA. Багатофункціональний клієнт AnyConnect може розширити можливості безпечного віддаленого підключення з використанням функції Posture (оцінки стану), що найбільш ефективно застосовується спільно з системою централізованого контролю та обліку доступу Identity Services Engine.
Джерело: habr.com


















