Как установить и настроить WireGuard — новый вариант реализации VPN?

WireGuard — новый вариант реализации VPN, сочетающий простоту реализации (около 4 тысяч строк) с полным функционалом проверенных криптографических алгоритмов. По мнению автора Джейсона Доненфилда (Jason A. Donenfeld), главы компании Edge Security и ее специалиста по безопасности, его реализация лишена усложнений, присущих таким проектам, как XFRM и OpenVPN.

Проект WireGuard развивается несколько лет и уже прошел стадию рецензирования криптографии, что позволяет говорить о его внедрении в ядро и публичном тестировании. После прохождения тестирования в ядре Linux предполагается портировать наработки в другие ОС. Код распространяется под лицензией GNU GPLv2.

Тесты показали, что WireGuard имеет в 4 раза лучшую пропускную способность и в 3.8 раза более отзывчив по сравнению с OpenVPN (256-bit AES c HMAC-SHA2–256). WireGuard также опережает по производительности IPsec (256-bit ChaCha20+Poly1305 и AES-256-GCM-128), но существенный выигрыш для IPsec заметен в основном в области снижения задержек.

Рассмотрим пример, как можно использовать VPN тунель P2P на базе WireGuard между двумя боксами в разных сетях и спрятанных за роутерами / фаерволами, которые подсоединены к интернету, для доступа друг к другу. Например с целью использования тюнеров друг друга.

Для данного примера рассмотрим следующую конфигурацию сети:

Сеть A будет иметь адрес 10.10.0.0/24 и в ней будет находится бокс Box A.

Сеть B будет иметь адрес 10.10.1.0/24 и в ней будет находится бокс Box B.

Box A — будет выступать в качестве сервера и роутер, за которым он спрятан Router A — должен иметь статический белый IP-адрес, в нашем примере это 82.19.23.1. Внутренний IP-адрес роутера соответственно 10.10.0.1, а внутренний адрес встроенного локального интерфейса бокса Box A будет 10.10.0.2 с маской сети 255.255.255.0.

Box B — будет выступать в качестве клиента и роутер, за которым он спрятан Router B — может иметь динамический IP-адрес, в нашем примере это x.x.x.x. Внутренний IP-адрес роутера соответственно 10.10.1.1, а внутренний адрес встроенного локального интерфейса бокса Box B будет 10.10.1.2 с маской сети 255.255.255.0.

Так же на схеме изображен VPN тунель который мы будем создавать с разными IP-адресами, указанными на его концах в сети A и в сети B (обратите внимание, что адрес виртуального интерфейса сети (wg0) туннеля не должен совпадать с адресом физического локального интерфейса сетей (eth0)).

ПРИМЕЧАНИЕ!

Несмотря на клиент- серверную схему построения, доступ будет как у клиента к серверу, так и у сервера к клиенту, но можно настроить и односторонний доступ.

Приступим к конфигурированию

1. Для начала на каждом боксе (Box A и Box B) установим требуемые пакеты для WireGuard, для чего используем telnet и выполняем команды в консоле:

opkg update && opkg install wireguard-tools

2. Для настройки указанной выше конфигурации сети, первым делом необходимо сгенерировать приватный ключ и публичный ключ, для чего на каждом боксе (Box A и Box B) выполним следующие команды в консоле при помощи telnet

umask 077 && printf "" | tee /etc/wireguard/privatekey > /dev/null
wg genkey | tee -a /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey

3. Настраиваем сервер Box A:

    • Создаём конфигурационный файл /etc/wireguard/wg0.conf на Box A (сервер) со следующим содержанием:
[Interface]
PrivateKey = "тут нужно указать приватный ключ сервера из файла /etc/wireguard/privatekey без кавычек"
ListenPort = 21820

[Peer]
PublicKey = "тут нужно указать публичный ключ клиента из файла /etc/wireguard/publickey без кавычек"
AllowedIPs = 10.100.0.0/24
  • Добавляем в конец файла /etc/network/interfaces на сервере Box A следующую секцию:
auto wg0
iface wg0 inet static
    address 10.100.0.1
    netmask 255.255.255.0
    pre-up ip link add $IFACE type wireguard
    pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
    post-down ip link del $IFACE

4. Настраиваем клиент Box B:

  • Создаём конфигурационный файл /etc/wireguard/wg0.conf на  Box B (клиент) со следующим содержанием:
[Interface]
PrivateKey = "тут нужно указать приватный ключ клиента из файла /etc/wireguard/privatekey без кавычек"

[Peer]
PublicKey = "тут нужно указать публичный ключ сервера из файла /etc/wireguard/publickey без кавычек"
Endpoint = 82.19.23.1:21820
AllowedIPs = 10.100.0.0/24
PersistentKeepalive = 25

Примечания:

Endpoint — внешний IP-адрес и порт роутера Router A, в котором нужно пробросить этот порт на ваш сервер Box A. Если вы используете DynDNS или подобный сервис, то можно использовать вместо IP-адреса имя вашего сервера my_domen.dyndns.org и т.д.

PersistentKeepalive — параметр, который указывается в секундах и отвечает за регулярную отправку keepalive пакета, т.к. клиент находится за NAT, а особенность wireguard в его не многословности, он сам не отправляет никаких пакетов и если не указывать данный параметр, то при отсутствии траффика в туннеле сопоставление порта в NAT исчезнет по таймауту и сервер не сможет достучаться до клиента если нужно будет что-то передать.

  • Добавляем в конец файла /etc/network/interfaces на клиенте Box B следующую секцию:
auto wg0
iface wg0 inet static
    address 10.100.0.2
    netmask 255.255.255.0
    pre-up ip link add $IFACE type wireguard
    pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
    post-up ip route add 10.10.0.0/24 via 10.100.0.1
    pre-down ip route delete 10.10.0.0/24 via 10.100.0.1
    post-down ip link del $IFACE

5. Перезагружаем боксы и пользуемся

ЗАМЕЧАНИЕ !

После добавления секций в конец файлов /etc/network/interfaces при изменении настроек сети с помощью OSD интерфейса enigma2 эти секции сотрутся и вам потребуется их добавлять по новой, в последствии мы постараемся добавить заплатку в код enigma2, что бы данные секции не стирались.