WireGuard VPN стремительно набирает популярность среди VPN решений. Обеспеченна поддержка многих аппаратных архитектур, в том числе и ARM. По сравнению с другими VPN серверами, WireGuard легко и просто настраивается. В посте рассматривается разворачивание WireGuard VPN сервера в качестве VPN-маршрутизатора для домашней локальной сети с целью доступа к сетевой инфраструктуре размещенной в облаке. Для упрощения, вариант разделения адресного пространства серверов и узлов сети Интернет не будет рассматриваться, т.е. весь исходящий сетевой трафик с домашних устройств, в том числе и в сеть Интернет, будет маршрутизироваться через VPN-сервер.
Оглавление
- Постановка задачи
- Архитектура
- Что такое WireGuard VPN
- Развертывание сервера WireGuard на cloud-server
- Создание и начальная настройка ВМ VM-WireGuard-router
- Настройка ВМ VM-WireGuard-router как VPN-маршрутизатора
- Тестирование VPN-маршрутизатора
- Настройка запуска клиента WireGuard на ВМ VM-WireGuard-router как службы Systemd
- Ресурсы
Постановка задачи
Развернуть в домашней локальной сети WireGuard VPN маршрутизатор для изолированной сети рабочих станций и IoT устройств. Сетевой трафик из изолированной сети маршрутизируется на сетевые узлы, размещенные в облаке, например, на узел сбора данных телеметрии. Передаваемые данные через сеть Интернет должны быть зашифрованы на уровне WireGuard VPN маршрутизатора, т.к. производительность конечных IoT устройств недостаточна для сильного шифрования данных.
- Облачный сервер cloud-server для установки сервера WireGuard должен работать на ОС версии не ниже Ubuntu Server 20.04 LTS;
- Клиент WireGuard устанавливается на виртуальную машину VMWare VM-WireGuard-router с двумя сетевыми интерфейсами, которая выступает в качестве WireGuard VPN маршрутизатора. ВМ (виртуальная машина) работает под ОС Ubuntu 22.04.2 LTS (Jammy Jellyfish);
- Вместо ВМ подойдет любой одноплатный компьютер, с двумя проводными Ethernet интерфейсам, работающий на дистрибутиве основанным на ОС Ubuntu или Debian, например Armbian.
Архитектура
Начальная позиция это уже развернутый облачный сервер cloud-server вместе с Docker. Установку Docker просто и быстро можно выполнить по руководству Простая установка Docker в Armbian/Linux для ARM, данное руководство подойдет и для платформы x86. Все сетевые сервисы на сервере cloud-server размещаются в docker-контейнерах. Данные телеметрии принимает docker-контейнер с Home Assistant, развертывание и настройка которого будет рассмотрена в следующих публикациях.
Способ развертывания:
- Сервер WireGuard на cloud-server: как docker-контейнер;
- Клиент WireGuard на ВМ VM-WireGuard-router (маршрутизатор): нативно, установка из пакетов.
Схема сети с WireGuard VPN маршрутизатором для локальной сети (в формате Visio)
Что такое WireGuard VPN
Wireguard — современный и безопасный VPN-сервер защищающий ваши данные от компрометации. Он создает зашифрованное VPN-соединение между двумя конечными точками, которые могут быть сервером в облаке или другим устройством в той же сети. Его цель — предложить простую и быструю защиту с минимальными затратами ресурсов.
Wireguard устанавливается на операционные системы Linux, macOS, OpenBSD, FreeBSD, Windows 10, поддерживается любой сетевой интерфейс, для которого есть драйверы. По умолчанию WireGuard для передачи зашифрованного трафика использует протокол UDP и открывает порт 51820. Страница загрузки приложения — Installation — WireGuard.
Основное отличие WireGuard от других протоколов VPN, таких как OpenVPN заключается в том, что WireGuard не использует TLS или DTLS для шифрования трафика. Вместо этого он использует Noise Protocol для запутывания метаданных пакетов, включая длину передачи и IP-адреса отправителей и получателей, поэтому ключи для каждого пакета согласуются в частном порядке без участия третьих сторон. Это делает WireGuard намного быстрее, чем большинство других Wireguard VPN протоколов, а также является более безопасным, поскольку нет потенциальных утечек при обмене ключами с центральным сервером. Например, исходный код WireGuard VPN содержит менее 4000 строк кода, в то время как другие протоколы содержат сотни тысяч строк.
Он может использоваться как с пакетами TCP/IP, так и с пакетами UDP/IP, поддерживает переадресацию портов («виртуальные интерфейсы»), аналогичную той, что предоставляется традиционными VPN, но не требует наличия промежуточного маршрутизатора.
Протокол WireGuard отличается от других протоколов VPN своим подходом к безопасности: он не устанавливает конфигурации между клиентом и сервером (как в популярных IKEv2 и IPSec) — в WireGuard они уже предопределены. Поэтому соединение WireGuard является бесконтактным. На практике это означает высокую производительность соединения (повышенная скорость обработки запросов) и лучший пинг — скорость отклика (как быстро сигнал с вашего устройства дойдет до другого компьютера или сервера, а затем вернется к вам).
То есть WireGuard будет быстрее, например, того же OpenVPN. При этом защищенный VPN-туннель и улучшенные криптографические решения позволят сохранять приватность на любых устройствах.
Развертывание сервера WireGuard на cloud-server
Развертывание сервера WireGuard на облачном сервере cloud-server выполним на основе docker-образа linuxserver/wireguard.
Шаг 1 — Создание внутренней сети для docker-контейнеров
До создания docker-контейнера необходимо создать стандартную внутреннюю сеть для docker-контейнеров типа bridge с названием br0. Где диапазон адресов для docker-контейнеров 172.28.1.1 — 172.28.1.126, шлюз 172.28.1.127.
Bridge — это внутренняя сеть Docker, изолированная от сети хоста. У вас может быть доступ из сети Интернет к контейнерам только через те порты, которые открыты при запуске контейнера командой -p . Можно создавать любое количество сетей типа bridge.
Если виртуальная сеть уже создана, то этот шаг можно пропустить. Команда создания сети br0:
$ docker network create \ --driver=bridge \ --subnet=172.28.1.0/24 \ --ip-range=172.28.1.0/25 \ --gateway=172.28.1.127 \ br0
После создания внутренней сети просмотрим список всех сетей docker, командой docker network ls :
Результат выполнения команды:
root@ubuntu:~# docker network ls NETWORK ID NAME DRIVER SCOPE ec4dbac59807 br0 bridge local 7c4f1dc7bc4d bridge bridge local 17e91f541996 host host local 27742e222db0 none null local
Внутренняя сеть br0 успешно создана. Переходим с шагу создания сервера WireGuard.
Шаг 2 — Создание docker-контейнера с сервером WireGuard
Создадим docker-контейнер с сервером WireGuard со следующими параметрами:
- Внешний IP-адрес (адрес сервера в сети Интернет для подключений): 185.240.242.10;
- IP-адрес контейнера во внутренней сети br0: 172.28.1.3;
- Подсеть для VPN клиентов: 192.168.40.0;
- Порт для внешних подключений из сети Интернет (можете назначить любой): 3000;
- Имена пользователей (в название нельзя ставить пробелы и символы «-«, «_»): user1, user2, user3.
Выполним команду создания docker-контейнера:
$ docker run -d \ --name=some-wireguard \ --cap-add=NET_ADMIN \ -e PUID=0 \ -e PGID=0 \ -e TZ=Europe/Moscow \ -e SERVERURL=185.240.242.10 \ -e SERVERPORT=3000 \ -e PEERS=user1,user2,user3 \ -e PEERDNS=1.1.1.1,8.8.8.8 \ -e INTERNAL_SUBNET=192.168.40.0 \ -e ALLOWEDIPS=0.0.0.0/0 \ -p 3000:51820/udp \ -v some-wireguard-config:/config \ --sysctl="net.ipv4.conf.all.src_valid_mark=1" \ --restart=always \ --net br0 \ --ip 172.28.1.3 \ linuxserver/wireguard
То же самое в формате YML для docker-compose.
Шаг 3 — Конфигурация сервера WireGuard
В папке конфигурации docker-контейнера по пути /var/lib/docker/volumes/some-wireguard-config/_data будут расположены папки с названиями peer_user1, peer_user2, peer_user3, содержащие конфигурацию клиентов в том числе и для ВМ VM-WireGuard-router.
Рассмотрим структуру папки peer_user1 :
- peer_user1.conf — конфигурационный файл для клиента WireGuard, в дальнейшем необходимо будет скопировать на ВМ VM-WireGuard-router;
- peer_user1.png — QR-код для быстрого подключения мобильных устройств;
- presharedkey-peer_user1, privatekey-peer_user1, publickey-peer_user1 — ключи для подключения WireGuard клиента, при компрометации ключа privatekey-peer_user1 необходимо сменить все ключи текущего пользователя.
Рассмотрим структуру файла peer_user1.conf:
[Interface] Address = 192.168.40.2 PrivateKey = {KEY} ListenPort = 51820 DNS = 1.1.1.1,8.8.8.8 [Peer] PublicKey = {KEY} PresharedKey = {KEY} Endpoint = 185.240.242.10:3000 AllowedIPs = 0.0.0.0/0
Вместо текста {KEY} будет сгенерирован уникальный ключ вида eCvVMLrQRi3ZxiQMRoUZmrpYpM9XQC1RAbokPWfN40F= .
Конфигурационный файл состоит из двух разделов interface и peers.
Раздел Interface определяет частный сетевой адрес в изолированной сети клиентов WireGuard, рассмотрим следующие параметры:
- Address — IP-адрес клиента;
- ListenPort — для клиента, работающего под OC Windows данный параметр можно удалить т.к. он необходим только для сервера Wireguard;
- DNS — список DNS серверов, можете указать любые свои DNS-сервера.
Раздел Peer определяет точку подключения, в данном случае публичный адрес сервера cloud-server в сети Интернет, рассмотрим следующие параметры:
- Endpoint — публичный IP-адрес (или его доменного имени) сервера, после символа «:» указывается номер порта.
- AllowedIPs — определяет диапазон сетевых адресов, которые будут маршрутизироваться.
Для быстрой проверки работоспособности сервера можно установить клиента для ОС Windows и скопировать файл peer_user1.conf на рабочую станцию для создания профиля туннеля Wireguard. Как настроить клиент Wireguard под Windows и Android в руководстве Настройка VPN-клиента WireGuard. Как настроить WireGuard, ваш собственный VPN нового века. После установления соединения с VPN сервером сменится публичный IP-адрес, для проверки можно зайти на страницу What is my IP address — ifconfig.co.
Настройка сервера закончена, теперь переходим к настройке WireGuard маршрутизатора.
Создание и начальная настройка ВМ VM-WireGuard-router
Шаг 1 — Добавление сетевых адаптеров
Начальная позиция. Исходим из того, что на ВМ VM-WireGuard-router или на устройстве уже установлена ОС Ubuntu и имеется два сетевых адаптера.
Настройки виртуальной машины с двумя сетевыми адаптерами
Первый сетевой адаптер в виртуальный машине должен быть подключен к домашней локальной сети, второй сетевой адаптер VMnet2 предназначен для изолированной виртуальной сети виртуальных машин.
Подключение к сетям сетевых адаптеров виртуальной машины
После запуска ВМ VM-WireGuard-router необходимо выполнить команду ip a для определения наименования сетевых интерфейсов.
Результат выполнения:
root@ubuntuvm:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:c3:58:7d brd ff:ff:ff:ff:ff:ff altname enp2s0 inet 192.168.50.16/24 metric 100 brd 192.168.50.255 scope global dynamic ens32 valid_lft 86325sec preferred_lft 86325sec inet6 fe80::20c:29ff:fec3:587d/64 scope link valid_lft forever preferred_lft forever 3: ens33: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 00:0c:29:c3:58:87 brd ff:ff:ff:ff:ff:ff altname enp2s1
Видим что в системе два сетевых адаптера с именами ens32 и ens33. Адаптер ens32 подключен к домашнему маршрутизатору (подсеть 192.168.50.0), получен IP-адрес 192.168.50.16. Адаптер ens33 подключен к изолированной виртуальной сети VMnet2, IP-адрес отсутствует т.к. не назначен вручную.
Шаг 2 — Настройка сетевых адаптеров
Для настройки сетевых адаптеров необходимо использовать утилиту netplan , в случае отсутствия установить пакет netplan.io . Команда установки пакета:
$ sudo apt-get update $ sudo apt-get -y install netplan.io mc
Где пакет mc необходим для редактирования текстовых файлов, в него входит редактор mcedit .
После установки по пути /etc/netplan должен быть доступен конфигурационный файл 0-installer-config.yaml в формате YAML.
Содержимое файла 00-installer-config.yaml:
# This is the network config written by 'subiquity' network: version: 2 renderer: networkd ethernets: ens32: dhcp4: yes
Необходимо задать другие настройки для сетевого интерфейса ens32 и добавить конфигурацию для ens33.Открывает файл 00-installer-config.yaml в редакторе mcedit командой:
$ sudo mcedit /etc/netplan/0-installer-config.yaml
И заменяем содержимое на следующий итоговый вариант:
# This is the network config written by 'subiquity' network: version: 2 renderer: networkd ethernets: ens32: dhcp4: yes nameservers: addresses: [8.8.8.8, 8.8.4.4] ens33: dhcp4: no addresses: - 192.168.1.1/24
Где 192.168.1.1 — IP-адрес сетевого интерфейса ens33, и он же шлюз для изолированной виртуальной сети VMnet2.
Сохраняем изменения F2 и закрываем редактор F10 .
Для принятия настроек выполняем команду, и подтверждаем новые настройки, нажимаем на ENTER:
$ sudo netplan try
Заново выводим список сетевых интерфейсов для проверки, командой ip a :
Результат выполнения:
root@ubuntuvm:/etc/netplan# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:c3:58:7d brd ff:ff:ff:ff:ff:ff altname enp2s0 inet 192.168.50.16/24 metric 100 brd 192.168.50.255 scope global dynamic ens32 valid_lft 86320sec preferred_lft 86320sec inet6 fe80::20c:29ff:fec3:587d/64 scope link valid_lft forever preferred_lft forever 3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:c3:58:87 brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 192.168.1.1/24 brd 192.168.1.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fec3:5887/64 scope link valid_lft forever preferred_lft forever
Новые настройки приняты, теперь приступаем к установке клиента WireGuard.
Настройка ВМ VM-WireGuard-router как VPN-маршрутизатора
Шаг 1 — Установка клиента WireGuard
Выполним установку необходимых пакетов:
$ sudo apt-get update $ sudo apt-get install -y wireguard iptables resolvconf mc
Где пакет mc необходим для редактирования текстовых файлов, в него входит редактор mcedit , если он не был установлен ранее.
Шаг 2 — Установка базовой конфигурации WireGuard
Создадим конфигурационный файл клиента WireGuard по пути /etc/wireguard/wg0.conf , где wg0 — название виртуального сетевого интерфейса для маршрутизации сетевого трафика. Выполним команду создания файла и откроем его в редакторе:
$ sudo mcedit /etc/wireguard/wg0.conf
Теперь необходимо в открытый файл вставить содержимое файла peer_user1.conf , который был создан ранее на сервере . Итоговое содержание файла wg0.conf будет следующим:
[Interface] Address = 192.168.40.2 PrivateKey = {KEY} DNS = 1.1.1.1,8.8.8.8 [Peer] PublicKey = {KEY} PresharedKey = {KEY} Endpoint = 185.240.242.10:3000 AllowedIPs = 0.0.0.0/0
Вместо текста {KEY} будет сгенерирован уникальный ключ вида eCvVMLrQRi3ZxiQMRoUZmrpYpM9XQC1RAbokPWfN40F= .
Сохраняем изменения F2 и закрываем редактор F10 .
Шаг 3 — Проверка соединения с сервером WireGuard
Теперь необходимо включить VPN туннель командой:
$ sudo wg-quick up wg0
Для проверки соединения выполняем команду:
$ wg show
Результат выполнения:
root@ubuntuvm:~# wg show interface: wg0 public key: private key: (hidden) listening port: 49488 fwmark: 0xca6c peer: preshared key: (hidden) endpoint: 185.240.242.10:3000 allowed ips: 0.0.0.0/0 latest handshake: 49 seconds ago transfer: 124 B received, 308 B sent
Соединение (peer) успешно поднято. Теперь при выполнение команды ip a добавится новый сетевой интерфейс wg0.
wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.168.40.2/32 scope global wg0 valid_lft forever preferred_lft forever
Для проверки публичного IP-адреса выполним команду:
$ curl ifconfig.co
Результат выполнения:
root@ubuntuvm:~# curl ifconfig.co 185.240.242.10
В ответе отобразится публичный IP-адрес 185.240.242.10 сервера cloud-server, значит настройки выполнены правильно. Текущих настроек достаточно для работы ВМ в качестве клиента, но для работы в качестве маршрутизатора необходимо добавить настройки маршрутизации сетевого трафика.
Шаг 4 — Добавление настроек для маршрутизации входящего трафика в VPN туннель WireGuard
Для дальнейшей настройки необходимо отключить VPN туннель командой:
$ sudo wg-quick down wg0
Теперь необходимо снова открыть файл wg0.conf на редактирование и внести него дополнительные настройки. Итоговое содержание файла /etc/wireguard/wg0.conf будет следующим:
[Interface] ## Client ip address ## Address = 192.168.40.2 ## This Desktop/client's private key ## PrivateKey = {KEY} DNS = 1.1.1.1,8.8.8.8 #Add PreUp = sysctl -w net.ipv4.ip_forward=1 PostUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE PostDown = sysctl -w net.ipv4.ip_forward=0 PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE # [Peer] ## Desktop/client VPN public key ## PublicKey = {KEY} PresharedKey = {KEY} ## Your server's public IPv4/IPv6 address and port ## Endpoint = 185.240.242.10:3000 ## client VPN IP address ## AllowedIPs = 0.0.0.0/0 ## Key connection alive ## PersistentKeepalive = 25
Вместо текста {KEY} будет сгенерирован уникальный ключ вида eCvVMLrQRi3ZxiQMRoUZmrpYpM9XQC1RAbokPWfN40F= .
Сохраняем изменения F2 и закрываем редактор F10 .
В случае нахождения пира за NAT (подключен через домашний маршрутизатор) необходимо добавлять опцию PersistentKeepalive для поддержания сетевого соединения каждые 25 секунд.
Разберем добавленные опции, связанные с маршрутизацией сетевого трафика:
PreUp = sysctl -w net.ipv4.ip_forward=1 PostUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE PostDown = sysctl -w net.ipv4.ip_forward=0 PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE
- PreUp — выполняется до поднятие интерфейса wg0.conf;
- PostUp — выполняется после поднятия интерфейса wg0.conf;
- PostDown — выполняется после отключения интерфейса wg0.conf.
Строка sysctl -w net.ipv4.ip_forward со значением 1/0 соответственно включает/выключает обмен между сетевыми интерфейсами. Правило iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE включает NAT-трансляцию и направляет сетевой трафик на интерфейс wg0, т.е. в VPN-туннель.
Подробно про маршрутизацию сетевого трафика, настройку iptables и NAT почитать Основы iptables для начинающих. Часть 3. Таблица nat.
Теперь снова включаем VPN туннель командой wg-quick up wg0 , и проверяем соединение командой wg show . Если туннель заработал, то переходим к следующему шагу настройки DHCP сервера.
Шаг 5 — Установка DHCP сервера
Для работы WireGuard в качестве VPN-маршрутизатора необязательно устанавливать DHCP сервер, но с DHCP сервером клиенты могут получать сетевую конфигурацию автоматически, это гораздо удобнее ручного конфигурирования сетевых настроек для каждого клиента.
Установку и настройку DHCP сервера выполним по руководству A Step-by-Step Guide to Set up a DHCP Server on Ubuntu — LinuxForDevices.
Установим необходимые пакеты:
$ sudo apt-get install -y isc-dhcp-server
Шаг 6 — Настройка DHCP сервера
Откроем на редактирование конфигурационный файл dhcpd.conf по пути /etc/dhcp/dhcpd.conf , командой:
$ sudo mcedit /etc/dhcp/dhcpd.conf
Удалим весь текст и внесем новое содержимое:
# a simple /etc/dhcp/dhcpd.conf default-lease-time 600; max-lease-time 7200; authoritative; . subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.200; option routers 192.168.1.1; option domain-name-servers 1.1.1.1, 8.8.8.8; #option domain-name "mydomain.example"; }
Устройствам в изолированной виртуальной сети VMnet2 будут присваиваться IP-адреса из диапазона 192.168.1.100 — 192.168.1.200.
По умолчанию DHCP сервер работает на всех сетевых интерфейсах, но нам необходимо ограничить его работу только на интерфейсе wg0. Для этого необходимо изменить конфигурационный файл /etc/default/isc-dhcp-server и добавить строки:
INTERFACESv4="ens33" INTERFACESv6="ens33"
Где ens33 — сетевой интерфейс изолированной виртуальной сети VMnet2.
Перезапускаем DHCP-сервер командой:
$ sudo systemctl restart isc-dhcp-server.service
Проверяем статус работы DHCP сервера командой:
$ sudo systemctl status isc-dhcp-server.service
Тестирование VPN-маршрутизатора
Протестирует VPN-маршрутизатор, для этого создадим новую ВМ VM-Client работающую под ОС Windows 7 и подключим сетевой адаптер к изолированной виртуальной сети VMnet2.
Откроем сетевые настройки адаптера.
Настройки сетевого подключения ВМ VM-Client
DHCP сервер успешно выдал сетевые настройки. Теперь проверим маршрутизацию трафика путем построения маршрута до сервера с IP-адресом 1.1.1.1 (DNS сервер от Cloudflare).
Результат выполнения:
C:\Users\user>tracert 1.1.1.1 Трассировка маршрута к one.one.one.one [1.1.1.1] с максимальным числом прыжков 30: 1 1 ms <1 мс <1 мс 192.168.1.1 2 79 ms 80 ms 29 ms 192.168.40.1 3 79 ms 79 ms 81 ms 172.28.1.127 4 89 ms 96 ms 84 ms * 5 74 ms 81 ms * * 6 86 ms 80 ms 79 ms ffm-b11-link.ip.twelve99.net [213.248.85.192] 7 83 ms 94 ms 80 ms cloudflare-ic-328337.ip.twelve99-cust.net [62.115.144.199] 8 93 ms 81 ms 82 ms 172.70.244.3 9 94 ms 81 ms 91 ms one.one.one.one [1.1.1.1] Трассировка завершена.
Сетевой трафик проходит через VPN-маршрутизатор.
Сетевые шлюзы:
- 192.168.1.1 — шлюз изолированной виртуальной сети VMnet2;
- 192.168.40.1 — шлюз виртуальной сети всех клиентов WireGuard;
- 172.28.1.127 — шлюз внутренней сети br0 всех docker контейнеров.
Запустим браузер и откроем адрес ifconfig.co. На странице отобразится наш публичный IP-адрес сервера, т.к. теперь весь сетевой трафик маршрутизируется через сервер cloud-server.
Веб-страница с отображением публичного IP-адреса
Настройка запуска клиента WireGuard на ВМ VM-WireGuard-router как службы Systemd
WireGuard VPN маршрутизатора настроен и готов к работе, но есть одно но. Запускать клиента WireGuard приходится вручную, это означает что после перезагрузки ВМ или одноплатного компьютера, на котором работает VPN маршрутизатор, сетевой трафик не будет передаваться. Для решения этой задачи необходимо зарегистрировать запуск клиента WireGuard как службу Systemd, которая будет запускаться вместе с запуском ОС. Более подробно про службы в Linux можно ознакомиться в руководстве Использование Systemctl для управления службами и блоками Systemd — DigitalOcean.
До регистрации WireGuard как службы необходимо остановить работу WireGuard командой:
$ sudo wg-quick down wg0
Затем выполнить команду регистрации службы:
$ sudo systemctl enable --now wg-quick@wg0
После регистрации клиента WireGuard как службы, туннель автоматически запустится. Следующие команды используются для управления службой:
- systemctl status wg-quick@wg0 — отображает текущее состяние работы службы;
- systemctl stop wg-quick@wg0 — останавливает работу службы;
- systemctl start wg-quick@wg0 — запускает работу службы;
- systemctl disable —now wg-quick@wg0 — отменяет регистрацию запуска клиента WireGuard как службы.
Проверим работу службы wg-quick@wg0:
root@ubuntuvm:~# sudo systemctl status wg-quick@wg0 ● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled) Active: active (exited) since Mon 2023-05-08 19:24:06 UTC; 18s ago Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 Process: 1077 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 1077 (code=exited, status=0/SUCCESS) CPU: 110ms May 08 19:24:06 ubuntuvm wg-quick[1077]: [#] ip link set mtu 1420 up dev wg0 May 08 19:24:06 ubuntuvm wg-quick[1105]: [#] resolvconf -a tun.wg0 -m 0 -x May 08 19:24:06 ubuntuvm wg-quick[1077]: [#] wg set wg0 fwmark 51820 May 08 19:24:06 ubuntuvm wg-quick[1077]: [#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820 May 08 19:24:06 ubuntuvm wg-quick[1077]: [#] ip -4 rule add not fwmark 51820 table 51820 May 08 19:24:06 ubuntuvm wg-quick[1077]: [#] ip -4 rule add table main suppress_prefixlength 0 May 08 19:24:06 ubuntuvm wg-quick[1077]: [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1 May 08 19:24:06 ubuntuvm wg-quick[1077]: [#] nft -f /dev/fd/63 May 08 19:24:06 ubuntuvm wg-quick[1077]: [#] iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE May 08 19:24:06 ubuntuvm systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
Теперь после перезагрузки VPN маршрутизатора, служба WireGuard автоматически запустится.
Ресурсы
- WireGuard fast, modern, secure VPN tunnel — WireGuard
- Installation — WireGuard
- linuxserver/wireguard — Docker Image Docker Hub
- Using the VPN as the default gateway — ubuntu.com
- Как настроить WireGuard, ваш собственный VPN нового века — 3DNews
- Основы iptables для начинающих. Часть 1. Общие вопросы — Записки IT специалиста
- A Step-by-Step Guide to Set up a DHCP Server on Ubuntu — LinuxForDevices
- Использование Systemctl для управления службами и блоками Systemd — DigitalOcean