Linux
July 1, 2020

Настраиваем собственный WireGuard VPN сервер c веб-интерфейсом на Debian 11

WireGuard — бесплатное программное приложение с открытым исходным кодом, протокол виртуальной частной сети (VPN) для передачи данных в зашифрованном виде и создания безопасных соединений точка-точка. Кодовая база проекта написана с нуля и отличается компактностью исполнения. WireGuard отлично работает на подавляющем большинстве платформ: Windows, MacOS, Linux, IOS, Android и др.

WireGuard создан для роуминга. Если ваше устройство меняет сети, например, с Wi-Fi на мобильный интернет, то соединение будет сохраняться, потому что, пока клиент отправляет правильно аутентифицированные данные на ваш VPN-сервер WireGuard, сервер поддерживает соединение в работе. Это выгодно отличает WireGuard от большинства других решений, которые теряют соединение при смене сети.

Установка WireGuard будет проводиться на виртуальный выделенный сервер с операционной системой Debian 11. Для реализации подойдет минимальная конфигурация сервера c 512 МБ ОЗУ и 5 ГБ HDD. Вы можете развернуть сервер самостоятельно или арендовать за небольшую плату у хостинг-провайдера, например здесь (минимальный тариф в Швеции стоит 109 руб.). Сам я много лет пользуюсь этим провайдером, на мой взгляд лучшее соотношение цена/качество. Все действия производятся от имени пользователя root.

Обновляем систему

На первом этапе необходимо обновить нашу систему до актуального состояния следующими командами:

# apt update
# apt upgrade
# apt dist-upgrade

После обновления перезагружаем систему:

# reboot

Установка WireGuard и Iptables

В данном руководстве мы будем использовать iptables для настройки межсетевого экрана. Поэтому устанавливаем пакеты wireguard и iptables:

# apt install wireguard iptables

Создаем конфигурационные файлы для клиентов и сервера

Для этого воспользуемся замечательным сервисом https://www.wireguardconfig.com/

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

  • Listen Port - порт, который будет "слушать" наш сервер, по умолчанию WireGuard использует порт 51820, но, при желании, мы можем задать какой-нибудь нестандартный.
  • Number of Clients - количество клиентов, в зависимости от указанного здесь числа, будет сгенерировано необходимое количество клиентских конфигурационных файлов.
  • CIDR - подсеть для клиентов, из нее будут выдаваться адреса нашим клиентам. Можно оставить по-умолчанию.
  • Client Allowed IPs - Адреса подсетей назначения, трафик для которых мы будем направлять в туннель, если мы хотим направлять в туннель весь трафик, то оставляем по умолчанию.
  • Endpoint (Optional) - IP-адрес/DNS-имя:порт нашего сервера, IP-адрес можно посмотреть командой ip a, порт должен совпадать с полем Listen Port.
  • DNS - можно указать любой из публичных (8.8.8.8, 1.1.1.1 и тд.)
  • Post-Up rule, Post-Down rule - Команды выполняемые при старте/остановке сервиса. Обычно сюда записываются команды добавления/удаления правил межсетевого экрана, но мы настроим межсетевой экран вручную.

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

Создаем файл конфигурации сервера в папке WireGuard

# nano /etc/wireguard/server.conf

Копируем в него содержимое файла server.conf полученного с wireguardconfig.com

Ниже строки PrivateKey добавляем параметр:

SaveConfig = true

Должно получиться что-то вроде этого:

Сохраняем файл нажав ctrl+o и закрываем редактор ctrl+x.

Добавляем WireGuard в автозагрузку и запускаем его

# systemctl enable wg-quick@server
# systemctl start wg-quick@server

Просмотр текущих подключений

# wg show

Настраиваем веб-интерфейс управления сервером

В качестве веб-панели будем использовать WGDashboard https://github.com/donaldzou/WGDashboard панель написана на Python и не требует дополнительных компонентов в виде веб-сервера, СУБД и тд. Панель позволяет осуществлять управление и мониторинг пользователей и требует наличия Python 3.7+ и Pip3. Python в Debian уже установлен по умолчанию, установим Pip3 командой:

# apt install python3-pip

Также установим git командой:

# apt install git

Скачиваем WGDashboard:

# git clone -b v3.0.6 https://github.com/donaldzou/WGDashboard.git wgdashboard

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

# cd wgdashboard/src

Делаем файл исполняемым и устанавливаем WGDashboard

# chmod u+x wgd.sh
# ./wgd.sh install

Даем права для папки с файлами конфигурации WireGuard:

# chmod -R 755 /etc/wireguard

Стартуем WGDashboard

./wgd.sh start

Наша панель слушает порт 10086. Пробуем зайти на нашу веб-панель по адресу http://<ip-сервера>:10086 если все сделано правильно мы должны увидеть окно авторизации:

Учетные данные по-умолчанию:

username: admin

password: admin

На странице Settings можно изменить общие настройки нашего VPN сервера, а также веб-панели, на первом этапе рекомендуется сменить пароль администратора на более сложный.

На странице CONFIGURATIONS => server можно осуществлять управление и мониторинг клиентов. Удалим нашего единственного клиента, нажав красный крестик и тут же создадим нового, это позволит нам скачать файл конфигурации клиента, а также открыть QR-код для подключения прям из веб-интерфейса. Для этого нажимаем плюсик в правом нижнем углу, в минимальной конфигурации нам достаточно дать имя нашему клиенту, остальное можно оставить по умолчанию, по завершению нажимаем кнопку Add

Клиентов можно подключать скачав файл конфигурации или открыв QR-код

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

# nano wg-dashboard.service

Со следующим содержимым (если вы не меняли расположение скачанных файлов):

[Unit]
After=network.service

[Service]
WorkingDirectory=/root/wgdashboard/src
ExecStart=/usr/bin/python3 /root/wgdashboard/src/dashboard.py
Restart=always


[Install]
WantedBy=default.target

Сохраняем скрипт.

Копируем скрипт в папку systemd:

# cp wg-dashboard.service /etc/systemd/system/wg-dashboard.service

Включаем сервис:

# chmod 664 /etc/systemd/system/wg-dashboard.service
# systemctl daemon-reload
# systemctl enable wg-dashboard.service
# systemctl start wg-dashboard.service 

Настройка клиентов

Скачиваем и устанавливаем клиент WireGuard под необходимую платформу https://www.wireguard.com/install/ Настраиваем клиент, используя файл конфигурации клиента или QR-код.

Поскольку мы не выполнили настройку сервера полностью, при подключении к нашему VPN-серверу мы не получим доступа к удаленным сетям, но мы должны получить доступ к нашей веб панели из внутренней сети по адресу http://10.0.0.1:80086 Если мы видим станицу авторизации веб-панели, значит связь между сервером и клиентом есть, в дальнейшем мы закроем доступ к веб-панели извне в целях безопасности.

Настройка межсетевого экрана

Разрешаем маршрутизацию трафика между интерфейсами. Для этого открываем файл /etc/sysctl.conf в текстовом редакторе:

# nano /etc/sysctl.conf

Находим строку #net.ipv4.ip_forward=1 убираем знак # в начале строки, сохраняем файл и применяем внесенные изменения:

# sysctl -p

Включаем маскарадинг (NAT) на внешнем интерфейсе, название внешнего интерфейса можно посмотреть командой ip a, в нашем примере это enp0s3:

#  iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

Разрешаем входящие соединения, если они являются ответом на исходящие:

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Разрешаем доступ к серверу по SSH и VPN

 # iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 # iptables -A INPUT -p udp --dport 51820 -j ACCEPT

Разрешаем доступ с loopback и VPN интерфейсов

# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -i server -j ACCEPT

Разрешаем маршрутизацию трафика между VPN и внешней сетью:

# iptables -A FORWARD -i server -j ACCEPT

На последнем этапе добавляем правила по умолчанию:

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT

Сохраняем созданные правила в файл:

# iptables-save > /etc/iptables.rules

Чтобы правила применялись при загрузке системы открываем файл /etc/network/interfaces и добавляем в конец файла строку:

pre-up iptables-restore < /etc/iptables.rules

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

На этом настройку можно считать оконченной.