no-style

Wireguard VPN в Docker контейнере

docker-compose + linuxserver + wireguard
Привет. Сегодня будем поднимать WireGuard VPN внутри докер контейнера. Использовать при этом будем Docker-Compose фаил от LinuxServer. Так же мы рассмотрим варианты подключения клиентов к получившемуся VPN туннелю.


Зачем/для чего нужен WireGuard

Ситуаций когда может пригодится свой VPN на самом деле вагон и маленькая тележка. Вот некоторые из них:

  • Мы подключились со смартфона к публичной/открытой wifi сети и не хотим стать жертвой MITM атаки
  • Для организации виртуальной локальной сети между клиентами подключенными к VPN
  • Контент который мы хотим посмотреть недоступен для нашего региона
  • Контент который мы хотим посмотреть заблокирован в стране в которой мы находимся
  • Какие то специальные акции и предложения для определённой страны/города/региона
  • Просто хотим скрыть свой настоящий ip адрес или местонахождение
  • В некоторых случаях помогает улучшить Ping и Delay в играх
  • Другое...

Обладая большим количеством разных серверов, есть соблазн поставить такой VPN на каждый из них. Тем более что это очень просто и быстро. К тому же клиенты под Wireguard есть на Windows / Linux / Mac / Android / ios







Необходимые требования

Чтобы всё получилось нам понадобится:

  • Сервер с Root доступом. Рекомендую вот этот
  • Установленный Docker + Docker-Compose
  • Фаил Docker-Compose от linuxserver любо из моего репозитория на гитхабе (см ниже)
  • 10 - 15 минут времени






Подготовка

Я привык хранить докер контейнеры со всей нужной для их работы информацией в отдельных директориях, а не где то там в var. Создадим специальную папку для wireguard, а так же юзера с нужным id'шником. И дадим этому юзеру права на только что созданную папку

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

Добавим пользователя [необязательный шаг]

sudo useradd -s /bin/bash -u 1337 -G sudo -m username

Установим ему пароль [необязательный шаг]

passwd username

Создадим директории

sudo mkdir -p /app/vpn/wireguard

Назначим пользователя владельцем этой директорий

sudo chown -R $USER:$USER /app/vpn/wireguard






Установка

Я долго думал как лучше предоставить фаил docker-compose. Пришёл к выводу - что лучше оставлю сразу 2 ссылки. Дело в том что прогресс не стоит на месте и может случиться так, что фаил который я предоставлю устареет через какое то время. Для такого случая я оставлю ссылку на официальный докер хаб где всегда можно найти актуальный docker-compose фаил

Переходим в директорию /app/vpn/wireguard

cd /app/vpn/wireguard

Создаём фаил docker-compose.yaml

nano docker-compose.yml

И наполняем его содержимым из выбранного вами варианта.

1) Мой Docker-Compose фаил на github

2) Официальный докер хаб LinuxServer/Wireguard где всегда можно найти актуальную версию docker-compose фаила


Рассмотрим основные параметры:

  • PUID=1000 - ID пользователя от которого запускаем контейнер. Если вы создавали пользователя с айдишником 1337 то вписываем сюда 1337.

  • PGID=1000 - ID группы от которой запускаем контейнер. Если вы создавали пользователя с айдишником 1337 то вписываем сюда 1337.

    Если у Вас уже есть пользователь, его UID и GID можно узнать введя в терминале команду id будучи залогиненным за этого пользователя.

  • TZ=Europe/London - Таймзона например Europe/Netherlands

  • SERVERURL=auto - Если у нас есть домен можем вписать его сюда для удобства либо оставляем значение по умолчанию

  • SERVERPORT=51820 - Порт на котором будет висеть wireguard. Не забываем разрешить в фаерволле

  • PEERS=1 - Количество создаваемых конфигов. Хорошая практика 1 конфиг = 1 клиент, а не сажать 10 клиентов на 1 конфиг. При подключении каждый клиент будет иметь уникальный ip в виртуальной подсети

  • PEERDNS=auto - Можно вписать кастомные днс или например 1.1.1.1 или оставить значение auto

  • INTERNAL_SUBNET=10.13.13.0 - Внутренняя виртуальная сеть

  • ALLOWEDIPS=0.0.0.0/0 - Диапазоны ip к которым пиры могут обращаться через VPN тунель. По стандарту все ip.

    Если вы хотите только создавать тунель и при этом не хотите менять свой ip адрес на ip адрес сервера VPN, то тогда тут необходимо вписать маску сети, например 10.0.0.0/8 или 10.13.13.0/24

  • /app/vpn/wireguard/config:/config - Место для хранения данных докер контейнера

  • PERSISTENTKEEPALIVE_PEERS=all - Для каких пиров устанавливать постоянное рукопожатие через каждые 25 секунд. Я обычно ставлю all, либо можно поставить вот так 1,4,laptop и т.д.

  • LOG_CONFS=false - Отображать или нет сгенерированные QR-коды в логе docker.

С настройками разобрались. Стартуем контейнер:

sudo docker-compose up -d

При запуске будут созданы конфиги в папке /app/vpn/wireguard/config

Именно эти конфиги мы используем в клиенте wireguard







Параметр PersistentKeepalive

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

Когда опция PersistentKeepalive включена и установлена определенная частота, WireGuard автоматически отправляет пакеты "keepalive" между узлами для поддержания активного состояния соединения. Это позволяет избежать закрытия соединения между узлами, даже если они не обмениваются актуальными данными.

Частота PersistentKeepalive определяется в секундах и указывается в конфигурационном файле для каждого узла. Например, PersistentKeepalive = 25 означает, что WireGuard будет отправлять пакеты "keepalive" каждые 25 секунд.

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

Однако следует учитывать, что использование PersistentKeepalive может потреблять небольшой объем дополнительного трафика, поскольку пакеты "keepalive" отправляются регулярно даже при отсутствии актуальных данных для передачи. Поэтому рекомендуется выбирать разумную частоту, чтобы избежать излишней нагрузки на сеть.

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

PersistentKeepalive = 25

в секцию [Peer] вашего желаемого конфига(пира). Теперь связь будет ещё более стабильна.







Статистика

Мы можем посмотреть статистику в которой можно увидеть кто сейчас подключен к туннелю и какой ему присвоен ip. Там же можно увидеть статистику по трафику. Чтобы посмотреть статистику - выполняем:

sudo docker exec -it wireguard wg

wireguard statistic

Чтобы каждый раз не вводить команду и смотреть статистику в реальном времени, обновляемую каждую секунду, воспользуйтесь данной командой

watch -n 1 -c sudo docker exec -it wireguard wg






Управление конфигами

Бывают ситуации, когда нужно изменить количество конфигов - например добавить. Для этого необходимо сначала изменить параметр PEERS= в docker-compose.yaml а затем выполнить:

sudo docker-compose up -d --force-recreate

Имейте в виду что будут перегенерированы все конфиги включая старые. Это одновременно является минусом - все старые конфиги перестанут работать и придётся на каждом клиенте опять закачивать конфиг. И плюсом - если по какой то причине наши конфиги попали туда куда не планировалось, то там они тоже перестанут работать







QR код для мобильного приложения

Если мы планируем использовать VPN на смартфоне, то есть отличная функция которая упростит жизнь. С её помощью мы можем получить все настройки для клиента wireguard при помощи QR кода. Выполняем:

sudo docker exec -it wireguard /app/show-peer НОМЕР-ПИРА

QR код будет выведен на экран прямо в терминале - гораздо удобнее чем заливать вручную конфиг на телефон.







Подключение

Официально wireguard имеет клиенты почти под все OS. То есть на Windows / Linux / Mac / BSD / Android / iOS и другие. Я буду рассматривать подключение с помощью клиента под windows

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

wireguard winndows client

Наслаждаемся полученным результатом. Как я и говорил очень быстро и просто.


wireguard vpn result





Как установить свой порт

Некоторые пользователи предпочитают поднимать vpn wireguard на нестандартном порту. Для того чтобы это сделать понадобится изменить 1 параметр в docker-compose.yml

Переходим в папку с wireguard

cd /app/vpn/wireguard

Редактируем фаил docker-compose.yml

nano docker-compose.yml

Теперь меняем порт для хоста(выделен цветом) на любой другой.

ports:
   - 51820:51820/udp

После чего обязательно перезагружаем контейнер wireguard

sudo docker-compose up -d --force-recreate

Для примера я поменял стандартный порт на 5182. Теперь необходимо сменить этот порт в самом подключении. Покажу на примере мобильного приложения. Обратите внимание что порт надо поменять в двух местах!

wireguard change port

После внесения этих изменений у вас всё заработает.

wireguard change port 2

Mission completed!

7 Комментарии

  1. Почему-то не создает директорию с пирами. При попытке вывести сообщение PEER 1 is not active

    ОтветитьУдалить
    Ответы
    1. Проверил, там всё ок - что то не так делаете. Будьте внимательнее!

      Удалить
  2. Приветствую! Спасибо за инструкцию, все работает отлично. Но подскажи такой момент, пожалуйста, если я например хочу изменить один peer, чтобы он перестал работать на устройстве, где был подключен и сформировать новый QR - это возможно?

    ОтветитьУдалить
    Ответы
    1. Привет, не знаю у меня не было такой необходимости, поэтому только все сразу перегенерировать
      sudo docker-compose up -d --force-recreate

      Удалить
    2. если задать папку для хранения конфигов wireguard и использовать в PEERS список пиров, то при удалении/добавлении пиров из docker-compose.yml и пересоздании контейнера, старые конфиги будут работать дальше.

      Удалить
  3. спасибо за статью. подскажите пожалуйста как перенаправить правильно трафик этого контейнера через другой контейнер? использовал network_mode: "service:мойВпнКонтейнер", удалил из конфига wireguard секцию с портами и прописал их в "мойВпнКонтейнер" в виде ports: - 51820:51820/udp. по qr коду подключаюсь нормально, рукопожатия идут, но к интернету доступа нет

    ОтветитьУдалить

Отправить комментарий