Создание WireGuard VPN маршрутизатора для домашней локальной сети [обновлено 12.01.2024]

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


Внимание!
Представленная конфигурация VPN-маршрутизатора на базе WireGuard не рекомендуется к применению в связи с фрагментированием TCP-пакетов самим WireGuard. Это приводит к проблемам установления SSL/TLS-рукопожатия (handshake) при работе по протоколу HTTPS. Например, из-за этого не открывается сайт speedtest.net. Взамен рекомендуется использовать связку SoftEther VPN + Shadowsocks прокси, в которой все работает, пост Создание виртуального VPN маршрутизатора c SoftEther VPN и Shadowsocks-туннелированием.

Оглавление

  1. Постановка задачи
  2. Архитектура
  3. Что такое WireGuard VPN
  4. Развертывание сервера WireGuard на cloud-server
  5. Создание и начальная настройка ВМ VM-WireGuard-router
  6. Настройка ВМ VM-WireGuard-router как VPN-маршрутизатора
  7. Тестирование VPN-маршрутизатора
  8. Настройка запуска клиента WireGuard на ВМ VM-WireGuard-router как службы Systemd
  9. Ресурсы

Постановка задачи

Развернуть в домашней локальной сети 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 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.

wireguard.yml
version: '3.5'

services:
#VPN
  some-wireguard:
    image: linuxserver/wireguard
    container_name: some-wireguard
    restart: always
    ports:
      - 3000:51820/udp  
    environment:
      - PUID=0
      - PGID=0
      - TZ=Europe/Moscow
      - SERVERURL=185.240.242.10
      - SERVERPORT=3000
      - PEERS=user1,user2,user3
      - PEERDNS=1.1.1.1,8.8.8.8
      - INTERNAL_SUBNET=192.168.40.0
      - ALLOWEDIPS=0.0.0.0/0
    volumes:
      - some-wireguard-config:/config
      - /lib/modules:/lib/modules  
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    networks:
      br0:
        ipv4_address: 172.28.1.3
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1

volumes:
  some-wireguard-config:
   name: some-wireguard-config  
   
networks:
  br0:    
    external: true

Шаг 3 — Конфигурация сервера WireGuard

В папке конфигурации docker-контейнера по пути  /var/lib/docker/volumes/some-wireguard-config/_data  будут расположены папки с названиями peer_user1, peer_user2, peer_user3, содержащие конфигурацию клиентов в том числе и для ВМ VM-WireGuard-router.

Структура каталогов /var/lib/docker/volumes/some-wireguard-config/_data
root@ubuntu:/var/lib/docker/volumes/some-wireguard-config/_data# tree
.
├── coredns
│   └── Corefile
├── peer_user1
│   ├── peer_user1.conf
│   ├── peer_user1.png
│   ├── presharedkey-peer_user1
│   ├── privatekey-peer_user1
│   └── publickey-peer_user1
├── peer_user2
│   ├── peer_user2.conf
│   ├── peer_user2.png
│   ├── presharedkey-peer_user2
│   ├── privatekey-peer_user2
│   └── publickey-peer_user2
├── peer_user3
│   ├── peer_user3.conf
│   ├── peer_user3.png
│   ├── presharedkey-peer_user3
│   ├── privatekey-peer_user3
│   └── publickey-peer_user3
├── server
│   ├── privatekey-server
│   └── publickey-server
├── templates
│   ├── peer.conf
│   └── server.conf
└── wg0.conf

6 directories, 21 files

Рассмотрим структуру папки  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 и имеется два сетевых адаптера.

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

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

WireGuard Router
Подключение к сетям сетевых адаптеров виртуальной машины

После запуска ВМ 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
Результат выполнения
root@ubuntuvm:/etc/wireguard# sudo systemctl status isc-dhcp-server.service
● isc-dhcp-server.service - ISC DHCP IPv4 server
     Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-05-08 17:01:19 UTC; 54s ago
       Docs: man:dhcpd(8)
   Main PID: 1419 (dhcpd)
      Tasks: 4 (limit: 956)
     Memory: 4.5M
        CPU: 23ms
     CGroup: /system.slice/isc-dhcp-server.service
             └─1419 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dhcpd.conf ens33

May 08 17:01:19 ubuntuvm dhcpd[1419]: PID file: /run/dhcp-server/dhcpd.pid
May 08 17:01:19 ubuntuvm dhcpd[1419]: Wrote 5 leases to leases file.
May 08 17:01:19 ubuntuvm sh[1419]: Wrote 5 leases to leases file.
May 08 17:01:19 ubuntuvm dhcpd[1419]: Listening on LPF/ens33/00:0c:29:c3:58:87/192.168.1.0/24
May 08 17:01:19 ubuntuvm sh[1419]: Listening on LPF/ens33/00:0c:29:c3:58:87/192.168.1.0/24
May 08 17:01:19 ubuntuvm sh[1419]: Sending on   LPF/ens33/00:0c:29:c3:58:87/192.168.1.0/24
May 08 17:01:19 ubuntuvm sh[1419]: Sending on   Socket/fallback/fallback-net
May 08 17:01:19 ubuntuvm dhcpd[1419]: Sending on   LPF/ens33/00:0c:29:c3:58:87/192.168.1.0/24
May 08 17:01:19 ubuntuvm dhcpd[1419]: Sending on   Socket/fallback/fallback-net
May 08 17:01:19 ubuntuvm dhcpd[1419]: Server starting service.

Тестирование VPN-маршрутизатора

Протестирует VPN-маршрутизатор, для этого создадим новую ВМ VM-Client работающую под ОС Windows 7 и подключим сетевой адаптер к изолированной виртуальной сети VMnet2.

WireGuard Router
Настройки ВМ VM-Client

Откроем сетевые настройки адаптера.

WireGuard Router
Настройки сетевого подключения ВМ 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.

WireGuard Router
Веб-страница с отображением публичного 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 автоматически запустится.

Ресурсы

Вам также может понравиться

About the Author: Anton

Programistik