Настройка WireGuard VPN

Для многих обычных пользователей слово VPN сразу ассоциируется со средством доступа в сеть интернет. Действительно, это один из самых популярных сценариев использования данной технологии. Но если для большинства это всего лишь способ обхода ограничений, то специалисты чаще рассматривают VPN как защищенный канал в сетях с низким уровнем доверия: публичный Wi-Fi, сети баров, гостиниц, аэропортов. А если вы работаете с чувствительной информацией, то для таких целей лучше использовать собственный сервер, например, создав его на базе WireGuard.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

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

Напомним, WireGuard - это туннель без сохранения состояния, а следовательно применять к нему термины "клиент" и "сервер" некорректно, каждый узел WireGuard может как подключаться к другим узлам, так и принимать соединения. Но если мы говорим об организации выхода в интернет посредством VPN, то здесь данные термины уместны. В данном случае VPN-сервер - это узел предоставляющий возможность выхода в интернет, а VPN-клиенты - узлы, которые данную возможность используют, при этом технология реализации самого VPN-канала роли не играет.

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

Для обеспечения доступа в интернет VPN-сервер должен находиться на узле, обладающем достаточной пропускной способностью и точкой выхода в определенном географическом положении, которое зависит от того, к каким именно ресурсам вам нужно получать доступ. В большинстве случаев отлично подойдет VPS (виртуальный выделенный сервер) с минимальным тарифом в нужном расположении и ОС семейства Linux. Если говорить о семействе Debian / Ubuntu, то WireGuard поддерживается начиная с Debian 10 и Ubuntu 18.04 LTS. Все описанные ниже действия следует выполнять с правами суперпользователя root или через sudo.

Если вы используете Debian 10, то вам потребуется подключить backports-репозиторий:

1echo deb http://deb.debian.org/debian buster-backports main > /etc/apt/sources.list.d/buster-backports.list

Обновим источники пакетов и установим WireGuard:

1apt update
2apt install wireguard

Следующим шагом выполним генерацию ключей, для этого перейдем в директорию /etc/wireguard:

1cd /etc/wireguard

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

1umask 077

Выполним генерацию ключевой пары:

1wg genkey > privatekey
2wg pubkey < privatekey > publickey

И вернем маску к стандартным значениям:

1umask 022

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

1cat /etc/wireguard/privatekey

Скопируем его содержимое, оно понадобится нам на следующем шаге, помним, что приватный ключ является секретным!

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

1nano /etc/wireguard/wg0.conf

В данном случае мы используем nano, если вам больше по душе редактор mс, то просто замените nanо на mcedit.

Прежде всего настроим сетевой интерфейс WireGuard, для этого добавим в файл следующую секцию:

1[Interface]
2Address = 10.20.0.1/24
3ListenPort = 34567
4Privatekey = kNYGiCR3/ikepyURjFnEu5ueoCBsP2pjvGdcj2pggG8=

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

Сохраним конфигурацию и добавим службу в автозагрузку, одновременно запустив ее:

1systemctl enable --now wg-quick@wg0

В качестве имени службы используется wg-quick@<имя_конфигурационного_файла>.

Посмотреть статус WireGuard можно командой:

1wg

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

Настройка NAT и брандмауэра

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

Прежде всего включим маршрутизацию, чтобы иметь возможность пересылать пакеты между интерфейсами, для этого откроем файл /etc/sysctl.conf, найдем и раскомментируем в нем следующую опцию:

1net.ipv4.ip_forward = 1

Затем перечитаем настройки:

1sysctl -p

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

Информация

Более подробно о всех этих способах вы можете прочитать в нашей статье: Основы iptables для начинающих. Как сохранить правила и восстановить их при загрузке

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

Создадим файл скрипта и разместим его в /etc:

1nano /etc/nat-rules

И добавим в него следующее содержимое:

 1#!/bin/sh
 2
 3# Сбрасываем настройки брандмауэра
 4iptables -F
 5iptables -X
 6iptables -t nat -F
 7iptables -t nat -X
 8
 9# Разрешаем уже установленные соединения. Первое правило в цепочке!!!
10iptables -A INPUT -i ens33 -m state --state ESTABLISHED,RELATED -j ACCEPT
11# Разрешаем подключения по SSH
12iptables -A INPUT -i ens33 -p tcp --dport 22 -j ACCEPT
13# Разрешаем подключения к WireGuard
14iptables -A INPUT -i ens33 -p udp --dport 34567 -j ACCEPT
15#Запрещаем входящие извне. Последнее правило в цепочке!!!
16iptables -A INPUT -i ens33 -j DROP
17
18# Разрешаем уже установленные транзитные соединения
19iptables -A FORWARD -i ens33 -o wg0 -m state --state ESTABLISHED,RELATED -j ACCEPT
20# Запрещаем транзитный трафик извне
21iptables -A FORWARD -i ens33 -o wg0 -j DROP
22
23# Включаем маскарадинг для WireGuard клиентов
24iptables -t nat -A POSTROUTING -o ens33 -s 10.20.0.0/24 -j MASQUERADE

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

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

1chmod + x /etc/nat-rules

Для его запуска можно добавить в секцию [Interface] конфигурационного файла WireGuard опцию:

1PostUp = /etc/nat-rules

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

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

1/etc/nat-rules

Посмотреть состояние брандмауэра можно командой:

1iptables -L -vn

Если все работает нормально, то установим утилиту iptables-persistent:

1apt install iptables-persistent

Во время установки вам будет предложено сохранить текущие правила, с чем следует согласиться. После чего ваши правила будут автоматически сохранены в /etc/iptables/rules.v4, откуда будут восстанавливаться при загрузке. Скрипт нам больше не нужен, можем его убрать.

Можно ли обойтись без скрипта? Можно. Но не все обладают достаточными навыками работы с iptables, поэтому предложенный нами способ, хоть и является более длинным и избыточным, позволяет выполнить настройку брандмауэра наиболее просто для начинающих.

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

Скачайте и установите WireGuard для Windows c официального сайта. В приложении выберите Добавить туннель - Добавить пустой туннель.

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

1Address = 10.20.0.101/24

Ниже добавим секцию [Peer] для подключения к серверу:

1[Peer]
2PublicKey = kKxQ4wF+kUrpsTGwjMvlSwX45WV4nixG76/+sKlzEQA=
3AllowedIPs = 10.20.0.0/24, 0.0.0.0/0
4Endpoint = 203.0.113.2:34567
5PersistentKeepalive = 25

Которая содержит публичный ключ сервера, его адрес и порт, разрешенные сети. Так как нам требуется обеспечить выход в интернет через WireGuard подключение, то в список сетей мы добавили 0.0.0.0/0, что обеспечит направление в туннель всего исходящего трафика. Опция PersistentKeepalive предполагает обмен служебным трафиком с указанным пиром раз в 25 секунд, что требуется для поддержания нормальной работы клиента в том случае, если он находится за NAT.

После сохранения настроек туннельный интерфейс будет поднят и статус соединения будет Подключен, хотя мы еще не делали никаких настроек для данного клиента со стороны сервера. Кого-то может удивить или ввести в заблуждение такое положение дел и именно поэтому мы каждый раз акцентируем тот факт, что WireGuard - это туннель без сохранения состояния. Он ничего не знает о реальном состоянии канала и пира, к которому производится подключение, единственный способ это выяснить - послать пакет на другую сторону туннеля.

1[Peer]
2PublicKey =i p9UjCFHiLnhQTcVgS/Y7j0s8caNj9hhn5RS2UqMXRo=
3AllowedIPs = 10.20.0.101/32

Где мы укажем публичный ключ клиента и его внутренний IP-адрес, с которого следует принимать пакеты.

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

1systemctl restart wg-quick@wg0

Теперь можем проверить связь, для начала пропингуем внутренний адрес сервера 10.20.0.1 - если он отвечает, то туннель работает нормально.

Как мы уже говорили, при тех настройках, которые мы указали в туннель будет заворачиваться весь исходящий трафик клиента, в т.ч. и DNS-запросы. Поэтому если у вас в системе указаны локальные адреса DNS, скажем 192.168.1.1 роутера или адреса провайдера, недоступные из внешнего интернета, то разрешение имен работать не будет. Внешне это будет проявляться в том, что интернет работать не будет с указанием на ошибку DNS.

WireGuard прост, и обратная сторона этой простоты заключается в том, что мы не можем передавать нужные опции с сервера на клиента, как в OpenVPN, поэтому спасение утопающих - дело рук самих утопающих. К счастью, WireGuard позволяет задать опции для конфигурирования локального сетевого интерфейса, поэтому откройте приложение Wireguard, найдите свой туннель и выберите Редактировать, в открывшемся окне в секцию [Interface] добавьте опцию:

1DNS = 8.8.8.8, 1.1.1.1

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

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

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

С правами root или через sudo выполним установку и генерацию ключей точно также, как мы это делали на сервере, затем также создадим конфигурационный файл:

1nano /etc/wireguard/wg0.conf

И внесем в него следующее содержимое:

 1[Interface]
 2Address = 10.20.0.102/24
 3Privatekey = 4Hfj7lZuaQZWkW2OGHPlkhr3Jxheg/lpcJkwiosvG0w=
 4DNS = 8.8.8.8, 1.1.1.1
 5
 6[Peer]
 7PublicKey = kKxQ4wF+kUrpsTGwjMvlSwX45WV4nixG76/+sKlzEQA=
 8AllowedIPs = 10.20.0.0/24, 0.0.0.0/0
 9Endpoint = 203.0.113.2:34567
10PersistentKeepalive = 25

Секция**[Interface]** описывает сетевой интерфейс, в ней мы указываем секретный ключ клиента, желаемый адрес в VPN-сети и DNS-сервера. Секция [Peer] отвечает за подключение к серверу, у всех клиентов она общая, содержит публичный ключ сервера, его адрес и порт, а также параметры подключения и роутинга.

Для управление туннелем в ручном режиме можно использовать утилиту wg-quick, для подключения выполните:

1wg-quick up wg0

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

Для отключения используйте:

1wg-quick down wg0

При этом не забудьте добавить секцию [Peer] для этого узла на сервере и перезапустить службу, для этого понадобится указать публичный ключ клиента и его адрес, точно также как мы это делали для Windows-клиента.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал