Свой VPN сервер на Wireguard в Docker для Debian 11

Задача: В облаке провайдера DigitalOcean, на Linux Debian поднять VPN-сервер, который будет работать на основе протокола wireguard. Время на развертывание сервиса не должно превышать 20-ти минут. После настройки сервера сразу сгенерировать 100 конфигов для подключения клиентов.

На момент написания статьи версии:

Linux Debian: 11 (bullseye)
Docker: 20.10.21
Docker-compose: 2.12.2
Wireguard: 1.0.20210914

Кстати, если вы решите завести сервер на DigitalOcean, используйте реферальную ссылку: https://m.do.co/c/6a70cf3a7a23, которая при регистрации даст вам $200 на счет. Это позволит вам пару месяцев пользоваться сервисом абсолютно бесплатно!

Итак начнем. Регистрируемся на digitalocean.com, в профиле добавляем платежную карту. Далее создаем проект и в нем «капельку» (Get started with a Droplet). Выбираем регион, в котором хотите, чтобы у вас был сервер. Я, например, выбрал Франкфурт, так как уже проверенный вариант. В разделе Choose an image выбираем OS — Debian, Version 11 x64. Для нужд VPN сервера нам достаточно самых минимальных ресурсов. Поэтому берем Droplet Type — Basic, тариф с Regular CPU, 512 MB / 1 CPU, 10 GB SSD Disk, 500 GB transfer. Стоимость тарифа на момент написания статьи была $4 в месяц.

Ниже выбираем способ авторизации. По простому — выбираем Password. Нужно будет просто вводить логин и пароль при подключении по SSH. Вводим сложный пароль в текстовое поле и запоминаем его, так как никакого письма на почту с инфой о регистрации не придет.

Еще ниже, в разделе Finalize Details можно отредактировать Hostname. Сделать, например, «wireguard-server».

И жамкаем внизу Create Droplet.

Ждем несколько секунд сборку нашей новенькой виртуалки и вуаля! Все готово для настройки сервера. Погнали?

Подключаемся к серверу по ssh. Логин root, пароль тот, который указали при создании дроплета.

Выполняем:

apt update 
apt upgrade -y

В процессе обновления пакетов установщик спросил по поводу замены конфига для openssh-server. Можно выбрать «keep the local version…».

Устанавливаем Docker Engine, containerd, and Docker Compose:

mkdir -p /etc/apt/keyrings 
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
curl -s https://api.github.com/repos/docker/compose/releases/latest | grep browser_download_url | grep docker-compose-linux-x86_64 | cut -d '"' -f 4 | wget -qi -
chmod +x docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
systemctl enable docker.service
systemctl enable containerd.service

Устанавливаем Wireguard в Docker:

Добавим директорию, в которой будет жить wireguard:

mkdir /opt/wireguard-server

Создаем файл конфигурации для docker-compose:

touch /opt/wireguard-server/docker-compose.yml

Открываем его для редактирования:

nano /opt/wireguard-server/docker-compose.yml

В него вставляем:

version: "2.1"
services:
  wireguard:
    image: linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=0
      - PGID=0
      - TZ=Europe/Berlin
      - SERVERURL=auto #optional
      - SERVERPORT=51820 #optional
      - PEERS=100 #optional
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
    volumes:
      - /opt/wireguard-server/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: always

Сохраняем и выходим из редактора (F2, Y и подтверждаем имя).

Переходим в каталог и запускаем установку:

cd /opt/wireguard-server/
docker-compose up -d

Сервер готов!

Чтобы подключиться к такому VPN-серверу нужно установить на смартфон приложение Wireguard, и открыв его добавить подключение нажатием на синий кружок с плюсиком. В качестве варианта добавления выбрать сканирование QR-кода. Данные коды находятся на сервере в каталогах /opt/wireguard-server/config/peer*, где * — это номер клиента. В каждом таком каталоге есть картинка в формате PNG. Все эти картинки можно скачать с сервера при помощи приложения для Windows — WinSCP. Либо можно QR-код отобразить прям в консоли при помощи утилиты qrencode.

Давайте ее на всякий пожарный тоже установим:

apt install qrencode -y

И теперь если нам, например, нужно сгенерировать в консоли QR-код первого пира, то вводим:

qrencode -t ansiutf8 < /opt/wireguard-server/config/peer1/peer1.conf

Если Wireguard нужен не на смартфоне, а на Windows, то тоже ставим данное приложение с официального сайта, но в качестве конфига для подключения берем уже файлик peer*.conf, который также находится в каталоге /opt/wireguard-server/config/peer*.