По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
В этой статье рассмотрим как решить следующие неисправности: Вам не удаётся включить виртуальную машину При включении виртуальной машины происходит сбой Вы видите ошибку: An unexpected error was received from the ESX host while powering on VM . Reason: Cannot open the disk disk_name or one of the snapshot disks it depends on. Где причина одна из следующего: Reason: Failed to lock the file. Reason: The parent virtual disk has been modified since the child was created. Reason: The destination file system does not support large files. Reason: Could not open/create change tracking file. Reason: Cannot allocate memory. Reason: The file specified is not a virtual disk. Reason: Insufficient permission to access file. Решение Ошибка №1: не удалось заблокировать файл. Ошибка «не удалось заблокировать файл» означает, что файл открывается другим процессом и используемый Вами процесс не может открыть файл должным образом. Это обычно происходит, если Вы: Пытаетесь запустить вторую виртуальную машину, используя тот же .vmx файл конфигурации виртуальной машины. Включаете виртуальную машину с подключенными дисками с помощью утилиты vmware-mount. Пытаетесь включить виртуальную машину через пользовательский интерфейс во время операции снимка. Пытаетесь добавить виртуальный диск к виртуальной машине, которая уже используется. Ошибка №2: Родительский виртуальный диск был изменен с момента создания дочернего диска Данная ошибка возникает, когда снимки находятся в плохом состоянии, либо из-за ручного вмешательства, либо из-за сбоя системы. Ошибка №3: целевая файловая система не поддерживает большие файлы Данная проблема возникает, если размер блока целевого хранилища данных не поддерживает VMDK такого же размера, как исходный. Чтобы устранить данную проблему, убедитесь, что целевое хранилище данных отформатировано с размером блока, достаточным для поддержки файла VMDK исходной машины. Ошибка №4: не удалось открыть или создать файл отслеживания изменений Эта проблема может возникнуть, если файл filename-ctk.vmdk был создан ранее и не был очищен. Ошибка №5: не удается выделить память Данная проблема может возникнуть, если в модуле VMFS не хватает места в куче. Ошибка №6: указанный файл не является виртуальным диском Данная проблема может возникнуть, если файл дескриптора .vmdk поврежден или отсутствует. Чтобы решить данную проблему, создайте новый файл дескриптора .vmdk для этого диска, а затем отмените регистрацию и заново зарегистрируйте виртуальную машину. Это гарантирует, что клиент vSphere определит правильный размер диска и виртуальная машина включится правильно. Ошибка №7: недостаточно прав для доступа к файлу Данная проблема обычно наблюдается в виртуальных машинах, расположенных на хранилищах данных NFS. Данная проблема может возникнуть из-за проблем с разрешениями в хранилище данных NFS. Чтобы решить данную проблему, убедитесь, что хост имеет правильные разрешения на чтение / запись для доступа к экспорту NFS. Если в массиве хранения установлен параметр "Нет корневого квадрата" (No Root Squash), убедитесь, что данная опция включена, или обратитесь к администратору хранилища.
img
Основная цель любого проекта по разработке ПО – получить прибыль за счет автоматизации бизнес-процессов. Чем быстрее вы начнете выпускать новые версии, тем лучше для компании. Но как же научиться выпускать новые версии максимально быстро? Конечно же, все можно делать вручную. Например, подключить удаленный сервер через SSH, клонировать клонировать репозиторий с новым кодом, собрать его и запустить через командную строку. Да, такой способ работает, но он малоэффективен. Сегодня мы поговорим об автоматизации процесса разработки и выхода новых версий. CI и CD – это два сокращения, которые означают Continuous Integration (Непрерывная интеграция) и Continuous Delivery (Непрерывное развертывание). CI CI описывает процесс добавления изменений в репозиторий. Ниже схематически представлен простой пример коллективной разработки. Одновременно может работать целая группа людей, но все изменения передаются в главную ветку master поэтапно. Хотя даже в такой простой схеме возникает несколько вопросов. Как мы узнаем, что код, который идет в ветку master, компилируется? Мы хотим, чтобы разработчики писали тесты для кода. Как быть уверенными в том, что тестовое покрытие не уменьшится? Все сотрудники команды должны форматировать код в соответствие с определенным стилем. Как отследить возможные нарушения? Конечно же, все это можно проверить вручную. Но такой подход весьма хаотичен. Кроме того, по мере разрастания команды выполнять подобные проверки становится сложнее. CI используется для автоматизации выше обозначенных пунктов. Начнем с первого пункта. Как можно проверить, что новые изменения не сломают сборку? Для этого нам потребуется еще один блок в схеме. Большинство CI-процессов можно описать по следующему алгоритму. При открытии каждого Pull Request (запроса на включение изменений) и отправке новых изменений, Git-сервер отправляет уведомление CI-серверу. CI-сервер клонирует репозиторий, проверяет исходную ветку (например bugfix/wrong-sorting) и сливает ее с основной веткой master. Затем запускается скрипт сборки. Например ./gradlew build. Если команда возвращает код «0», то сборка прошла успешно. Все остальные значения считаются ошибкой. CI-сервер отправляет запрос на Git-сервер с результатом сборки. Если сборка прошла без ошибок, то Pull Request разрешается слить. В противном случае он блокируется. Данный процесс гарантирует, что код, попадающий в ветку master, не сломает дальнейшие сборки. Проверка тестового покрытия Давайте немного усложним задачу. Предположим, нам захотелось установить минимальный охват тестового покрытия. Это означает, что в любой момент времени покрытие ветки master должно быть не менее 50%. Плагин Jacoco идеально справляется с этой задачей. Вы просто настраиваете его так, чтобы при охвате тестового покрытия ниже допустимого, сборка уходила в ошибку. Реализовать такой подход проще некуда. Но есть небольшая оговорка. Этот метод работает только при условии, что плагин настраивался на старте проекта. Представим ситуацию: вы работаете над проектом, которому уже 5 лет. С момента первого коммита никто не проверял тестовое покрытие. Разработчики добавляли тесты в случайном порядке и без какой-либо организации. Но вот однажды вы решаете увеличить количество тестов. Вы настраиваете плагин Jacoco на минимальную планку в 60%. Спустя какое-то время разработчик открывает новый Pull Request. Затем разработчики вдруг понимают, что покрытие – всего лишь 30%. Так что для успешного закрытия задачи нужно покрыть не менее 30% кода продукта. Как вы можете догадаться, для проекта 5-летней давности – это практически неразрешимая проблема. Но что, если будут проверяться только будущие изменения в коде, а не весь продукт? Если в Pull Request разработчик изменит 200 строк, то нужно будет охватить не менее 120 из них (при тестовом покрытии в 60%). Тогда не придется проходить по множеству модулей, которые не относятся к задаче. В принципе, проблема решаема. Но как применить все это к проекту? К счастью, есть решение. Отчет Jacoco отправляется на сервер тестового покрытия. Одно из самых популярных решений – SonarCloud. Сервер хранит статистику по предыдущим вычислениям. Это очень удобно: вычислять тестовое покрытие не только всего кода, но и будущих изменений. Затем результат анализа отправляется на CI-сервер, который перенаправляет его на Git-сервер. Такая рабочая модель позволяет применять культуру обязательного тестирования на любой стадии развития продукта, поскольку проверяется лишь часть изменений. Если говорить о стиле оформления кода, то отличий практически нет. Можете попробовать плагин Checkstyle. Он автоматически отклоняет сборку, которая нарушает любое из заявленных требований. Например, в коде есть неиспользованный импорт. Кроме того, вы можете присмотреться к облачным сервисам, которые выполняют анализ кода и визуально отображают результаты в виде графиков (SonarCloud это тоже умеет). CD CD описывает процесс автоматического развертывания новой версии продукта. Давайте еще немного подкорректируем схему CI. Вот так конвейерный процесс CI/CD мог бы выглядеть в реальном проекте. Первое отличие – теперь CI-сервер называется CI/CD-сервером. Дело в том, что зачастую оба процесса (CI и CD) выполняются одним и тем же диспетчером задач. Так что мы будем рассматривать именно этот случай. Но так бывает не всегда. Например, задачи по интеграции могут делегироваться на GitLab CI, а задачи по доставке – отдаваться в Jenkins. Правая часть схемы изображает CI. Мы обсудили ее выше. Слева показана CD. Задача по CD создает проект (или повторно использует артефакты, полученные на стадии CI) и развертывает его на конечном сервере. Стоит отметить, что сервер в нашем случае – это понятие абстрактное. Например, развертывание может выполняться в кластер Kubernetes. Так что самих серверов может быть несколько. Обычно после стадии развертывания на почту приходят сообщения о выполнении. Например, CD-сервер может уведомлять подписчиков об успешном развертывании/ошибках. В любом случае, возникает важный вопрос. В какой момент мы должны запускать задачи по CD? Триггеры могут быть разными. Развертывание после каждого слияния Pull Request. Развертывание по расписанию. Развертывание после каждого слияния Pull Request с определенной веткой. Сочетание нескольких вариантов. В первом пункте процесс выстроен так, что задачи по CI и CD всегда выполняются последовательно. Данный подход весьма популярен при разработке программ с исходным кодом. Библиотека Semantic Release помогает настроить проект для прозрачной интеграции данной модели. Важно помнить о трактовке понятия deploy (развертывание). Это не всегда «что-то где-то запустить». Например, при разработке библиотеки, нет никакого запуска. В данном случае процесс развертывания означает выпуск новой версии библиотеки. Второй пункт не зависит от процесса CI, ведь проект развертывается по определенному расписанию. Например, ежедневно в 01:00. Третий пункт аналогичен первому, но с небольшими отличиями. Предположим, в репозитории у нас есть 2 основные ветки: develop и master. В develop содержатся самые последние изменения, а в master – только релизы версий. Если мы хотим развертывать только ветку master, то не нужно вызывать CD-задачу по слиянию в develop. Последний пункт – это сочетание подходов. Например, ветку develop можно развертывать по расписанию в среду разработки. А ветку master – в реальную среду по каждому слиянию Pull Request. Инструменты На рынке доступно множество решений по автоматизации процессов CI/CD. Ниже представлено несколько продуктов. Jenkins. Один из самых востребованных инструментов CI/CD в мире. Свою популярность он заслужил, благодаря политике открытого кода (open-source). То есть вам не нужно ни за что платить. В Jenkins вы можете императивно описывать конвейеры сборки с помощью Groovy. С одной стороны это достаточно гибкое решение, но с другой – требует более высокого уровня квалификации. GitHub Actions. Этот инструмент для CI/CD доступен для GitHub и GitHub Enterprise. В отличие от Jenkins, GitHub Actions предлагает декларативные сценарии сборки с YAML-конфигурацией. Кроме того, в данном решении доступна интеграция с различными системами обеспечения качества (например SonarCube). Таким образом, сборку можно описать в нескольких текстовых строках. GitLab CI. Во многом похож на GitHub Actions, но со своими особенностями. Например, GitLab CI может указывать на определенные тесты, вызывающие ошибку в сборке. Travis CI. Облачный CI/CD-сервис. Предлагает множество возможностей, не требующих сложных настроек. Например, шифрование данных, которые следует скрыть в публичном репозитории. Есть и приятный бонус в том, что Travis CI можно совершенно бесплатно использовать в публичных open-source проектах на GitHub, GitLab и BitBucket.
img
В этой статье произведем настройку туннеля IPSec между Palo Alto и Cisco ASA Firewall. Далее будет использован брандмауэр Palo Alto с прошивкой PANOS 8.1.10. Хотя, конфигурация почти такая же и в других версиях PANOS. Для понимания этой статьи вам необходимы базовые знания по IPSec VPN. Для настройки этой конфигурации вам не нужна дополнительная лицензия на обоих устройствах. Для настройки туннеля IPSec необходимо иметь статический маршрутизируемый IP- адрес. Итак, давайте начнем настройку! Как настроить IPSec VPN между Cisco ASA и брандмауэром Palo Alto Что нужно сделать - настроить туннель IPSec между Cisco ASA и брандмауэром Palo Alto Как выше говорилось, вам понадобиться статический маршрутизируемый IP-адрес как в Palo Alto, так и в брандмауэре Cisco ASA. В этом примере я использую два маршрутизируемых IP- адреса на обоих брандмауэрах Palo Alto и Cisco ASA (между ними настроена связь, и они доступны друг другу). IP-адрес 1.1.1.1 настроен на брандмауэре Cisco ASA и 2.2.2.2 настроен на брандмауэре Palo Alto как показано ниже: Как вы заметили, подсеть LAN 192.168.1.0/24 связана с Cisco ASA, а с другой стороны, подсеть LAN 192.168.2.0/24 связана с брандмауэром Palo Alto. Прежде чем перейти к части конфигурации, просто проверьте доступность обоих устройств с помощью утилиты ping. admin@PA-220> ping host 1.1.1.1 PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data 64 bytes from 1.1.1.1: icmp_seq1 ttl=64 time=0.177 ms 64 bytes from 1.1.1.1: icmp_seq2 ttl=64 time=0.157 ms Шаги по настройке туннеля IPSec на брандмауэре Palo Alto Во-первых, мы настроим туннель IPSec на брандмауэре Palo Alto. Для настройки фазы 1 и фазы 2 туннеля IPSec в Palo Alto необходимо выполнить следующие действия. Создание зоны безопасности на брандмауэре Palo Alto Во-первых, нам нужно создать отдельную зону безопасности на брандмауэре Palo Alto. Для того чтобы настроить зону безопасности, вам нужно перейти Network >> Zones>> Add. Здесь вам нужно указать название зоны безопасности. Вы можете ввести любое удобное имя. Создание туннельного интерфейса на брандмауэре Palo Alto Вам необходимо определить отдельный виртуальный туннельный интерфейс для туннеля IPSec. Чтобы определить интерфейс туннеля, перейдите в раздел Network >> Interfaces>> Tunnel. Выберите виртуальный маршрутизатор, который в моем случае используется по умолчанию. Кроме того, в файле зоны безопасности необходимо выбрать зону безопасности, определенную на Шаге 1. Хотя для этого интерфейса вам не нужно указывать IP-адрес IPv4 или IPv6. Кроме того, вы можете прикрепить профиль управления на вкладке Advanced, если вам это нужно. Определение IKE Crypto Profile [Фаза 1 туннеля IPSec] Теперь вам нужно определить фазу 1 туннеля IPSec. Вам нужно зайти Network >> Network Profiles >> IKE Crypto >> Add. Здесь вам нужно дать дружественное имя для IKE Crypto profile. Затем определите DH группу, метод шифрования и аутентификации. По умолчанию срок службы ключа составляет 8 часов. Вы можете изменить его в соответствии с вашим требованием. Определение Crypto Profile IPSec [Фаза 2 туннеля IPSec] Теперь вам нужно определить фазу 2 туннеля IPSec. Вам нужно перейти Network>> Network Profiles >> IPSec Crypto >> Add. Здесь, вы должны дать понятное имя для профиля шифрования по протоколу IPSec. Выберите протокол IPsec в соответствии с вашими требованиями. У вас есть ESP (Encapsulation Security Protocol) и AH (Authentication Header) протокол для IPSec. Затем определите группу DH, метод шифрования и аутентификации. По умолчанию срок службы ключа составляет 1 час. Вы можете изменить его в соответствии с вашим требованием. Определение профиля шлюза IKE Теперь вам нужно перейти Network >> Network Profiles >> IKE Gateways >> Add. На вкладке Общие (General) необходимо определить имя профиля шлюза IKE. В поле Interface вам нужно ввести/определить свой интернет-интерфейс, в моем случае ethernet1/1, который имеет IP-адрес 2.2.2.2. Установите переключатель в поле Peer IP Address Type в IP. Укажите адрес в поле Peer address, в моем случае 1.1.1.1. Выберите метод аутентификации в поле Authentication, т. е. выберите или общий ключ (Pre Shared Key) или сертификат (Certificate). В этом сценарии я использую предварительный общий ключ (Pre-shared Key). Затем определите предварительный общий ключ (Pre-shared Key) и запишите его, потому что он нужен для определения в FortiGate Firewall. Введите в поля Local Identification и Peer Identification локальный и удаленный IP-адреса. Нажмите на Advanced Option, в IKEv1 выберите Ike Crypto Profile, который определяется на Шаге 3. Создание туннеля IPSec Мы определили шлюз IKE и IPSec Crypto profile для нашего туннеля IPSec. Теперь мы должны определить туннель IPSec. Перейдите в раздел Network >> IPSec Tunnels >> Add. Определите удобное имя для туннеля IPSec. Затем выберите туннельный интерфейс, который определен в шаге 2. Выберите профили для Ike Gateway и IPsec Crypto Profile, которые определены в шаге 3 и шаге 5 соответственно. Перейдите на вкладку идентификаторы (IDs) прокси-серверов и определите локальные и удаленные сети. В этом сценарии я использую подсети 192.168.1.0/24 и 192.168.2.0/24 в LAN. Создание политики безопасности для туннельного трафика IPSec Теперь вам нужно создать профиль безопасности, который позволяет передавать трафик из зоны VPN в зону доверия. Вам нужно перейти Policies >> Security >> Add, чтобы определить новую политику. Настройка маршрута для одноранговой частной сети Теперь вам нужно предоставить статический маршрут для частной сети. Просто перейдите в раздел Network >> Virtual Routers >> Default >> Static Routes >> Add. Выберите имя для этого маршрута и определите целевую сеть для этого маршрута, т.е. 192.168.1.0/24 в данном примере. Выберите следующий переход к туннельному интерфейсу, который определен в шаге 2. Мы закончили настройку туннеля IPSec в брандмауэре Palo Alto. Теперь мы настроим туннель IPSec в FortiGate Firewall. Этапы настройки туннеля IPSec в брандмауэре Cisco ASA Теперь мы настроим туннель IPSec в брандмауэре Cisco ASA. Здесь, в этом примере, я использую программное обеспечение Cisco ASA версии 9.8 (1). Хотя конфигурация туннеля IPSec такая же и в других версиях. Ниже показаны основные шаги настройки IPSec на Cisco ASA: Настройка фазы 1 (IKEv1) Определение туннельной группы (Tunnel Group) и предварительного общего ключа (Pre-Shared Key) Настройка фазы 2 (IPSec) Настройка расширенного ACL (Extended ACL) и криптографической карты (Crypto Map) Итак, давайте начнем настройку с настройки фазы 1 Cisco ASA. Перейдите в режим глобальной конфигурации Cisco ASA и начните с приведенных ниже команд Настройка фазы 1 (IKEv1) на Cisco ASA ciscoasa(config)# crypto ikev1 enable outside ciscoasa(config)# crypto ikev1 policy 10 ciscoasa(config-ikev1-policy)# authentication pre-share ciscoasa(config-ikev1-policy)# encryption 3des ciscoasa(config-ikev1-policy)# hash md5 ciscoasa(config-ikev1-policy)# group 2 ciscoasa(config-ikev1-policy)# lifetime 7200 Теперь давайте быстро разберемся в значении каждой команды. Encryption: 3des – используется для шифрования трафика фазы 1 Хэш: md5 – это алгоритм хеширования. Он аутентифицирует наши данные с помощью хэша Group: 2 – Диффи Хеллман группа 2 Authentication – в этом примере мы используем предварительный общий ключ в качестве аутентификации Lifetime: 7200 – 86400 срок службы по умолчанию для Фазы 1 В Cisco ASA нам нужно включить криптографию IKEv1 к интерфейсу, обращенному к интернету. Итак, мы можем сделать это с помощью приведенной ниже команды: ciscoasa(config)# crypto ikev1 enable outside Настройка туннельной группы и предварительного общего ключа на Cisco ASA Теперь нам нужно определить туннельный интерфейс и предварительный общий ключ. В этой статье я использую сеть GNS3 в качестве предварительного общего ключа. ciscoasa(config)# tunnel-group 2.2.2.2 type ipsec-l2l ciscoasa(config)# tunnel-group 2.2.2.2 ipsec-attributes ciscoasa(config-tunnel-ipsec)# ikev1 pre-shared-key GNS3Network Настройка IPSec IKEv1 (Фаза 2) Здесь нам нужно определить методы шифрования и аутентификации для IPSec Фазы 2 ciscoasa(config-ikev1-policy)# crypto ipsec ikev1 transform-set ESP-AES-SHA esp-3des esp-md5-hmac ciscoasa(config)# crypto ipsec security-association lifetime seconds 7200 А теперь давайте быстро разберемся в каждой команде. ESP: ESP означает инкапсулирование полезной нагрузки безопасности, и это протокол IPSec 3DES: 3DES – это один из алгоритмов шифрования MD5: MD5 – это алгоритм хеширования, который используется для поддержания целостности данных 7200 секунд: срок службы ключа IPSec Phase2 Настройка криптографической карты (Crypto MAP) и расширенного ACL (Extended ACL) для разрешения трафика IPSec на Cisco ASA Это заключительный этап нашей конфигурации. Здесь нам нужно определить расширенный ACL, чтобы разрешить трафик. Кроме того, здесь нам нужно настроить криптокарту и вызвать настроенную криптокарту на внешний интерфейс. Я настраиваю два адресных объекта для упрощения списка управления доступом (ACL). Адресный объект и расширенный ACL для разрешения трафика ciscoasa(config)# object-group network local-network ciscoasa(config-network-object-group)# network-object 192.168.1.0 255.255.255.0 ciscoasa(config-network-object-group)# object-group network remote-network ciscoasa(config-network-object-group)# network-object 192.168.2.0 255.255.255.0 ciscoasa(config-network-object-group)# access-list asa-paloalto-vpn extended permit ip object-group local-network object-group remote-network Настройка криптографической карты ciscoasa(config)# crypto map outside_map 10 match address asa-paloalto-vpn ciscoasa(config)# crypto map outside_map 10 set pfs group2 ciscoasa(config)# crypto map outside_map 10 set peer 2.2.2.2 ciscoasa(config)# crypto map outside_map 10 set ikev1 transform-set ESP-ASE-SHA Включение криптокарты на внешнем интерфейсе ciscoasa(config)# crypto map outside_map interface outside Инициирование туннеля IPSec и проверка трафика с помощью Wireshark На этом этапе мы просто должны инициировать трафик по туннелю IPSec. Если обе фазы туннеля IPSec работают, то ваша настройка идеальна. Итак, давайте получим доступ к CLI брандмауэра Palo Alto и инициируем туннель IPSec: admin@PA-VM>test vpn ipsec-sa admin@PA-VM>test vpn ipsec-sa Теперь давайте получим доступ к туннелям Device >> IPSec и проверим состояние только что созданного туннеля IPSec! Если оба фазовых туннеля находятся в состоянии UP, то они будут выглядеть так, как показано на рисунке ниже: А теперь давайте запустим трафик с одного из брандмауэров. Я инициирую движения в направлении Palo Alto межсетевой экран от Cisco ASA. ciscoasa# ping 192.168.2.1 Type escape sequence to abort Sending 5, 100-byte ICMP Echos to 192.168.2.1, timeout is 2 seconds: ?!!!! Success rate is 80 percent (4/5), round-trip min/avg/max = 30/30/30 ms Первый пакет отбрасывается только из-за запроса и ответа ARP. Больше никакой пакет не будет отброшен. Необязательно: если вы пытаетесь инициировать трафик от IP интерфейса Cisco ASA (т.е. в данном примере), вам нужно разрешить доступ управления к подсети. ciscoasa(config)# management-access inside Устранение неполадок в туннеле IPSec В этой части этой статьи мы обсудим некоторые основные команды, которые помогут вам устранить неполадки туннеля IPSec, настроенного между Cisco ASA и маршрутизатором Cisco. Устранение неполадок туннеля IPSec на брандмауэре Cisco ASA ciscoasa# show running-config ipsec ciscoasa# show running-config crypto ikev1 ciscoasa# show running-config crypto map Устранение неполадок IPSec-туннель на брандмауэре Palo Alto Давайте откроем Monitor >> System и воспользуемся фильтром "(subtype eq vpn)". Здесь вы найдете все журналы, связанные с VPN. Если у вас возникли проблемы с туннелем IPSec, вы можете использовать следующие команды для запуска туннеля IPSec: admin@PA-CM>test vpn ipsec-sa admin@PA-CM>test vpn ipsec-sa Анализ трафика IPSec через Wireshark Во время настройки туннеля IPSec мы определили ESP (Encapsulating Security Payload) как протокол IPsec, поэтому весь реальный трафик, который идет к одноранговому концу, будет зашифрован с помощью этого протокола. Таким образом, вы найдете только ESP- пакеты в захвате пакетов, как показано ниже Резюме В этой статье мы настраиваем туннель IPSec между брандмауэром Cisco ASA и брандмауэром следующего поколения Palo Alto. Мы также обсудили алгоритмы шифрования и аутентификации. Однако для настройки IPSec VPN между двумя удаленными сетями необходимо использовать статические маршрутизируемые IP-адреса.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59