Традиционно реализация VPN существовала в двух формах. Реализация VPN в ядре, такая как IPsec, выполняет мощную обработку шифрования пакетов в ядре по принципу «удар в стеке» (т.е. между стеком IP и сетевыми драйверами). Это дает скорость, поскольку во время обработки пакетов отсутствует переключение контекста между ядром и пользовательским пространством. Но это связано с высокой сложностью управления в отдельной плоскости управления пользовательским пространством (например, IKE). Альтернативная форма реализации VPN — решения на основе TUN/TAP в пользовательском пространстве, такие как OpenVPN, Tinc , n2n., где криптографическая обработка выполняется демоном VPN в пользовательском пространстве. Естественно, эти решения VPN на основе TUN/TAP имеют низкую производительность по сравнению с IPsec, главным образом потому, что сетевые пакеты многократно пересекают границы ядра и пользовательского пространства, что приводит к частым переключениям контекста и копированию пакетов. Несмотря на недостаток производительности, решения VPN для пользовательского пространства пользуются большей популярностью, чем аналог в ядре, благодаря простоте использования и настройки.
Что такое WireGuard?
WireGuard — относительно новый участник на сцене программного обеспечения VPN, со смелым обещанием свергнуть OpenVPN с вершины с точки зрения скорости, простоты использования и возможности аудита. Чтобы быть конкурентоспособным с IPsec внутри ядра с точки зрения производительности, WireGuard реализует свой путь к данным в ядре. Но чтобы избежать ловушек сложной плоскости управления IPsec с отслеживанием состояния, WireGuard позволяет настраивать и администрировать ее через виртуальный интерфейс без сохранения состояния с использованием стандарта ip
и ifconfig
инструментов. Модуль ядра WireGuard реализован с использованием менее 4000 строк кода (что составляет всего 1% от реализаций OpenVPN или IPsec) и использует современную проверенную криптографию. Такая минимальная кодовая база способствует тщательному и своевременному аудиту безопасности со стороны сообщества при постоянных обновлениях.
Будет ли WireGuard выполнить свое обещание, еще неизвестно, но пока что он продемонстрировал большой успех в росте своей популярности. Тот факт, что WireGuard вошел в ядро Linux 5.6, является твердым свидетельством его надежности. Как Линус однажды выразился, это просто произведение искусства.
Примеры использования WireGuard VPN Server
Хотя название этого руководства посвящено настройке сервера WireGuard VPN, технически это неверно. В отличие от OpenVPN, в WireGuard нет понятия сервера и клиента. Скорее всего, конечные точки сети, подключенные WireGuard, называются одноранговыми узлами, и они общаются друг с другом напрямую через попарные туннели WireGuard. Подобные концепции уже доступны в существующих одноранговых VPN, таких как Tinc или n2n. Даже в такой одноранговой схеме VPN один назначенный одноранговый узел может играть роль VPN-сервера для всех остальных одноранговых узлов. Это традиционный вариант использования службы VPN, цель которого состоит в том, чтобы скрыть свой цифровой след, обойти геозону, защитить себя от слежки в общедоступной сети Wi-Fi и т. д. В этом случае вы настраиваете назначенный одноранговый узел WireGuard на виртуальный частный сервер (VPS) , и пусть он маршрутизирует весь ваш трафик в качестве шлюза по умолчанию. Поскольку одноранговый узел WireGuard работает на VPS, полностью под вашим контролем, вам не нужно беспокоиться о том, что ваши онлайн-действия в VPN тайно регистрируются, что всегда возможно для существующего бесплатного VPN-хостинга. Сервер WireGuard VPN также может быть настроен для ретрансляции трафика между подключенными пользователями (в случае, если они хотят, но не могут напрямую обмениваться трафиком за NAT).
Имея в виду такой вариант использования VPN, в этом руководстве я описываю, как настроить сервер Wireguard VPN в среде Ubuntu. Тестируемая платформа — сервер Ubuntu 20.04.1 LTS (Focal Fossa) с ядром 5.8.0-38. Однако большая часть этого руководства (за исключением установки WireGuard для конкретного дистрибутива и настройки брандмауэра) применима ко всем дистрибутивам Linux, включая Debian, Fedora и Arch Linux.
Установите WireGuard на Ubuntu
Неудивительно, что WireGuard уже включен в репозитории по умолчанию всех современных дистрибутивов Linux, включая Ubuntu 20.04. Это делает установку WireGuard довольно простой:
sudo apt install wireguard
Настройте WireGuard как VPN-сервер
Большую часть ручной настройки WireGuard можно выполнить стандартными средствами ip
или ifconfig
инструментами, за исключением криптографической конфигурации. Для настройки шифрования и прочего WireGuard поставляется с инструментами командной строки, называемыми wg
и wg-quick
.
Конфигурацию WireGuard лучше всего выполнять с помощью root, поскольку она включает в себя привилегированные операции. Итак, сначала переключитесь в корень:
sudo -i
Остальная часть процедуры будет выполняться как корень.
В WireGuard каждый подключенный одноранговый узел (включая сервер и клиентов) должен сгенерировать свою собственную пару криптографических (открытый/закрытый) ключей для аутентификации и шифрования. Итак, первым шагом в настройке сервера WireGuard является создание пары ключей для сервера следующим образом.
cd /etc/wireguard umask 077 wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey
В приведенном выше примере, команда umask
гарантирует, что только корень имеет разрешения на чтение, запись и выполнение /etc/wireguard. Ключевая пара, сгенерированная с помощью, wg
будет найдена в /etc/wireguard. Каждому клиенту, который хочет подключиться к серверу, также необходимо сгенерировать свою собственную пару ключей. Конфигурация на стороне клиента рассматривается в другом руководстве.
Затем создайте файл конфигурации сервера WireGuard в формате /etc/wireguard/wg0.conf. Файл конфигурации WireGuard называется именем интерфейса WireGuard, за которым следует .conf. Поэтому при активации wg0.conf будет создан виртуальный интерфейс с именем wg0. В файле конфигурации мы определяем, среди прочего, порт прослушивания сервера, закрытый ключ и частный IP-адрес, который будет назначен серверу, и т.д.
vi /etc/wireguard/wg0.conf
[Interface] PrivateKey = SMV0DW6G04+EQDgK5NMzlIEicD0qQ0ORb7njXp4atko= Address = 10.0.0.1/24 SaveConfig = true ListenPort = 51820 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
PrivateKey
: Вам необходимо заполнить это поле содержимым /etc/wireguard/privatekey.Address
: Это частный IP-адрес, который будет назначен виртуальному интерфейсу WireGuard этого партнера. Это может быть адрес IPv4 или IPv6.SaveConfig
: Если true, этот файл конфигурации будет автоматически обновляться при подключении нового узла.ListenPort
: Это порт прослушивания UDP для входящих подключений от других партнеров. Стандартный порт WireGuard — UDP/51820.PostUp/PostDown
: Указанные здесь команды должны запускаться автоматически после того, как этот одноранговый сервер будет включен (PostUp) или отключен ( PostDown).
Команда iptables
включает и отключает маскировку IP, которая необходима для того, чтобы одноранговые узлы с частными IP-адресами могли связываться друг с другом через свои общедоступные IP-адреса. Здесь убедитесь, что интерфейс, указанный с помощью -o
( ens3в этом примере), является интерфейсом WAN вашего сервера Ubuntu.
Убедитесь, что wg0.conf он недоступен для чтения непривилегированным пользователям.
chmod 600 /etc/wireguard/wg0.conf
Теперь активируйте эту конфигурацию с помощью:
wg-quick up wg0
Это активирует wg0виртуальный интерфейс, назначит ему частный IP-адрес и активирует IP-маскарад на интерфейсе. Вы можете проверить состояние интерфейса с помощью:
wg show wg0 ip addr show wg0
Если вы видите виртуальный интерфейс wg0, это означает, что одноранговый узел WireGuard успешно запущен и работает в Ubuntu.
Шаги настройки WireGuard Post
Чтобы этот одноранговый узел WireGuard мог успешно допустить других одноранговых узлов и действовать как их VPN-сервер, вам необходимо выполнить следующие шаги.
Во-первых, вам необходимо разрешить входящие UDP-соединения на порт прослушивания WireGuard (51820), указанный в /etc/wireguard/wg0.conf.
Инструмент настройки брандмауэра по умолчанию в системе Ubuntu — ufw. Используем, ufwчтобы открыть порт WireGuard в брандмауэре. Если вы настраиваете свой сервер Ubuntu через SSH удаленно, не забудьте также включить порт TCP/22.
ufw allow 51820/udp ufw allow 22/tcp ufw enable ufw status verbose
Как указано выше, правила брандмауэра успешно обновлены ufw и будут включены автоматически при запуске системы.
Затем вам необходимо включить переадресацию IP , чтобы сервер WireGuard VPN мог ретранслировать трафик между подключенными одноранговыми узлами, а также маршрутизировать трафик в качестве шлюза по умолчанию. Откройте /etc/sysctl.conf и раскомментируйте следующую строку.
net.ipv4.ip_forward = 1
Если вы назначаете IPv6-адреса одноранговым узлам WireGuard, раскомментируйте следующую строку.
net.ipv6.conf.all.forwarding = 1
Обновить обновлено sysctl.confс помощью:
sysctl -p /etc/sysctl.conf
Автозапуск службы WireGuard VPN
Если вы используете WireGuard VPN на удаленном экземпляре VPS , вы можете включить автоматический запуск WireGuard при загрузке VPS.
К счастью, WireGuard уже интегрирован с systemd в Ubuntu 20.04. Таким образом, вы можете управлять службой WireGuard с помощью команды systemctl
(вместо запуска wg-quick
вручную).
Если вы уже запустили WireGuard вручную wg-quick, сначала вам нужно остановить его перед использованием systemctl:
wg-quick down wg0
Затем вы можете легко запускать и останавливать WireGuard с помощью systemctl:
systemctl start wg -quick @ wg0 systemctl stop wg -quick @ wg0
Обратите внимание, что wg0 в команде должно быть указано имя вашего виртуального интерфейса WireGuard.
Чтобы включить автоматический запуск WireGuard при загрузке:
systemctl enable wg-quick@wg0
Вы можете отслеживать статус WireGuard с помощью:
systemctl status wg-quick@wg0
Теперь ваш сервер WireGuard VPN готов к использованию!
Резюме
В этом руководстве я описываю, как настроить WireGuard VPN в среде Ubuntu Server 20.04. Как видите, установка WireGuard на стороне сервера чрезвычайно проста, в основном из-за того, что WireGuard (как модуль ядра, так и инструменты пользовательского уровня) уже был принят в основных дистрибутивах Linux. В разработке находятся различные интерфейсы пользовательского интерфейса для WireGuard, а последняя версия (v1.16) NetworkManager также начала предоставлять встроенную поддержку WireGuard.