Свой VPN сервер на Wireguard с помощью Docker - igancev blog

Свой VPN сервер на Wireguard с помощью Docker

Логотип wireguard и docker

Установим и настроим Wireguard VPN на собственном vps сервере легко и просто с помощью docker, а также настроим подключение с ПК и смартфона.

Почему Wireguard и Docker

Wireguard современный, кроссплатформенный, безопасный, высокопроизводительный и простой в настройке сетевой туннель, который был принят в основную ветку linux с версии 5.6. На текущий момент это самый быстрый и привлекательный свободный VPN. Раньше я использовал OpenVPN, и в целом нареканий к нему нет. Но он проигрывает в скорости. Может быть он конечно более гибкий и поддерживает больше вариантов шифрования. Оба инструмента хороши, и подходят хорошо под свой пласт задач. В моем случае, для домашнего VPN, скорость соединения является решающим фактором. Приятным бонусом также является моментальная скорость подключения, в отличие от OpenVPN, где подключение обычно занимает как минимум несколько секунд.

Docker конечно же использовать не обязательно. Но в нашем случае это упрощает процесс установки, т.к. мы будем использовать уже готовый образ linuxserver/docker-wireguard, развертывание которого еще проще и быстрее, чем ручная настройка.

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

Если вы не знаете что такое docker, как он работает и почему он не является виртуальной машиной, то советую самостоятельно ознакомиться с темой. Данная статья не освещает базовую теорию docker. Но при пошаговом выполнении инструкций данные знания не потребуются.

Критерии выбора VPS сервера

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

Требования:

  • Размещение за пределами РФ
  • 1 cpu
  • не менее чем 512 Mb RAM
  • ширина канала 100 - 1000 Mbit/sec
  • виртуализация KVM
  • Linux дистрибутив на борту

Я решил, что приобрету себе отдельный сервер только под VPN, чтобы отдельная машина занималась одной задачей, не распыляясь, и делала это хорошо. Поэтому одного ядра и небольшой запас оперативной памяти в 512 Mb будет достаточно. Размещение в Германии мне подходит, т.к. я нахожусь в Европейской части России (чем дальше страна тем больше пинг), а также свободы в интернете там приемлемые. Ширину канала нужно выбирать исходя из скорости, которую предоставляет Ваш интернет провайдер (100/1000 Mbit/sec). Виртуализацию лучше взять KVM, что гарантирует изолированность среды и гарантию ресурсов.

OpenVz не стоит брать еще по той причине, что там используется общее ядро хостовой машины на все инстансы. К тому же ядро зачастую не очень не свежее, из-за чего могут быть проблемы с установкой docker.

Хостинг провайдера удобно выбирать на ресурсах подборщиках VPS, как например poiskvps.ru. Там есть все необходимые фильтры с сортировкой по цене. Очень удобно.

Мой выбор хостинг провайдера пал на RoboVPS, где на момент написания статьи стоимость виртуального сервера 1cpu, 512 Mb RAM, 5 Gb SSD, 100 Mbit/sec составляет скромных 149 ₽/месяц (тариф R7, раздел VPS). Вот реферальная ссылка.

Настройка сервера

Не столь важно какой linux дистрибутив будет установлен на сервере, первично на него нам необходимо установить только Docker. Мой выбор пал на Ubuntu 20.04. Я буду производить все действия из под пользователя root.

Подключение по ssh

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

Если вдруг вы работаете из под операционной системы Windows, то подключиться к серверу Вам может помочь утилита Putty.

ssh root@ip-адрес-сервера

Обновление системы

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

apt update && apt upgrade -y

Установка Docker

После чего установим docker. Можно последовать инструкциям по установке из документации, которые в случае с ubuntu говорят установить в систему репозиторий докера. Но в стандартных репозиториях ubuntu также можно найти не самую свежую, но подходящую версию. Ее и установим

apt install docker.io

и docker-compose

apt install docker-compose

Подготовка конфигов

Создадим, например в домашнем каталоге, директорию ~/wireguard, где будем хранить конфигурационные файлы, и сразу внутри нее директорию ~/wireguard/config, которую будем монтировать внутрь контейнера

mkdir -p ~/wireguard/config

Далее создадим файл ~/wireguard/docker-compose.yml, в который скопируем содержимое из документации используемого docker образа

vim ~/wireguard/docker-compose.yml
version: "2.1"
services:
  wireguard:
    image: ghcr.io/linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
      - SERVERURL=wireguard.domain.com #optional
      - SERVERPORT=51820 #optional
      - PEERS=1 #optional
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
    volumes:
      - /path/to/appdata/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

Внесем в него некоторые изменения:

  • Переменной окружения SERVERURL вместо текущего wireguard.domain.com нужно присвоить значение ip адреса вашего виртуального сервера

  • Переменной окружения PEERS нужно присвоить достаточное количество клиентов, которыми вы планируете пользоваться VPN. К примеру, если мы планируем подключаться с ноутбука, 2-х смартфонов и роутера (4 устройства), то установим PEERS=4

  • Монтируемый каталог /path/to/appdata/config из секции volume необходимо заменить на ранее созданную директорию ~/wireguard/config

После чего наша конфигурация готова. Создадим и запустим контейнер

cd ~/wireguard
docker-compose up -d

Дождемся пока скачается образ и запустится контейнер, после проверим, что он запущен командой docker ps. При успехе должны увидеть в выводе что - то вроде

CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                      NAMES
97d91a1ffa87        linuxserver/wireguard   "/init"             5 minutes ago       Up 2 minutes        0.0.0.0:51820->51820/udp   wireguard

Если все так, то на этом настройка сервера закончена, и можно уже начать настройку клиентов.

Настройка смартфонов

Проще всего наверное проверить подключение со смартфона. Ведь для этого понадобится лишь поставить клиент в один клик из магазина приложений

и отсканировать qr код.

Чтобы вывести на экран qr код добавления туннеля, на сервере исполняем команду:

docker exec -it wireguard /app/show-peer 1

Где 1 - порядковый номер PEERS, количество которых мы ранее задали в docker-compose.yml.

qr код для подключения wireguard

Рекомендуется каждый клиент подключать под отдельным peer.

Далее в мобильном приложении необходимо:

  • нажать кнопку добавления нового туннеля
  • выбрать пункт “сканировать qr код
  • навести на заранее выведенный на экран qr код
  • придумать произвольное имя для подключения (например peer2)

На этом настройка закончена. Подключение с введенным именем появится в списке. Начать пользоваться можно переключив переключатель в активное положение.

Настроенное подключение в мобильном приложении wireguard

Убедиться, что все действительно работает, можно посетив сайт 2ip.ru, который любезно покажет нам ip адрес нашего сервера в той стране, где вы приобрели виртуальный сервер, вместо нашего настоящего ip адреса, выдаваемого интернет провайдером.

Скриншот с сайта 2ip.ru

Десктоп

Конфиги подключения

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

На сервере выведем содержимое монтируемой внутрь docker контейнера директории ~/wireguard/config

ls -la ~/wireguard/config

Скриншот вывода консоли, команда ls -la ~/wireguard/config

В этой директории наблюдаем файлы и директории жизнедеятельности контейнера. Нас интересуют директории peer1, peer2, peerN, где N - номер пира, как вы уже поняли.

Внутри каждой директории под каждого пира лежат заранее сгенерированные при старте контейнера файлы, а именно:

  • приватный и публичный ключ (privatekey-peer1, publickey-peer1)
  • peer1.png - изображение с qr кодом подключения
  • peer1.conf - целевой конфигурационный файл, который требуется на клиенте
ls -la ~/wireguard/config/peer1

Скриншот вывода консоли, команда ls -la ~/wireguard/config/peer1

GNU/Linux

Чтобы установить wireguard клиент в свой linux дистрибутив, необходимо установить пакет wireguard-tools из репозиториев:

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

Arch linux
sudo pacman -S wireguard-tools
Debian/Ubuntu
sudo apt install wireguard
Fedora
sudo dnf install wireguard-tools

Инструкции по другим дистрибутивам можно найти на странице установки на официальном сайте.

Конфиг

После установки нам необходимо на клиентской машине создать конфигурационный файл подключения /etc/wireguard/wg0.conf с содержимым файла ~/wireguard/config/peer1/peer1.conf с сервера.

Для этого можно например вывести содержимое файла peer1.conf в консоль командой cat ~/wireguard/config/peer1/peer1.conf, и скопипастить содержимое в целевой файл на клиенте.

Но вместо этого можно скачать файл при помощи утилиты scp с сервера прямо в целевой файл следующей единственной командой:

sudo scp root@ip-адрес-сервера:~/wireguard/config/peer1/peer1.conf /etc/wireguard/wg0.conf
  • sudo при запуске потребуется для того, чтобы записать содержимое в файл, находящийся вне домашней директории вашего пользователя ОС (/etc).

  • первым параметром после указания имени утилиты scp указывается строка подключения к серверу ssh. Затем двоеточие, после которого путь к скачиваемому файлу на сервере.

  • Вторым параметром указывается путь к файлу, который будет создан на локальной машине.

Запуск

Все готово, осталось лишь запустить клиент следующей командой:

wg-quick up wg0

Проверим, что все работает:

curl ifconfig.me
195.255.255.255

Если в выводе ip адрес вашего сервера, то все получилось!

Остановка клиента

wg-quick down wg0

Windows, macOS

Под данные системы с официального сайта скачивается классический инсталляционный пакет, установка которого ничем не отличается от несложной установки любой программы (прожать кнопку далее несколько раз).

Добавление туннеля производится путем импортирования файла конфига туннеля через пользовательский интерфейс программы.

Скриншот UI wireguard из операционной системы Windows

Удаление wireguard с сервера

Удаление с сервера настроенного решения можно произвести в несколько шагов:

Остановка контейнера

docker stop wireguard

Удаление контейнера

docker rm wireguard

Удаление образа

docker rmi linuxserver/wireguard

Удаление директории с конфигами

Удалим директорию ~/wireguard с файлом docker-compose.yml и монтируемой директорией ~/wireguard/config, в которой локализованы все файлы жизнедеятельности контейнера

rm -rf ~/wireguard

Заключение

Мы рассмотрели один из простых и быстрых способов поднять свой собственный VPN сервер на основе замечательной технологии wireguard, с помощью docker. Безусловно, одну и ту же задачу в linux можно решить множеством способов. Изучайте linux, его экосистему. Его возможности безграничны.