понедельник, 23 марта 2020 г.

Быстрая настройка VPN шлюза. Freebsd+Zerotier

В свете последних событий, многие администраторы столкнулись с необходимостью организации удаленной работы сотрудников.

Стандартом для этого является использование VPN. Но классический VPN требует наличия белого статического IP, что не у всех предприятий присутствует, кроме того, надо учитывать, что мы подключаем большое количество неквалифицированных пользователей, работающих из дома (зверинец систем, часто отсутствие доступа к компьютеру на том конце) для которых переконфигурирование клиента, например при переходе на резервный канал интернет, является непосильной задачей.
Все эти вопросы решает программно определяемая локальная сеть Zerotier.
Её я сегодня и буду колхозить

Внимание!
Все IP адреса, адресные пространства, member_ID и прочее, используемые в данной заметке, после ее написания будут уничтожены и в дальнейшем мною использоваться не будут!

Предварительные условия

Для реализации задуманного нам потребуется компьютер в нашей сети предприятия, с доступом к интернет, на который необходимо пробросить UDP порт 9993 с маршрутизатора, через который осуществляется выход в интернет. Кроме того, IP этого компьютера должен быть указан в качестве шлюза для хождения в нашу zerotier сеть в статических маршрутах шлюза по умолчанию (или добавлен на каждый компьютер, с которым будет осуществляться взаимодействие из zerotier сети).

У меня, после экспериментов с установкой qemu-guest-agent на FreeBSD осталась настроенная виртуальная машина FreeBSD 12.1 ее я и использую в качестве Zerotier шлюза.

Регистрация аккаунта Zerotier

Так, как тема - быстрая настройка шлюза, вариант установки своего контроллера мы рассматривать не будем, а воспользуемся бесплатным аккаунтом Zerotier one. Идем по ссылке
и в правом верхнем углу жмем my.zerotier.com
Выбор невелик - жмем логин
Здесь мы предполагаем, что у нас нет учетной записи и мы можем:
  1. Пройти процедуру регистрации
  2. Войти с учетной записью google
Я выбрал второй вариант
Мы попадаем на страницу выбора тарифного плана - бесплатно можно использовать до 100 клиентов, что для малых и средних предприятий вполне достаточно

Настройка Zerotier сети

Жмем в верхней строке меню <Networks>
Жмем создать сеть
Щелчком по сети входим в настройки сети, которые состоят из следующих секций
  1. Базовые
    1. Network ID - уникальный индентификатор сети, по которому к ней добавляются клиенты
    2. Name - некое осмысленное имя сети, по которому вы на предыдущем экране сможете отличить одну сеть от другой
    3. Description - описание сети, если нужно
    4. Access control - переключатель режима доступа
      • Private - могут подключиться только подтвержденные пользователи (настоятельно рекомендую именно его)
      • Public - может подключиться любой клиент, знающий <Network ID>
  2. Расширенные
    1. Подсеть Zerotier
    2. Маршруты для нашей виртуальной сети
    3. Простая настройка
    4. Расширенная настройка

    Быстрый алгоритм настройки нашей подсети:
    1. Во вкладке Easy выбираем понравившуюся подсеть класса "С" (у нас же маленькое предприятие и ограничение 100 клиентов), например "10.147.17.*"
      Видим как изменилась подсеть
    2. Переходим во вкладку Advanced, удаляем существующий диапазон и задаем новый, меньшего размера
      Добавил диапазон из 40 адресов
    3. Далее задаем шлюз для хождения в сеть нашего предприятия из сети Zerotier (Например сеть предприятия 192.168.100.0/24 а шлюзу присвоим IP не из DHCP диапазона 10.147.17.100)
    4. Больше, на данном этапе, ничего не трогаем
  3. Members - здесь будут отображаться наши клиенты

Установка клиента на FreeBSD 12.1

От имени root выплоняю:
pkg update
pkg upgrade
pkg install -y net/zerotier net/ngrep textproc/jq
Получим приметно это сообщение
Message from zerotier-1.4.6:

--
Note that ZeroTier 1.4.6+ has a *new* license prohibiting commercial SaaS
style usage, as well as excluding government organisations. Read the
license details carefully to ensure your compliance.

First start the zerotier service:

service zerotier start

To connect to a zerotier network:

zerotier-cli join 

If you are running other daemons or require firewall rules to depend on
zerotier interfaces being available at startup, you may need to enable
the following sysctl in /etc/sysctl.conf:

net.link.tap.up_on_open=1

This avoids a race condition where zerotier interfaces are created, but
not up, prior to firewalls and services trying to use them.

You can place optional configuration in /var/db/zerotier-one/local.conf
as required, see documentation at https://www.zerotier.com/manual.shtml

If your system boots from DHCP (such as a laptop), there is a new rc.conf
flag that will require that system startup will wait until the zerotier
network is established before proceeding. Note that this flag *does not*
work for systems confgured with statically assigned IP addresses, and
these will hang indefinitely due to an irreducible loop in rc(8) startup
files. This flag is disabled by default.
Включаем и запускаем:
sysrc zerotier_enable=YES
service zerotier start
Подключаем клиента к сети:
# zerotier-cli join 0cccb752f734e76c
200 join OK
где 0cccb752f734e76c - наш <netvork ID>
команда ifconfig показывает, что появился новый интерфейс:
zt0pj5nabrj9prc: flags=8843<up> metric 5000 mtu 2800
        options=80000<linkstate>
        ether 6e:74:cb:88:ad:cc
        hwaddr 00:bd:ca:41:ff:09
        inet6 fe80::2bd:caff:fe41:ff09%zt0pj5nabrj9prc prefixlen 64 scopeid 0x3
        groups: tap
        media: Ethernet autoselect
        status: active
        nd6 options=21<performnud.auto_linklocal>
        Opened by PID 507
Так же, в интерфейсе контроллера, в разделе "Members" появился наш клиент:
В указанной стрелками последовательности
  1. Вводим IP, который мы указали в качестве шлюза Zerotier сети
  2. Жмем +
  3. Ставим птицу авторизовано
Выполнив ifconfig видим, что Zerotier интерфейсу присвоился адрес:
zt0pj5nabrj9prc: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 5000 mtu 2800
        options=80000<linkstate>
        ether 6e:74:cb:88:ad:cc
        hwaddr 00:bd:ca:41:ff:09
        inet6 fe80::2bd:caff:fe41:ff09%zt0pj5nabrj9prc prefixlen 64 scopeid 0x3
        inet 10.147.17.100 netmask 0xffffff00 broadcast 10.147.17.255
        groups: tap
        media: Ethernet autoselect
        status: active
        nd6 options=21<performnud.auto_linklocal>
        Opened by PID 507
Включаем routing (хождение пакетов между интерфейсами)
# sysctl net.inet.ip.forwarding=1
# sysrc gateway_enable=YES

Примечание
На этом этапе в разных мануалах обычно принято настраивать NAT из сети Zerotier в сеть предприятия - с одной стороны это избавляет от необходимости настраивать обратную маршрутизацию на основном шлюзе предприятия, с другой все клиенты на ресурсах предприятия будут видеться с IP адресом вашего Zerotier шлюза и Вы лишитесь возможности тонкой настройки доступа, с другой стороны можно воспользоваться фильтрацией на уровне Zerotier шлюза или контроллера. Выбор за вами. Я ограничился описанным выше, для лучшего мониторинга и контроля.

Установка Windows клиента

  1. По ссылке в секции Members идем на страницу загрузки клиентов и качаем установщик для Windows
  2. Запускаем установку
  3. После завершения установки щелкаем на иконке в трее
  4. Жмем присоединиться к сети (join network)
  5. В открывшемся окне ввода вводим наш network ID
  6. В консоли Zerotier появится новый клиент
  7. Авторизуем его
На этом задача решена.

Возможные проблемы

Следует обратить внимание, что помимо наличия маршрута в сеть Zerotier на шлюзе предприятия, необходимо обеспечить разрешение на хождение пакетов из сети предприятия в сеть Zerotier.

4 комментария:

  1. Александр, спасибо за интересную статью, раньше про такой вариант не читал нигде, - очень интересно! Сразу же вопрос: у клиентов через какие порты идёт соединение? 9993?

    ОтветитьУдалить
    Ответы
    1. В требованиях открытый UDP 9993 на входящие и исходящие.
      Я на самом шлюзе настроил IPFW для фильтрации доступа с клиентов к ресурсам сети.

      Удалить
    2. Т.е. если оператор мобильной связи блокирует этот порт то перенести на, к примеру, 443 порт не получится вообще или всё-таки возможно?

      Удалить
    3. А почему Вы решили что его блокируют? Это UDP порт Вы его не проверите с помощью веб сервисов или telnet. Создайте аккаунт и поставьте клиент на телефон - если он присоединится к виртуальной сети то все норм.

      Удалить