Настраиваем собственный сервер VPN WireGuard (с IPv4 и IPv6) для настольного компьютера и смартфона Android
В прошлой статье мы расказали, как обходить блокировки веб-сайтов с помощью Tor в условиях его гипотетической блокировки с помощью системы DPI. Это позволит посетить любой веб-сайт, но у такого способа есть серьёзные минусы. Tor не предназначен для маршрутизации через его тоннель всего трафика с вашего компьютера. Хотя он и может использоваться таким способом, скорость при этом слишком низкая. Вместо этого предполагается использование Tor Browser, который заточен под анонимность, поэтому не сохраняет cookies, что делает повседневное использование крайне неудобным. Также доступ из Tor ко многим ресурсам заблокирован с их стороны или требует частого ввода капчи.
Что такое WireGuard и почему именно он?
Для маршрутизации всего вашего трафика через шифрованный тоннель мы предлагаем использовать VPN WireGuard. Сейчас это один из самых передовых протоколов. Он реализован для многих платформ, включая Linux, macOS, Windows, Android и iOS, а скоро должен появиться во FreeBSD и в OpenBSD. В качестве транспортного протокола используется UDP, что даёт низкие накладные расходы на передачу данных. В качестве алгоритма симметричного шифрования используется ChaCha20, который эффективно работает на множестве процессоров даже без аппаратного ускорения. Реализация очень компактная (для Linux это 5500 строк кода), включена в официальный код ядра Linux, а значит прошла хорошее рецензирование, поэтому не должна иметь проблем с безопасностью.
WireGuard следует философии UNIX: делать что-то одно и делать это хорошо. Поэтому в нём не предусмотрены многие возможности, например использование в качестве транспортного протокола TCP и обфускация трафика. В последнее время в различных источниках стали появляться сообщения о блокировке в России WireGuard с помощью системы DPI (IT и СОРМ, ЗаТелеком, ntc.party, ветка комментариев на Habr). Разве не становится такой минималистичный подход неприменимым в текущей ситуации?
Судя по всему, блокировка пока осуществляется по IP-адресам серверов конкретных известных поставщиков услуг VPN или по протоколу, но далеко не на всех портах. Это нас пока не волнует, поскольку мы будем настраивать собственный сервер и сможем указать альтернативный порт. Данное решение может оказаться временным, но тогда философия WireGuard тоже сыграет нам на руку, потому что мы сможем пробросить трафик в другой, уже более скрытный тоннель, например TCP, Tor или Shadowsocks с опциональной обфускацией. Гибкость такого подхода позволит нам выбрать решение в зависимости от ситуации. Мы постараемся предоставить соответствующие инструкции позже, а пока перейдём к настройке сервера WireGuard.
Настраиваем сервер WireGuard
Для следования инструкциям в данной статье вам понадобится любой сервер за пределами России с операционной системой Ubuntu 21.04 или подобной и статическим внешним IP-адресом. Можно купить виртуальный сервер, например на DigitalOcean (партнёрская ссылка).
Также необходимо владеть навыками работы в консольном текстовом редакторе. Можно использовать Vim или Emacs, но они требуют изучения. Самым простым вариантом для новичков будет Nano. Устанавливается командой sudo apt install nano . Вызывается командой sudo nano , которой можно дополнительно передать имя файла: sudo nano /foo/bar . Далее можно разобраться по подсказкам в нижней части экрана. Они означают сочетания клавиши Ctrl с другими клавишами.
Все дальнейшие команды необходимо исполнять не просто от имени суперпользователя, а в его окружении. Если вы не вошли от его имени по SSH (а мы рекомендуем отключать такую возможность, о чём подробнее будет сказано в конце статьи), то выполните команду sudo su .
Для начала нужно разрешить пересылку пакетов IP. В файле /etc/sysctl.conf раскомментируем следующие строки (удалим символ # в начале строки):
Применим новую конфигурацию:
Установим WireGuard и другие нужные пакеты:
Далее мы создадим файлы ключей и конфигурации. В целях безопасности необходимо ограничить доступ к ним только для суперпользователя, поэтому установим маску текущей сессии командной оболочки:
Сгенерируем ключи для сервера и пары клиентов (в дальнейшем мы будем подключать к VPN домашний компьютер и смартфон):
Выведем на экран сгенерированные ключи:
После окончания настройки сервера и клиентов или сейчас, если вы не собираетесь очищать экран, эти файлы можно удалить:
Теперь нужно выбрать порт и подсети IPv4 и IPv6. Мы будем использовать порт 37581 и подсети 10.73.105.0/24 и fd41:ce44:b4c9:44ca::/64 . Вы можете использовать их же или выбрать любой другой порт (от 1 до 65535, кроме 22, поскольку он используется для SSH) и любые подсети из 10.0.0.0/8 и fd00::/8 (если знаете, как их рассчитывать). Вопрос выбора порта особенно интересен, так как есть информация о блокировках WireGuard по порту, но мы не столкнулись ни с какими проблемами такого рода. На всякий случай рекомендуем не использовать стандартный порт 51820 .
Создадим файл /etc/wireguard/wg0.conf . Ключи нужно заменить на те, что мы сгенерировали. Название интерфейса eth0 у вас может отличаться, узнать его можно командой sudo ifconfig :
Теперь включим и запустим сервис:
Проверить работу сервера можно командой sudo wg show . На экране должна появиться следующая информация (ключи будут отличаться):
Настраиваем WireGuard на настольном компьютере
Здесь мы рассмотрим настройку WireGuard на настольном компьютере под управлением операционной системы Ubuntu 20.04 или подобной. Если вы используете другую операционную систему, то воспользуйтесь инструкциями из Интернета.
Повторим команды, которые мы уже использовали на сервере:
Теперь с помощью консольного текстового редактора создадим файл /etc/wireguard/wg0.conf . Ключи, опять же, нужно заменить на те, что мы сгенерировали. IP-адрес 164.90.178.225 замените на адрес вашего сервера:
Если вы использовали графический текстовый редактор, то файл нужно защитить явно:
Теперь включим и запустим сервис:
Проверить работу сервера можно командой sudo wg show . На экране должна появиться следующая информация (ключи и порт будут отличаться):
Узнать свой IP-адрес можно следующей командой:
Он должен совпадать с IP-адресом вашего сервера.
Если на вашем сервере настроен IPv6, то у вас он тоже будет работать, даже если ваш поставщик услуг Интернета не поддерживает его:
Настраиваем WireGuard на смартфоне Android
Для смартфонов под управлением операционной системы Android существует официальное приложение от оригинального разработчика WireGuard, доступное в Google Play Store и, конечно, для самостоятельной компиляции из исходного кода.
Интерфейс настройки повторяет структуру уже созданного нами ранее файла конфигурации для настольного компьютера, но мы всё-таки приведём пример заполнения полей. Опять же, нужно заменить ключи, IP-адрес и порт сервера на те, которые вы сгенерировали.
В секции “Interface”:
- Name: любое название
- Private key: SI+uObmWkwTXykuGk0E2LdClUvAmwkjRJA/XBo7//m4=
- Public key: QmmAJIv5U5eMynOHz6/b4zqtuEURhhaKxV+QVmHcRWQ= (должен появиться автоматически)
- Addresses: 10.73.105.3/32, fd41:ce44:b4c9:44ca::3/128
- DNS servers: 1.1.1.1
В секции “Peer” (нужно нажать кнопку “ADD PEER”):
- Public key: /Rv/4+vo9pGPRAL5EOAk/LkEy7nXdvKH4ZX5UkS78yA=
- Endpoint: 164.90.178.225:37581
- Allowed IPs: 0.0.0.0/0, ::/0
Также вы можете сгенерировать QR-код с вашей конфигурацией, который удобно считывать с помощью приложения WireGuard для смартфона. Для этого создайте где угодно файл конфигурации wg0.conf аналогичный тому, который мы создавали для настольного компьютера:
Теперь установить программу для генерации QR-кодов и запустите её:
Считайте этот QR-код с помощью приложения WireGuard для смартфона. Не забудьте после этого удалить файл конфигурации, так как он содержит ваш приватный ключ:
После включения VPN узнать ваш IP-адрес можно на сайте https://myip.com. Он должен совпадать с IP-адресом вашего сервера.
Безопасность
Теперь ваш VPN должен работать. Однако мы совсем не рассматривали вопросы безопасности.
Категорически важно обновить пакеты на вашем сервере и делать это регулярно (хотя бы раз в неделю):
Столь же важно включить аутентификацию в SSH по ключу вместо пароля или использовать очень длинный пароль (минимум 32 большие и маленькие цифры и буквы), а также сменить стандартный порт 22 на какой-нибудь другой (строка Port 22 в файле /etc/ssh/sshd_confg и команда sudo systemctl restart ssh.service для перезапуска).
Стоит запретить вход по SSH от имени суперпользователя. Для этого нужно создать другого пользователя, установить для него пароль и ключи SSH и раскомментировать в файле /etc/ssh/sshd_config строку PermitRootLogin no . Этот пользователь, хотя и будет иметь возможность исполнять команды от имени суперпользователя, должен требовать для этого ввод пароля. Таким образом, защита важных файлов будет состоять и из ключа, и из пароля.
Обычной практикой является использование сетевого экрана. В данном случае мы не видим в этом серьёзной необходимости, но всё-таки рекомендуем настроить его. Можно воспользоваться сетевым экраном вашего поставщика услуг VPS и самой операционной системы. Необходимо открыть порты SSH и WireGuard и запретить всё остальное. Следующие команды сохранят настройки и применят их даже после перезагрузки:
Проверить работу сетевого экрана можно командой sudo ufw status verbose .
В большинстве других случаев также рекомендуются такие практики, как настройка Fail2ban для предотвращения множественных попыток подключения по SSH или включение доступа по SSH только после простукивания портов (англ. port knocking), настройка мониторинга и сбора журналов. Однако это выходит за рамки данной статьи.
Есть три основные опасности, которые может представлять для вас незащищённый сервер VPN в случае его взлома:
- Перехват вашего нешифрованного трафика;
- Подмена DNS и дальнейшая подмена веб-сайтов, если переход изначально осуществлён по HTTP и без знания веб-браузером параметров HSTS (от англ. HTTP Strict Transport Security);
- Осуществление незаконных действий с вашего сервера.
Мы не считаем эти опасности очень критичными. При следовании советам из данной статьи они менее вероятны, чем, например, взлом домашнего маршрутизатора (англ. router), за безопасностью которых редко кто следит, насмотря на риски. Так что мы считаем, что если вы смогли выполнить указанные здесь инструкции, то вы вполне можете пользоваться собственным сервером VPN и не беспокоиться. Однако мы всё-таки надеемся, что вы не остановитесь на прочтении данного материала и подробнее изучите работу сетей и операционных систем. Хотя бы потому, что в современных условиях это может вам пригодиться, чтобы просто не потерять доступ в Интернет.
Conceptual Overview
If you’d like a general conceptual overview of what WireGuard is about, read onward here. You then may progress to installation and reading the quickstart instructions on how to use it.
If you’re interested in the internal inner workings, you might be interested in the brief summary of the protocol, or go more in depth by reading the technical whitepaper, which goes into more detail on the protocol, cryptography, and fundamentals. If you intend to implement WireGuard for a new platform, please read the cross-platform notes.
WireGuard securely encapsulates IP packets over UDP. You add a WireGuard interface, configure it with your private key and your peers’ public keys, and then you send packets across it. All issues of key distribution and pushed configurations are out of scope of WireGuard; these are issues much better left for other layers, lest we end up with the bloat of IKE or OpenVPN. In contrast, it more mimics the model of SSH and Mosh; both parties have each other’s public keys, and then they’re simply able to begin exchanging packets through the interface.
Simple Network Interface
WireGuard works by adding a network interface (or multiple), like eth0 or wlan0 , called wg0 (or wg1 , wg2 , wg3 , etc). This network interface can then be configured normally using ifconfig(8) or ip-address(8) , with routes for it added and removed using route(8) or ip-route(8) , and so on with all the ordinary networking utilities. The specific WireGuard aspects of the interface are configured using the wg(8) tool. This interface acts as a tunnel interface.
WireGuard associates tunnel IP addresses with public keys and remote endpoints. When the interface sends a packet to a peer, it does the following:
- This packet is meant for 192.168.30.8. Which peer is that? Let me look. Okay, it’s for peer ABCDEFGH . (Or if it’s not for any configured peer, drop the packet.)
- Encrypt entire IP packet using peer ABCDEFGH ‘s public key.
- What is the remote endpoint of peer ABCDEFGH ? Let me look. Okay, the endpoint is UDP port 53133 on host 216.58.211.110.
- Send encrypted bytes from step 2 over the Internet to 216.58.211.110:53133 using UDP.
When the interface receives a packet, this happens:
- I just got a packet from UDP port 7361 on host 98.139.183.24. Let’s decrypt it!
- It decrypted and authenticated properly for peer LMNOPQRS . Okay, let’s remember that peer LMNOPQRS ‘s most recent Internet endpoint is 98.139.183.24:7361 using UDP.
- Once decrypted, the plain-text packet is from 192.168.43.89. Is peer LMNOPQRS allowed to be sending us packets as 192.168.43.89?
- If so, accept the packet on the interface. If not, drop it.
Behind the scenes there is much happening to provide proper privacy, authenticity, and perfect forward secrecy, using state-of-the-art cryptography.
Cryptokey Routing
At the heart of WireGuard is a concept called Cryptokey Routing, which works by associating public keys with a list of tunnel IP addresses that are allowed inside the tunnel. Each network interface has a private key and a list of peers. Each peer has a public key. Public keys are short and simple, and are used by peers to authenticate each other. They can be passed around for use in configuration files by any out-of-band method, similar to how one might send their SSH public key to a friend for access to a shell server.
For example, a server computer might have this configuration:
And a client computer might have this simpler configuration:
In the server configuration, each peer (a client) will be able to send packets to the network interface with a source IP matching his corresponding list of allowed IPs. For example, when a packet is received by the server from peer gN65BkIK. , after being decrypted and authenticated, if its source IP is 10.10.10.230, then it’s allowed onto the interface; otherwise it’s dropped.
In the server configuration, when the network interface wants to send a packet to a peer (a client), it looks at that packet’s destination IP and compares it to each peer’s list of allowed IPs to see which peer to send it to. For example, if the network interface is asked to send a packet with a destination IP of 10.10.10.230, it will encrypt it using the public key of peer gN65BkIK. , and then send it to that peer’s most recent Internet endpoint.
In the client configuration, its single peer (the server) will be able to send packets to the network interface with any source IP (since 0.0.0.0/0 is a wildcard). For example, when a packet is received from peer HIgo9xNz. , if it decrypts and authenticates correctly, with any source IP, then it’s allowed onto the interface; otherwise it’s dropped.
In the client configuration, when the network interface wants to send a packet to its single peer (the server), it will encrypt packets for the single peer with any destination IP address (since 0.0.0.0/0 is a wildcard). For example, if the network interface is asked to send a packet with any destination IP, it will encrypt it using the public key of the single peer HIgo9xNz. , and then send it to the single peer’s most recent Internet endpoint.
In other words, when sending packets, the list of allowed IPs behaves as a sort of routing table, and when receiving packets, the list of allowed IPs behaves as a sort of access control list.
This is what we call a Cryptokey Routing Table: the simple association of public keys and allowed IPs.
Any combination of IPv4 and IPv6 can be used, for any of the fields. WireGuard is fully capable of encapsulating one inside the other if necessary.
Because all packets sent on the WireGuard interface are encrypted and authenticated, and because there is such a tight coupling between the identity of a peer and the allowed IP address of a peer, system administrators do not need complicated firewall extensions, such as in the case of IPsec, but rather they can simply match on «is it from this IP? on this interface?», and be assured that it is a secure and authentic packet. This greatly simplifies network management and access control, and provides a great deal more assurance that your iptables rules are actually doing what you intended for them to do.
Built-in Roaming
The client configuration contains an initial endpoint of its single peer (the server), so that it knows where to send encrypted data before it has received encrypted data. The server configuration doesn’t have any initial endpoints of its peers (the clients). This is because the server discovers the endpoint of its peers by examining from where correctly authenticated data originates. If the server itself changes its own endpoint, and sends data to the clients, the clients will discover the new server endpoint and update the configuration just the same. Both client and server send encrypted data to the most recent IP endpoint for which they authentically decrypted data. Thus, there is full IP roaming on both ends.
Ready for Containers
WireGuard sends and receives encrypted packets using the network namespace in which the WireGuard interface was originally created. This means that you can create the WireGuard interface in your main network namespace, which has access to the Internet, and then move it into a network namespace belonging to a Docker container as that container’s only interface. This ensures that the only possible way that container is able to access the network is through a secure encrypted WireGuard tunnel.
Learning More
Consider glancing at the commands & quick start for a good idea of how WireGuard is used in practice. There is also a description of the protocol, cryptography, & key exchange, in addition to the technical whitepaper, which provides the most detail.
About The Project
Source Code
WireGuard is divided into several repositories hosted in the ZX2C4 Git Repository and elsewhere. Consult the project repository list.
IRC Discussions
If you’re having trouble setting up WireGuard or using it, the best place to get help is the #wireguard IRC channel on Libera.Chat. We also discuss development tasks there and plan the future of the project.
Mailing List
Get involved in the WireGuard development discussion by joining the mailing list. This is where all development activities occur. Submit patches using git-send-email , similar to the style of LKML.
Email Contact
If you’d like to contact us privately for a particular reason, you may reach us at team@wireguard.com. Keep in mind, though, that «support» requests are much better suited for our IRC channel.
Security Contact
Please report any security issues to, and only to, security@wireguard.com. Do not send non-security-related issues to this email alias. Do not send security-related issues to different email addresses.
License
The kernel components are released under the GPLv2, as is the Linux kernel itself. Other projects are licensed under MIT, BSD, Apache 2.0, or GPL, depending on context.
© Copyright 2015-2022 Jason A. Donenfeld. All Rights Reserved. «WireGuard» and the «WireGuard» logo are registered trademarks of Jason A. Donenfeld.
This project is from ZX2C4 and from Edge Security, a firm devoted to information security research expertise.
Как настроить WireGuard, ваш собственный VPN нового века
Напоминаем, что все действия, описанные в статье, пользователь делает на свой страх и риск. Материал приведен исключительно в ознакомительных целях. Если же вы собираетесь воспроизводить действия, описанные ниже, настоятельно советуем внимательно прочитать статью до конца хотя бы один раз. Редакция 3DNews не несет никакой ответственности за любые возможные последствия.
⇡#Что такое WireGuard и зачем он нужен?
WireGuard — это современный протокол для организации VPN, написанный с нуля, бесплатный и с открытыми исходниками. В отличие от «мастодонтов» вроде OpenVPN или IPSec, он намного проще и легче. Это касается и скорости (пере)подключения, и производительности, и требований к ресурсам, и процесса настройки, и объёма кода. Недавно было объявлено, что WireGuard войдёт в состав будущих ядер Linux, а впоследствии попадёт и во все популярные дистрибутивы, что косвенно указывает на зрелость этого решения.
Как и было заявлено в анонсе, мы рассматриваем сценарий защиты подключения к публичным и другим недоверенным сетям. Естественно, этим использование WireGuard не ограничивается. В качестве примера рассмотрим настройку клиентов и сервера (правда, в данном случае это условные понятия — в силу специфики протокола), работающего в облаке и на домашнем роутере Keenetic. Как показывает практика, многие публичные VPN-сервисы не отличаются щепетильностью в отношении данных клиентов, поэтому всегда лучше иметь что-то своё, подконтрольное только пользователю. В нашем случае мы рассматриваем установку и настройку WireGuard, используя для этого компьютер на Windows и облачную виртуальную машину на Ubuntu.
Нам понадобится полный набор PuTTY, так что лучше скачать сразу MSI-пакет с инсталлятором (доступен по предыдущей ссылке), который всё установит и создаст новую группу в главном меню. Там нам нужна утилита PuTTYgen. После запуска генерируем новую пару ключей с настройками по умолчанию (RSA-2048), нажав кнопку Generate и поводив с полминуты мышкой в окне утилиты. Осталось заполнить несколько полей: в Key comment можно ввести название ключа в качестве напоминания, а в Key passphrase и Confirm passphrase ввести один и тот же пароль.
Пароль этот ещё пригодится, так что его надо запомнить или сохранить в надёжном месте. Далее в PuTTYgen сохраняем по отдельности приватный (Save private key, файл .ppk) и публичный (Save public key) ключи. Если планируется использовать несколько облачных провайдеров, то для каждого из них, а лучше и для каждого сервера, использовать собственные ключи.
⇡#Настройка сервера Vscale
Vscale — российский облачный провайдер, имеющий собственные площадки в Москве и Санкт-Петербурге и предлагающий неплохие конфигурации по низким ценам. Самый дешёвый сервер, мощностей которого вполне достаточно для наших задач, обойдётся в 200 руб./месяц. Хранение снапшота стоит ещё 40 руб./месяц. И его тоже можно перенести из одного региона в другой. Зато никаких ограничений по трафику нет.
Специально для читателей 3DNews Vscale подготовила промокод 3DNEWS500, чтобы можно было ознакомиться со всеми возможностями сервиса. После регистрации надо пополнить баланс хотя бы на 100 рублей или привязать банковскую карту. Затем промокод надо активировать на этой странице. Код будет действовать до 23:59:59 18.02.2020.
Интерфейс сервиса доступен на русском языке. Разобраться в нём просто, так что коротко опишем основные этапы. Для работы первым делом нужно в настройках аккаунта добавить публичный SSH-ключ, полученный в PuTTYgen. Затем в разделе серверов создать новый сервер с ОС Ubuntu 18.04, указав нужный регион, тариф и ключ. В течение минуты сервер будет готов и запущен.
Отдельного SSH-клиента для доступа к командной строке не требуется, так как Vscale предоставляет веб-консоль. Для входа вводим логин root и нажимаем Enter, далее по одной вводим нижеприведённые команды и на всё соглашаемся, нажимая Enter:
Пара замечаний на случай использования других облачных провайдеров. Во-первых, для Ubuntu 19.10 и более свежих версий ОС добавлять ppa не надо, достаточно будет первых двух команд. Во-вторых, доступ к командной строке возможен с помощью PuTTY. В поле Host Name надо ввести IP-адрес сервера, а в разделе Connection → SSH → Auth — путь до приватного ppk-ключа. Логин root, а пароль тот, что был указан при создании ключа (Key passphrase). Для удобства можно сохранить сессию (Save). По нажатии кнопки Open откроется окно консоли, при первом запуске предваряемое уведомлением о безопасности, с которым надо согласиться.
Обратите внимание, что даже за выключенным сервером сохраняются ресурсы, которые точно так же оплачиваются. Поэтому ненужный сервер надо удалять. Если VPN необходим не на постоянной основе, а лишь иногда, то можно сохранить все настройки, создав снапшот (бэкап). Сам снапшот можно перенести в другой регион и при создании нового сервера выбрать именно его в качестве основы. Создавать снапшот надо строго после завершения настройки VPN-сервера и весьма желательной в этом случае установки DDNS-клиента, выключив сервер непосредственно перед созданием бэкапа.
⇡#Настройка VPN-сервера WireGuard
Для настройки сервера WireGuard не будем мудрствовать лукаво, а воспользуемся открытым решением easy-wg-quick. Данный скрипт автоматически формирует файлы конфигурации и позволяет легко манипулировать настройками. Предварительно надо установить сам wireguard и некоторые дополнительные утилиты. В веб-консоли Vscale или в PuTTY вводим следующие команды, нажимая Enter после каждой:
При первом запуске скрипт по умолчанию создаст конфигурационный файл для сервера и для одного клиента, а также выведет QR-код, который можно отсканировать в мобильном приложении WireGuard, чтобы тут же получить все необходимые настройки.
Чтобы добавить настройки ещё для одного клиента (ноутбука, например), надо ещё раз выполнить эту же команду, указав имя нового профиля:
Например, для имени профиля win10 будет создан соответствующий файл wgclient_win10.conf. Его содержимое можно просмотреть командой cat, что пригодится при настройке клиента WireGuard в будущем.
После добавления всех нужных профилей осталось лишь добавить сервер WireGuard в автозапуск и включить его:
Для просмотра текущих подключений используйте эту команду:
⇡#Настройка VPN-клиента WireGuard
Клиенты для Windows, Android, iOS и других ОС можно скачать на сайте WireGuard. С мобильными версиями всё просто — достаточно отсканировать QR-код. Или же, как и для всех остальных клиентов, вручную скопировать настройки из файлов wgclient_*.conf. Из дополнительных опций там есть только возможность исключить доступ через VPN для выбранных пользователем приложений: Excluded Applications в настройках профиля.

В случае Windows-клиента в меню левой нижней кнопки надо выбрать Add empty tunnel, вставить в новом окне всё содержимое conf-файла, указать имя профиля (Name). Опционально можно включить функцию kill-switch для блокировки любого трафика вне VPN-подключения. Наконец, надо сохранить (Save) и активировать (Activate) соединение. Для проверки корректности подключения проще всего зайти на какой-нибудь сайт, определяющий текущий внешний IP-адрес.
В актуальных моделях роутеров Keenetic с прошивкой версии 3.3 или старше также появилась поддержка VPN-подключений WireGuard — нужно установить одноимённый компонент. Чтобы импортировать настройки соединения, нужно сохранить содержимое файла wgclient_*.conf (см. выше) в текстовый документ, а затем в разделе «Другие подключения» загрузить параметры из этого файла. Роутер создаст на их основе новое подключение, которое нужно активировать переключателем в левой части списка.
Для корректной работы надо сделать несколько небольших изменений (кстати, после каждого действия не забывайте нажимать кнопку «Сохранить» в нижней части веб-интерфейса). Во-первых, включить галочку «Использовать для входа в Интернет». Во-вторых, поле «Разрешенные подсети» привести к виду 0.0.0.0/0. В-третьих, в разделе «Приоритеты подключений» перетащить свежесозданное подключение выше всех остальных.
После этого все клиенты, подключённые к роутеру, по умолчанию будут выходить в Интернет через VPN-туннель. Если же необходим доступ только для некоторых устройств, то лучше завести отдельный профиль.
Обратите внимание, что для каждого клиента нужно будет сгенерировать и скопировать собственный conf-файл. Если на предыдущем этапе вы настроили DDNS-клиент на сервере, то в разделе Endpoint у всех клиентов надо будет прописать DDNS-имя вместо IP-адреса.
⇡#Настройка WireGuard для Keenetic: сервер и мобильный клиент
В самом начале мы уже упоминали, что принципиального различия между сервером и клиентом в случае WireGuard нет. И раз уже поддержка этого протокола доступна в прошивке, то можно настроить подключение клиентов к роутеру. В текущей версии не все настройки вынесены в веб-интерфейс, но ничего сложного всё равно нет. Единственное требование — наличие «белого» внешнего IP-адреса, пусть даже динамического (в этом случае поможет DDNS).
В разделе «Другие подключения» в секции WireGuard нужно добавить новое подключение. Указываем имя (любое) и ставим галочку «Генерация ключей» (Generate a random key pair). В поле «Адрес» надо ввести любой подходящий адрес из частного диапазона, но такой, чтобы он не пересекался с другими сетями на самом роутере. В качестве примера используем 10.11.12.1/24. Номер порта можно указать произвольный, лишь бы он не блокировался провайдером и не совпадал с уже открытыми портами для других сервисов. В нашем примере это 55555. Наконец, в поле DNS надо указать адрес любого публичного DNS-сервера.

Следующий этап — добавление пиров (клиентов) соответствующей кнопкой. Имя указываем любое, а в поле «Разрешённые подсети» вводим 0.0.0.0/0. Теперь открываем на смартфоне мобильное приложение WireGuard и добавляем новое подключение — Create from scratch. В разделе Interface указываем имя (любое) и жмём кнопку Generate. Содержимое поля Public Key копируем и вставляем в настройках пира на роутере в поле «Публичный ключ». В поле Addresses указываем частный IP-адрес из той же подсети, что и для роутера. В нашем примере у него был 10.11.12.1/24, так что для клиента возьмём просто следующий: 10.11.12.2/24. DNS опять же любой публичный.
В разделе Peers в поле Public keys копируем содержимое поля «Публичный ключ» роутера, в Allowed IPs вводим 0.0.0.0/0, а в Endpoint вводим внешний IP-адрес роутера (или DDNS-имя) и порт через двоеточие, то есть для нашего примера должна получиться конструкция вида xx.xx.xx.xx:55555. Опционально можно включить функцию поддержки активности подключения, указав время в секундах в поле Persistent keepalive на клиенте и в поле «Проверка активности» в параметрах пира на роутере. Обычно достаточно интервала от 3 до 30 секунд. Для остальных клиентов придётся повторить эту же процедуру добавления новых пиров.

Но это ещё не всё. После добавления пиров необходимо разрешить им доступ в локальную сеть и в Интернет. В разделе «Межсетевой экран» надо найти WireGuard-подключение — ориентируйтесь по имени, оно может быть в выпадающем меню сверху — и завести для него новое разрешающее правило (см. скриншот выше). Также надо будет подключиться к роутеру по telnet с помощью PuTTY и ввести несколько команд. Адрес по умолчанию my.keenetic.net, логин и пароль те же, что для доступа к веб-интерфейсу, команды приведены ниже:
Наконец, после всех этих действий надо активировать WireGuard-соединение. Если всё прошло успешно, то после подключения клиента напротив пира будет гореть зелёный кружочек и показываться статистика по трафику. Только учтите, что производительность роутера всё-таки намного меньше, чем у любого облачного сервера. Так что приличную скорость соединения он обеспечит ценой нагрузки на CPU маршрутизатора, что может повлиять на работу других сервисов.

Напоследок напомним «народную» мудрость: на VPN надейся, а сам не плошай. Проще говоря, надо всегда соблюдать осторожность и цифровую гигиену. К совсем уж подозрительным сетям и вовсе подключаться не надо, да и про базовые правила забывать не стоит. Их не так уж много: вовремя ставить обновления ОС и ПО, использовать двухфакторную аутентификацию, тщательно выбирать используемые программы, проверять разумность запросов ПО на доступ к различным ресурсам устройства, обзавестись современным антивирусом. Всё это касается и смартфонов, и планшетов, и ноутбуков, и десктопов.
WireGuard — прекрасный VPN будущего?

Наступило время, когда VPN уже не является каким-то экзотическим инструментом бородатых сисадминов. Задачи у пользователей разные, но факт в том, что VPN стал нужен вообще всем.
Проблема текущих VPN решений в том, что их тяжело правильно настроить, дорого обслуживать, а так же в них полно legacy кода сомнительного качества.
Несколько лет назад канадский специалист по информационной безопасности Jason A. Donenfeld решил, что хватит это терпеть, и начал работу над WireGuard. Сейчас WireGuard готовится к включению в состав ядра Linux, он даже получил похвалы от Линуса Торвальдса и в американском сенате.
Заявленные преимущества WireGuard над другими VPN решениями:
- Простой в использовании.
- Использует современную криптографию: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF и т.д.
- Компактный читаемый код, проще исследовать на уязвимости.
- Высокая производительность.
- Четкая и проработанная спецификация.
Неужели найдена серебрянная пуля? OpenVPN и IPSec пора закапывать? Я решил с этим разобраться, а заодно сделал скрипт для автоматической установки личного VPN сервера.
Принципы работы
Принципы работы можно описать примерно так:
- Создается WireGuard интерфейс, ему назначается приватный ключ и IP адрес. Загружаются настройки других пиров: их публичные ключи, IP адреса и т.д.
- Все IP пакеты, приходящие на WireGuard интерфейс инкапсулируются в UDP и безопасно доставляются другим пирам.
- Клиенты задают публичный IP адрес сервера в настройках. Сервер автоматически узнает внешние адреса клиентов, когда от них приходят корректно аутентифицированные данные.
- Сервер может менять публичный IP адрес не прерывая работы. При этом он отошлет оповещение подключенным клиентам и они обновят свою конфигурацию на лету.
- Используется концепт маршрутизации Cryptokey Routing. WireGuard принимает и отправляет пакеты на основании публичного ключа пира. Когда сервер расшифровывает корректно аутентифицированный пакет, проверяется его src поле. Если оно соответствует с конфигурацией allowed-ips аутентифицированного пира, то пакет принимается интерфейсом WireGuard. При отправке исходящего пакета происходит соответственная процедура: берется dst поле пакета и на основании его выбирается соответсвующий пир, пакет подписывается своим ключом, шифруется ключом пира и отправляется на remote endpoint.
Вся основная логика WireGuard занимает менее 4 тысяч строк кода, тогда как OpenVPN и IPSec имеют сотни тысяч строк. Для поддержки современных криптоалгоритмов предлагается включить в состав ядра Linux новый криптографический API Zinc. В данный момент идет обсуждение, насколько это удачная идея.
Производительность
Максимальное преимущество в производительности (по сравнению с OpenVPN и IPSec) будет заметно на Linux системах, так как там WireGuard реализован в виде модуля ядра. Кроме этого поддерживаются macOS, Android, iOS, FreeBSD и OpenBSD, но в них WireGuard выполняется в userspace со всеми вытекающими последствиями для производительности. Поддержку Windows обещают добавить в ближайшем будущем.
Результаты бенчмарков с официального сайта:

Мой опыт использования
Я не эксперт по настройке VPN. Однажды настраивал OpenVPN ручками и это было очень муторно, а IPSec даже и не пытался. Слишком много решений нужно принимать, очень легко выстрелить себе в ногу. Поэтому я всегда пользовался готовыми скриптами для настройки сервера.
Так вот, WireGuard, с моей точки зрения, вообще идеален для пользователя. Все низкоуровневые решения приняты в спецификации, поэтому процесс подготовки типичной VPN инфраструктуры занимает всего несколько минут. Нафакапить в конфигурации практически невозможно.
Процесс установки детально описан на официальном сайте, отдельно хочется отметить отличную поддержку OpenWRT.
Генерируются ключи шифрования утилитой wg :
Далее, нужно создать серверный конфиг /etc/wireguard/wg0.conf со следующим содержанием:
и поднять туннель скриптом wg-quick :
В системах с systemd вместо этого можно использовать sudo systemctl start wg-quick@wg0.service .
На клиентской машине, создать конфиг /etc/wireguard/wg0.conf :
И точно так же поднять туннель:
Осталось настроить NAT на сервере, чтобы клиенты могли выходить в Интернет, и все готово!
Такую простоту использования и компактность кодовой базы удалось достичь за счет отказа от функционала дистрибьюции ключей. Здесь нет сложной системы сертификатов и всего этого корпоративного ужаса, короткие ключи шифрования распространяются примерно как SSH ключи. Но в связи с этим возникает проблема: WireGuard будет не так просто внедрять в некоторых уже существующих сетях.
Из недостатков стоит отметить, что WireGuard не заработает через HTTP proxy, поскольку в качестве транспорта есть только протокол UDP. Возникает вопрос, возможно ли будет обфусцировать протокол? Конечно, это не прямая задача VPN, но для OpenVPN, например, существуют способы маскировки под HTTPS, что помогает жителям тоталитарных стран полноценно пользоваться Интернетом.
Выводы
Подводя итог, это очень интересный и перспективный проект, можно уже сейчас использовать его на личных серверах. Какой профит? Высокая производительность на Linux системах, простота настройки и поддержки, компактная и читабельная кодовая база. Однако, бросаться переводить комплексную инфраструктуру на WireGuard еще рано, стоит подождать включение в состав ядра Linux.
Для экономии своего (и вашего) времени я разработал автоматический установщик WireGuard. С его помощью можно поднять личный VPN для себя и своих знакомых даже ничего в этом не понимая.