Создание программно-определяемой сети и VPN с помощью ZeroTier One

В наши дни все больше и больше программных проектов создаются командами, члены которых работают в разных городах или даже странах. Такой рабочий процесс имеет много очевидных преимуществ, однако бывают случаи, когда подобным командам нужно связать свои компьютеры через Интернет так, как если бы они находились в одной комнате. Например, чтобы протестировать распределенные системы, такие как Kubernetes, или создавать сложные мультисервисные приложения. Иногда это просто улучшает производительность. А еще вы не рискуете открыть незащищенным сервисам доступ в Интернет. Эта парадигму можно построить с помощью Software-Defined Networking (SDN), относительно новой технологии, которая предоставляет динамическую сетевую структуру, которая полностью состоит из программного обеспечения.

ZeroTier One – это открытое приложение, которое использует некоторые из последних разработок SDN, что позволяет пользователям создавать безопасные, управляемые сети и обрабатывать подключенные устройства так, как если бы они находились в одном и том же физическом местоположении. ZeroTier предлагает веб-консоль для управления сетью и программное обеспечение конечной точки для клиентов. Это зашифрованная технология Peer-to-Peer (равноправных субъектов) – в отличие от традиционных решений VPN, связь не проходит через центральный сервер или маршрутизатор, сообщения отправляются напрямую с хоста на хост. Это очень эффективно и обеспечивает минимальную задержку. Среди других преимуществ – простой процесс развертывания и настройки ZeroTier, простое обслуживание, возможность централизованной регистрации и управления авторизованными нодами через веб-консоль.

Этот мануал поможет вам настроить простую сеть типа «точка-точка». Поскольку программно-определяемая сеть не использует традиционный дизайн «клиент-сервер», в установке и настройке не будет центрального VPN-сервера; это упрощает развертывание инструмента и добавление дополнительных нод. После установления соединения вы сможете использовать возможности ZeroTier VPN и некоторые умные функции Linux, чтобы перенаправить трафик из сети ZeroTier с вашего сервера и настроить клиент для отправки трафика в этом направлении.

Требования

  • Сервер Ubuntu 16.04, настроенный по этому мануалу.
  • Аккаунт ZeroTier One, который можно создать здесь. Для этого мануала подойдет и бесплатная версия.
  • Локальный компьютер, который можно подключить к SDN в качестве клиента. В этом мануале сервер и компьютер используют Ubuntu Linux. полный список поддерживаемых клиентов вы найдете здесь.

1: Создание программно-определяемой сети с помощью ZeroTier One

Платформа ZeroTier предоставляет центральную точку управления программно-определенной сетью. Здесь вы можете авторизовать и деактивировать клиентов, выбрать схему адресации и создать сетевой Network ID, на который можно направить клиентов при настройке.

Войдите в свою учетную запись ZeroTier, нажмите Networks в верхней части экрана и нажмите Create. Появится автоматически созданное имя сети. Кликните по нему, чтобы просмотреть конфигурации сети. Запишите Network ID, выделенный желтым цветом, поскольку вам нужно будет ссылаться на него позже.

Если вы предпочитаете указать более описательное сетевое имя, отредактируйте имя в левой части экрана; вы также можете добавить описание, если хотите. Все внесенные вами изменения будут сохранены и применены автоматически.

Затем укажите, для какого IPv4-диапазона будет использоваться SDN. В правой части экрана в области IPv4 Auto-Assign выберите диапазон адресов, в который будут попадать ваши ноды. Для целей данного мануала можно использовать любой диапазон, но важно оставить флажок Auto-Assign from Range.

Убедитесь, что Access Control слева установлен на Certificate (Private Network). Это гарантирует, что к вашей сети смогут подключаться только одобренные машины, а не любой, кто знает ваш Network ID.

Основа программно-определяемой сети ZeroTier готова. Теперь нужно установить программное обеспечение ZeroTier на сервере и клиентских компьютерах, чтобы они могли подключаться к SDN.

2: Установка клиента ZeroTier One на сервер и локальный компьютер

Поскольку ZeroTier One является относительно новой программой, он еще не включен в основные репозитории программного обеспечения Ubuntu. Потому ZeroTier предоставляет сценарий, который можно использовать для установки. Эта команда является подписанным GPG скриптом. Этот сценарий состоит из четырех основных частей:

  • curl -s ‘https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61’ – импортирует открытый ключ ZeroTier из MIT.
  • gpg —import – добавляет открытый ключ ZeroTier в локальную цепочку доверенных ключей. Следующая часть команды будет выполнена только в случае, если импорт GPG пройдет успешно.
  • if z=$(curl -s ‘https://install.zerotier.com/’ | gpg); then echo «$z» – эта часть делает несколько вещей. В целом, если криптографически подписанный сценарий установки, загруженный с ZeroTier.com, проходит через GPG и не отклоняется как неподписанный, эта команда выведет информацию на экран.
  • sudo bash; fi – эта часть берет проверенный только что сценарий и выполняет его.

Важно! Ни в коем случае нельзя скачивать что-то из Интернета и перенаправлять в другую программу, если вы не уверены в надежности источника. Если хотите, вы можете проверить программное обеспечение ZeroTier, просмотрев исходный код на официальной странице проекта на GitHub.

Подключитесь к своему серверу и выполните следующую команду в качестве обычного пользователя (разбор команды приведен ниже). Убедитесь, что вы не запускаете его как root, так как сценарий автоматически запрашивает пароль для повышения уровня привилегий, и не забудьте оставить консоль ZeroTier открытой в браузере, чтобы вы могли взаимодействовать с ней, когда это необходимо.

curl -s 'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61' | gpg --import && if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi

Как только скрипт завершит работу, вы увидите примерно такие две строки вывода. Запишите свой адрес ZeroTier (без квадратных скобок) и имя системы, сгенерировавшей этот адрес, оба значения вам понадобятся позже:

*** Waiting for identity generation...
*** Success! You are ZeroTier address [ 916af8664d ].

Повторите этот шаг на локальном компьютере, если используете Ubuntu. Если вы пользуетесь другой системой, выполните соответствующие действия для вашей ОС (их можно найти на сайте ZeroTier). Опять же, не забудьте записать адрес ZeroTier и систему, сгенерировавшую этот адрес. Эта информация понадобится на следующем этапе этого мануала.

3: Подключение к сети ZeroTier

Теперь ПО ZeroTier есть на сервере и на клиенте, и вы можете подключить эти машины к сети через веб-консоль ZeroTier.

Используйте следующую команду, чтобы клиент запрашивал доступ к сети ZeroTier через платформу. Исходный запрос клиента будет отклонен и оставлен висящим, но скоро мы исправим это. Обязательно замените NetworkID своим идентификатором сети, который вы записали ранее.

sudo zerotier-cli join NetworkID
200 join OK

Вы получите сообщение 200 join OK, если сервис ZeroTier выполнил ее успешно. Если вы не получили такой ответ, проверьте свой Network ID.

Поскольку вы создали не общедоступную сеть, к которой может присоединиться любой пользователь, а закрытую сеть, теперь вам нужно авторизовать своих клиентов. Перейдите в веб-консоль ZeroTier и прокрутите страницу вниз до части, где находится раздел Members. Вы должны найти две записи, помеченные как Online, с теми же адресами, которые вы записали ранее.

В первом столбце поставьте флажок Auth?, чтобы разрешить им присоединиться к сети. Контроллер Zerotier присвоит серверу и клиенту IP-адрес из выбранного диапазона в следующий раз, когда они вызовут SDN.

Выделение IP-адресов может занять некоторое время. Во время ожидания вы можете указать краткое имя (Short Name) и описание (Description) нод в разделе Members.

Итак, вы подключили в программно-определяемую сеть две системы.

Вы ознакомились с панелью управления ZeroTier, использовали интерфейс командной строки для загрузки и установки ZeroTier, а также подключили сервер и клиент к этой сети. Теперь нужно убедиться, что все было сделано правильно.

4: Проверка соединения

На этом этапе важно подтвердить, что обе ноды могут взаимодействовать друг с другом. Хотя хосты утверждают, что подключены к сети, есть вероятность, что они не могут общаться.

Легкий способ узнать IP-адрес ZeroTier для каждого хоста – посмотреть в раздел Members веб-консоли ZeroTier. Возможно, вам придется обновить страницу после авторизации сервера и клиента. Кроме того, для поиска этих адресов вы можете использовать командную строку Linux. Используйте следующую команду на обеих машинах – вам нужно будет использовать первый IP-адрес, указанный в списке. В приведенном ниже примере это 203.0.113.0.

ip addr sh zt0 | grep 'inet'
inet 203.0.113.0/24 brd 203.0.255.255 scope global zt0
inet6 fc63:b4a9:3507:6649:9d52::1/40 scope global
inet6 fe80::28e4:7eff:fe38:8318/64 scope link

Чтобы проверить соединение между хостами, запустите ping с одного хоста и укажите IP-адрес второго. На клиенте команда будет выглядеть так:

ping your_server_ip

А на сервере – так:

ping your_client_ip

Если с противоположного хоста возвращаются ответы (как показано ниже), то ноды успешно обмениваются данными по SDN.

PING 203.0.113.0 (203.0.113.0) 56(84) bytes of data.
64 bytes from 203.0.113.0: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 203.0.113.0: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 203.0.113.0: icmp_seq=3 ttl=64 time=0.043 ms

Вы можете добавить в эту конфигурацию столько машин, сколько захотите, повторив описанные выше процессы установки ZeroTier и добавления машины в сеть.

Теперь, когда вы убедились, что ваш сервер и клиент могут взаимодействовать друг с другом, вы можете попробовать настроить сеть, чтобы обеспечить выходной шлюз и создать собственный VPN.

5: Настройка функции ZeroTier VPN

Как упоминалось во введении, ZeroTier можно использовать в качестве инструмента VPN. Если вы не планируете использовать ZeroTier как VPN-средство, вам не нужно следовать этому разделу. Просто перейдите к разделу 6.

VPN скрывает источник ваших сообщений. Это позволяет обойти фильтры и ограничения, которые могут существовать в используемой вами сети. В сети Интернет вы будете просматриваться с общедоступного IP-адреса своего сервера. Чтобы использовать ZeroTier в качестве инструмента VPN, вам нужно внести еще несколько изменений в конфигурацию сервера и клиента.

Включение трансляции сетевых адресов и IP-форвардинга

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

Хотя NAT обычно выполняется маршрутизатором, сервер также может ее выполнять. На данном этапе нужно использовать эту функциональность на своем сервере ZeroTier, чтобы включить возможности VPN.

IP-форвардинг – это функция, выполняемая маршрутизатором или сервером, благодаря которой трафик перенаправляется с одного интерфейса на другой, если эти IP-адреса находятся в разных зонах. Если маршрутизатор был подключен к двум сетям, то IP-форвардинг позволяет ему пересылать трафик между ними. Эта функция может показаться простой, но ее на удивление сложно реализовать успешно. Однако в данном мануале для ее поддержки нужно отредактировать нескольких файлов конфигурации.

Включив IP- форвардинг, вы направите VPN-трафик клиента в сети ZeroTier на интерфейс ZeroTier сервера. Без этих изменений конфигурации ядро Linux (по умолчанию) будет сбрасывать все пакеты, не предназначенные для интерфейса, на который они идут. Это нормальное поведение ядра Linux, поскольку обычно поступающие на интерфейс пакеты, целевой адрес которых находится в другой сети, вызваны неправильной конфигурацией маршрутизации в другой точке сети.

IP-форвардинг следует рассматривать как способ сообщит ядру Linux, что пакеты, направляемые на разные интерфейсы, можно принимать. По умолчанию эта функция отключена – это значение 0. Чтобы включить ее, нужно изменить значение на 1.

Чтобы просмотреть текущую конфигурацию, введите:

sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

Чтобы включить переадресацию IP, отредактируйте файл /etc/sysctl.conf на своем сервере и добавьте в него нужную строку. Этот файл позволяет администратору переопределять настройки ядра по умолчанию и всегда применяется после перезагрузки, поэтому вам не нужно будет перенастраивать его снова. Используйте nano или другой текстовый редактор, чтобы добавить следующую строку в конец файла.

sudo nano /etc/sysctl.conf
. . .
net.ipv4.ip_forward = 1

Сохраните и закройте файл, а затем запустите следующую команду, чтобы обновить настройки ядра.

sudo sysctl -p

Сервер применит новые директивы в файле немедленно, без перезагрузки. Выполните ту же команду, что и раньше, и вы увидите, что IP-форвардинг теперь включен.

sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

Теперь, когда IP-форвардинг включен, вы можете предоставить серверу новые правила маршрутизации. Поскольку в ядре Linux уже встроена сетевая функция маршрутизации, все, что вам нужно сделать – это добавить некоторые правила, чтобы сообщить встроенному брандмауэру и маршрутизатору, что новый трафик не нужно сбрасывать.

Чтобы добавить эти правила из командной строки, вам сначала нужно узнать имена, которые система Ubuntu присвоила интерфейсу Zerotier и обычным интернет-интерфейсам. Обычно это zt0 и eth0 соответственно, однако это не всегда так.

Чтобы узнать имена этих интерфейсов, используйте команду ip link show. Эта утилита командной строки является частью iproute2, коллекции утилит, которая по умолчанию устанавливается на Ubuntu:

ip link show

В выводе этой команды имена интерфейсов находятся непосредственно рядом с номерами, которые определяют уникальный интерфейс в списке. Эти имена интерфейсов ниже выделены красным. Если у вас используются другие интерфейсы, замените имя интерфейса.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 72:2d:7e:6f:5e:08 brd ff:ff:ff:ff:ff:ff
3: zt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/ether be:82:8f:f3:b4:cd brd ff:ff:ff:ff:ff:ff

Теперь используйте iptables для включения nat и IP-маскарадинга:

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Включите переадресацию трафика и отслеживание активных соединений:

sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Затем разрешите переадресацию трафика от zt0 на eth0. Обратное правило не требуется, поскольку в этом мануале предполагается, что клиент всегда вызывается через сервер, а не наоборот:

sudo iptables -A FORWARD -i zt0 -o eth0 -j ACCEPT

Важно помнить, что правила iptables автоматически не сохраняются при перезагрузке. Вам нужно будет сохранить эти правила, чтобы они возвращались в действие после перезагрузки. Для этого на сервере выполните приведенные ниже команды, следуя инструкциям на экране, чтобы сохранить текущие правила IPv4 (IPv6 не требуется).

sudo apt-get install iptables-persistent
sudo netfilter-persistent save

После запуска команды sudo netfilter-persistent save может возникнуть необходимость перезагрузить сервер, чтобы проверить сохранность правил iptables. Простым способом проверки является команда sudo iptables-save, которая сбрасывает текущую конфигурацию, загруженную в память, в терминал. Если вы видите правила маскарадинга, форвардинга и интерфейса zt0, значит, ваши новые правила сохранены.

sudo iptables-save
# Generated by iptables-save v1.6.0 on Tue Apr 17 21:43:08 2018
. . .
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
. . .
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i zt0 -o eth0 -j ACCEPT
COMMIT
. . .

Теперь, когда эти правила работают на сервере, он может управлять трафиком между сетью ZeroTier и Интернетом. Тем не менее, VPN не будет работать, если сеть ZeroTier не знает о том, что сервер можно использовать в качестве шлюза.

Настройка сервера для управления глобальными маршрутами

Чтобы сервер обрабатывал трафик любого клиента, нужно убедиться, что другие клиенты в сети ZeroTier знают, что свой трафик нужно отправлять на него. Это можно сделать, установив глобальный маршрут в консоли ZeroTier (также это называется Default Route). Сюда любой клиент сможет отправлять трафик по умолчанию, то есть любой трафик, который не должен попасть в какое-либо другое конкретное расположение.

Перейдите в верхнюю правую часть страницы Networks в консоли ZeroTier и добавьте новый маршрут со следующими параметрами. IP-адрес ZeroTier можно найти в разделе Members  на странице конфигурации Network ZeroTier. В поле network/bits введите 0.0.0.0/0, в поле (LAN) введите IP-адрес вашего сервера ZeroTier.

Когда данные будут на месте, нажмите «+», и вы увидите, что новое правило появится ниже существующего. В нем будет оранжевый глобус, что указывает на глобальный маршрут.

Осталось только настроить клиент.

Настройка клиентов Linux

Примечание: Команды в этом разделе применимы только для клиентов Linux. Инструкции по настройке клиентов Windows или macOS приведены в следующем разделе.

Если ваш клиент работает на Linux, вам нужно будет вручную внести изменения в файл /etc/sysctl.conf. Это нужно для изменения представления ядра о допустимом пути возврата клиентского трафика. Поскольку теперь работает VPN, трафик, возвращающийся с сервера на клиентскую машину, иногда может отправляться с другого сетевого адреса, а не с того, на который он был отправлен. По умолчанию ядро Linux рассматривает такой трафик как недопустимый и сбрасывает его.

Откройте файл /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Добавьте строку:

. . .
net.ipv4.conf.all.rp_filter=2

Сохраните и закройте файл. Теперь запустите эту команду, чтоб применить изменения:

sudo sysctl -p

Затем сообщите программе ZeroTier Client, что вашей сети разрешено переносить трафик default route. Это меняет маршрутизацию клиента и потому считается привилегированной функцией, ее необходимо активировать вручную. Команда выведет структуру конфигурации. Убедитесь, что в начале есть строка allowDefault=1:

sudo zerotier-cli set NetworkID allowDefault=1

Если позже вы решите прекратить использование ZeroTier VPN, установите allowDefault=0:

sudo zerotier-cli set NetworkID allowDefault=0

При каждом перезапуске ZeroTier на клиенте значение allowDefault=1 будет сбрасываться до 0, поэтому не забудьте повторно обновить его, чтобы активировать функции VPN.

По умолчанию сервис ZeroTier запускается автоматически при загрузке как на клиентах Linux, так и на сервере. Если вы хотите удалить сервис из автозагрузки, вы можете сделать это с помощью следующей команды.

sudo systemctl disable zerotier-one

Если вы хотите использовать другие операционные системы в своей сети ZeroTier, читайте следующий раздел. В противном случае перейдите к разделу «Управление потоками».

Другие клиенты (не Linux)

Клиентское программное обеспечение ZeroTier доступно для многих систем, не только для ОС Linux – поддерживаются даже смартфоны. ZeroTier  предлагает клиенты для Windows, MacOS, Android, iOS и даже для специализированных операционных систем, таких как QNAP, Synology и WesternDigital NAS

Чтобы подключить клиентов MacOS и Windows к сети, запустите инструмент ZeroTier и введите свой NetworkID в указанное поле, а затем нажмите Join. Не забудьте поставить в консоли ZeroTier флажок в Allow для авторизации нового хоста в сети.

Обязательно поставьте галочку в поле Route all traffic through ZeroTier. Если вы этого не сделаете, клиент будет подключен к сети ZeroTier, но не будет отправлять через нее свой трафик.

Используйте средство проверки IP-адресов, например ICanHazIP, чтобы убедиться, что трафик появляется в Интернете с IP-адреса вашего сервера. Чтобы проверить это, вставьте следующий URL-адрес в адресную строку браузера. На этом веб-сайте будет показан IP-адрес, который вы используете для доступа к сайту:

http://icanhazip.com

После этого вы сможете использовать свою сеть VPN.

6: Управление потоками (опционально)

Одним из преимуществ программно-определяемой сети является централизованный контроллер. В контексте ZeroTier это пользовательский веб-интерфейс. Из этого интерфейса можно писать правила потока, которые определяют, какой трафик может или не может отправлять сеть. Например, вы можете закрыть определенные сетевые порты, несущие трафик по сети, ограничить взаимодействие между хостами и даже перенаправить трафик.

Это чрезвычайно эффективная функция, которая вступает в силу почти мгновенно, поскольку любые изменения, внесенные в таблицу потоков, передаются членам сети и вступают в силу всего через несколько секунд. Чтобы изменить правила потока, вернитесь в веб-интерфейс ZeroTier, перейдите во вкладку Networking и прокрутите страницу вниз, пока не увидите поле Flow Rules (возможно, его нужно будет развернуть). Вы увидите текстовое поле, в котором можно указать любые правила. Полное руководство доступно в консоли ZeroTier (чуть ниже поля Flow Rules, называется Rules Engine Help).

Вот несколько примеров правил, которые помогут вам изучить эту функциональность.

Чтобы заблокировать любой трафик, связанный с DNS-сервером Google 8.8.8.8, добавьте это правило:

drop
ipdest 8.8.8.8/32
;

Чтобы перенаправить трафик общедоступного DNS-сервера Google на одну из нод ZeroTier, добавьте следующее правило.

redirect NetworkID
ipdest 8.8.8.8/32
;

Если сеть имеет особые требования к безопасности, вы можете отключить FTP-порты, Telnet и незашифрованный HTTP, добавив это правило:

drop
dport 80,23,21,20
;

Добавив все необходимые правила,  нажмите Save Changes.

Заключение

В этом мануале вы познакомились с Software-Defined Networking и получили некоторое представление о преимуществах этой технологии и ZeroTier. Также вы знаете, как с помощью этого инструмента настроить VPN. VPN дает вам более глубокое представление о том, как работает маршрутизация в такой сети. Также вы узнали кое-что о правилах потоков.

Теперь, когда у вас сеть «точка-точка», вы можете расширить ее функции, например, настроить общий доступ к файлам. Если у вас есть NAS или файловый сервер, вы можете связать его с ZeroTier и получить быстрый доступ к нему. Если вы хотите поделиться файлами со своими друзьями, вы можете присоединить их к вашей сети ZeroTier. Сотрудники, живущие в разных частях планеты, могут использовать в сети централизованные места хранения данных.

Tags: , , , ,