Настраиваем собственный 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
# apt install git
# git clone -b v3.0.6 https://github.com/donaldzou/WGDashboard.git wgdashboard
# cd wgdashboard/src
Делаем файл исполняемым и устанавливаем WGDashboard
# chmod u+x wgd.sh # ./wgd.sh install
Даем права для папки с файлами конфигурации WireGuard:
# chmod -R 755 /etc/wireguard
./wgd.sh start
Наша панель слушает порт 10086. Пробуем зайти на нашу веб-панель по адресу http://<ip-сервера>:10086 если все сделано правильно мы должны увидеть окно авторизации:
На странице 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
После этого можно пробовать получить доступ к удаленным сетям через наш туннель.