Настройка 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.
Помогла статья? Поддержи автора и новые статьи будут выходить чаще: