Воскрешаем Dynamic VPN на Juniper SRX100H2
Juniper
]
Приветствую, друг!
Это статья-заметка, отражающая рутину сетевого инженера. Не всегда, знаете ли, приходится запускать интересные проекты :)
Тут я добрался, наконец, до Juniper. Жаль, что не что-то современное и актуальное, но что поделать, чем больше работаю в сетях, тем больше убеждаюсь, некромантия - это неизбежно :)
В любом случае, я пострадал и разобрался, вдруг кому пригодится результат.
Пациент: SRX100H2 (H2 - 2G DRAM памяти) с древним софтом (12.1X44-D15.5) и к тому же EoL.
Конфиг можно считать стандартным: базовый NAT, зоны, правила и dynamic vpn по официальной доке.
Проблема: Dynamic VPN не работает от слова совсем. Подключение реализуется через Junos Pulse. На этапе, когда “все работало” клиент использовал Junos Pulse 2.0
Дано:
- идентичная железка, на которой можно поэкспериментировать (что замечательно)
- конфиг-файл с железки в проде
- пакет Junos Pulse 2.0
Немного информации о работе с Junos OS для тех, кто, так же как я, впервые столкнулся с ней.
Junos собрана на основе FreeBSD. После логина, вы попадаете в Unix shell, %
подскажет вам об этом.
Чтобы перейти в более менее классический cli, нужно использовать команду cli
, после чего, приветствие с %
изменится на >
- рабочий режим или operational mode.
Чтобы перейти в режим конфигурации, вводим команду configure
, приветствие с >
изменится на #
.
Если в отделе несколько инженеров, в режим конфигурации лучше заходить через команду
configure private
, чтобы несколько человек могли одновременно сидеть в этом режиме.
За уточнение спасибо @Volchano
Как выглядят разные режимы в консоли:
root@srx100h2% cli <- Unix shell
root@srx100h2> configure <- Operational mode
Entering configuration mode
[edit]
root@srx100h2# <- Configuration mode
Дальнейшая работа в cli мало чем отличается от остальных вендоров. Из особенностей:
commit/rollback
конфигуарции как часть процесса конфигуарцииset
задать что-либоdelete
удалить что-либоrequest
попросить систему сделать что-либо (например отправить в ребутrequest system reboot
)show
в operational mode работает предсказуемо - показывает инфу о чем-либо, в режиме configuration mode работает как вьювер json файла конфигурации - показывает структуру запрашиваемого куска конфига в виде json.
Вроде все, поехали разбираться.
Заливаем конфиг
Предварительно ознакомившись с конфигом в текстовом редакторе, закинем его на устройство.
В Junos конфиг записывается в формате json
, если не знакомы, документ с примерами.
Команда (в режиме
#
)show | display set
- чтобы Cisco глазки не плакали и можно было copy/paste конфигурации через set сделать и не париться с редактированием через терминал.
За уточнение спасибо @vassiliy_borulko
Мы можем скопировать конфиг прямо в терминал, используя команду: (не построчно, а весь файл целиком) load merge terminal
Выполняется из режима #
.
Кроме необходимого нам merge
у нее есть несколько опций, о которых, в том числе, можно почитать тут.
После ввода команды, увидим приглашение ко вводу. Открываем файл в блокноте, CTRL+A и копируем в терминал:
[edit]
root@srx100h2# load merge terminal
[Type ^D at a new line to end input]
> <- Вставляем конфиг сюда
В конце жмем ENTER, чобы перейти на следующую строку и далее CTRL+D, чтобы закончить ввод.
Командой
show
можно посмотреть конфиг целиком, прежде чем его закоммитить.
Теперь используем команду commit
и готово, конфиг применен.
Заливаем софт
Ранее я уже возился с воскрешением ASA5505, поэтому мы сразу попробуем обновить софт.
Для начала нужно определиться, какой софт подходит. Для этого смотрим, какой последний релиз на SRX100.
Видим, нужная нам версия: Junos 12.3X48-D105
. Раздобыть прошивки не так сложно, но в текущих реалиях нужно таки немного постараться. Используемые мной прошивки для решения данной задачи, я закинул на ЯД, либо можно поглядеть, например тут.
При попытке накатить софт, доходим до того, что просто так прыгнуть на последнюю версию не выйдет. Выхватываем ошибку формата WARNING: Package 12.3X48-Dxx is not compatible with this hardware
, тут подробнее.
Наша версия очень старая, поэтому необходимо сначала обновиться до промежуточной, а затем до последней. Качаем нужный софт, далее заливаем в железку. Я делал с помощью WinSCP по FTP, предварительно включив его командой: (не забудьте выключить после)
root@srx100h2> confgigure
root@srx100h2# set system services ftp
root@srx100h2# commit
Подключаемся по FTP, используя адрес железки внутри локальной сети и пароль администратора.
Кладем софт (в формате .tgz
) прямиком в /var/tmp/.
Переходим в терминал и проверяем, что софт на месте:
root@srx100h2> file list /var/tmp/
/var/tmp/:
cleanup-pkgs.log
eedebug_bin_file
gksdchk.log
gres-tp/
idp_license_info
install/
junos-srxsme-12.1X46-D25.7-domestic.tgz <- промежуточный
junos-srxsme-12.3X48-D105.4-domestic.tgz <- последний для SRX100H2
kmdchk.log
krt_gencfg_filter.txt
nsd_restart
pics/
policy_status
rtsdb/
sec-download/
spu_kmd_init
vi.recover/
vpn_tunnel-_orig.id
vpn_tunnel_orig.id
Осталось запустить процесс установки (отдельно для каждой версии) из >
режима консоли.
Используем доп. опцию
no-validate
т.к нам ни к чему проверять файл прошивки иreboot
по окончанию всех операций.
root@srx100h2> request system software add /var/tmp/junos-srxsme-12.1X46-D25.7-domestic.tgz no-validate reboot
После промежуточного обновления, рекомендую проверить show version
, если все встало, проворачиваем то же самое для следующего файла.
Полезные мелочи
Осталось обновить BIOS, обновить резервный образ и сохранить рабочий конфиг в резервный.
Проверяем версию BIOS (с новой прошивкой будет и новая версия BIOS)
root@srx100h2> show system firmware
Тут все просто, если Current совпадает с Available - ничего делать не нужно, если нет - нужно.
Обновим сразу и основной и бэкап:
root@srx100h2> request system firmware upgrade re bios
root@srx100h2> request system firmware upgrade re bios backup
Статус обновления можно смотреть в выводе предыдущей команды show
. Сначала будет состояние - PROGRAMMING, а после успешного завершения - UPGRADED SUCCESSFULLY.
На скриншоте показано успешное обноление BIOS, после которого можно отправлять железку в ребут командой:
root@srx100h2> request system reboot
Reboot the system ? [yes,no] (no) yes
Теперь обновим резервный образ, который используется, если с основным что-то случилось. Обычно, Junos OS предупреждает об этом следующим сообщением:
Такой баннер вы точно не пропустите :)
Обновление производится в одну команду:
root@srx100h2# request system snapshot slice alternate
Formatting alternate root (/dev/da0s2a)...
Copying '/dev/da0s1a' to '/dev/da0s2a' .. (this may take a few minutes)
The following filesystems were archived: /
Можно посмотреть текущее состояние резервной копии. Видим, что есть primary и backup, версии должны совпадать:
root@srx100h2> show system snapshot media internal
Information for snapshot on internal (/dev/da0s1a) (primary)
Creation date: Feb 8 15:20:35 2023
JUNOS version on snapshot:
junos : 12.3X48-D105.4-domestic
Information for snapshot on internal (/dev/da0s2a) (backup)
Creation date: Feb 8 16:25:58 2023
JUNOS version on snapshot:
junos : 12.3X48-D105.4-domestic
Осталось обновить резервный конфиг, делается командой:
request system configuration rescue save
Теперь мы сможем легко вернуться на резервный конфиг:
rollback rescue
commit check
commit
В чем же проблема
После обновления софта проблема не решилась, при попытке подключиться через Junos Pulse 2.0, получаем бесконечные реконекты.
Сначала проверим самое очевидное - лицензии. В SRX из коробки есть две бесплатные лицензии dynamic vpn, их клиенту хватает, в конфиге всего два пользователя. Проблему с лицензиями отметаем.
Далее я нашел актуальную версию Junos Pulse, положил так же на ЯД, если кому пригодится.
Подключиться к VPN с Junos Pulse 9.1 так же не удалось.
Изучив конфигурацию подробнее, я заметил один момент, в gateway dyn-vpn-local-gw
-> external-interface
сконфигурирован как физический fe-0/0/0
, а основной внешний интерфейс на железке - логический fe-0/0/0.0
.
gateway dyn-vpn-local-gw {
ike-policy ike-dyn-vpn-policy;
dynamic {
hostname dynvpn;
connections-limit 10;
ike-user-type group-ike-id;
}
external-interface fe-0/0/0; <- тут
xauth access-profile dyn-vpn-access-profile;
}
Т.к остальной конфиг подозрений не вызывает, поправим досадное упущение с интерфейсом:
root@srx100h2# set security ike gateway dyn-vpn-local-gw external-interface fe-0/0/0.0
commit
Проверяем и действительно, теперь все заработало как надо.
В URL указываете IP или hostname адрес внешнего интерфейса.
Проверяем ike sa и ipsec sa:
Проблема решена, но предлагаю немного задержаться и поглядеть на один интересный момент, почему все же стоит периодически менять железо.
SHA1? AES128? серьезно?
Как можно заметить, алгоритмы у нас sha1 и aes-128-cbs, не густо для 2023…
Забегая вперед, далее в конфиге мы установили все параметры вручную, но если вы обратитесь к документации, рекомендуемый proposal-set для pre-shared ключей следующий:
Другие proposal-set требуют сертификат вместо общего ключа, а в нашем случае поддерживается только общий ключ.
### IKE ###
Sec-level basic: preshared key, g1, des, sha1
Sec-level compatible: preshared key, g2, 3des, sha1
Sec-level standard: preshared key, g2, aes128, sha1
### IPSEC ###
Sec-level basic: esp, no pfs (if not configured) or groupx (if configured), des, sha1
Sec-level compatible: esp, no pfs (if not configured) or groupx (if configured), 3des, sha1
Sec-level standard: esp, g2 (if not configured) or groupx (if configured), aes128, sha1
Чтобы манипулировать алгоритмами в proposals, будем использовать custom proposals, вместо рекомендованных proposal-set standard
. Вот так выглядит кусок конфига с custom proposals для ike и ipsec:
### IKE ###
proposal ike-proposal {
authentication-method pre-shared-keys;
dh-group group2;
authentication-algorithm sha1;
encryption-algorithm aes-128-cbc;
lifetime-seconds 28800;
}
policy ike-dyn-vpn-policy {
mode aggressive;
proposals ike-proposal;
pre-shared-key ascii-text ## SECRET-DATA
}
gateway dyn-vpn-local-gw {
ike-policy ike-dyn-vpn-policy;
dynamic {
hostname dynvpn;
connections-limit 10;
ike-user-type group-ike-id;
}
external-interface fe-0/0/0.0;
xauth access-profile dyn-vpn-access-profile;
}
### IPSEC ###
proposal ipsec-proposal {
protocol esp;
authentication-algorithm hmac-sha1-96;
encryption-algorithm aes-128-cbc;
lifetime-seconds 3600;
}
policy ipsec-dyn-vpn-policy {
proposals ipsec-proposal;
}
vpn dyn-vpn {
ike {
gateway dyn-vpn-local-gw;
ipsec-policy ipsec-dyn-vpn-policy;
}
}
Можем ли мы улучшить ситуацию? Совсем немного…
После череды успешных и не очень экспериментов, получились следующие результаты:
IKE (Только IKEv1)
- aes-256-cbs
- sha1
- dh group2
IPSEC
- esp
- aes-256-cbs
- hmac-sha1-96
Т.е нам доступно только повышение до AES-256-cbs, изменение остальных параметров приводит к неуспешному подключению. Т.е есть возможность поставить более стойкие алгоритмы, но dynamic vpn имеет достаточно серьезные ограничения. Поправим конфиг в соответствии с данными:
set security ike proposals ike-proposal encryption-algorithm aes-256-cbc
set security ipsec proposals ipsec-proposal encryption-algorithm aes-256-cbc
commit
Наблюдаем aes-256-cbs, это максимум, на что способен SRX100H2 и Dynamic VPN.
Ближайшая замена, рекомендуемая Juniper - SRX300. На нем мы можем поднять уже Juniper Secure Connect, который предлагает гораздо больше опций. Документ, где можно почитать про основные различия Dynamic VPN и Secure Connect.
У меня не было цели разбирать возможности железки целиком или настройку Dynamic VPN целиком. Моя конфигурация была стандартной. Оставлю пару ссылок по теме Dynamic VPN на SRX. Если я где-либо ошибся, не стесняйтесь поправлять в комментариях.
Список источников:
- Описание proposal-set (Security IKE)
- Описание Dynamic VPNs через Pulse Secure
- Пример конфигурации Dynamic VPN
- Гайд по настройке Dynamic VPN на SRX
- Гайд по ролбэку на резервный конфиг
Хочешь обсудить тему?
С вопросами, комментариями и/или замечаниями, приходи в чат или подписывайся на канал.