zaLinux.ru

Как настроить WireGuard для работы с IPv4 и IPv6 (современный аналог OpenVPN)

Данная статья не ставит целью обходить блокировки. В ней рассказано как объединить устройства в одну виртуальную частную сеть.

Оглавление

  1. Что такое WireGuard
  2. Установка WireGuard
  3. Генерация ключей
  4. Включение маршрутизации на сервере
  5. Настройка сервера
  6. Запуск сервера
  7. Настройка клиента
  8. Запуск клиента
  9. Проверка маршрутизации
  10. Split Tunnel или Full Tunnel
  11.  DNS через VPS
  12. Полезные команды диагностики
  13. WireGuard на нестандартном порту
  14. WireGuard и NetworkManager
  15. Если понадобится подключить ещё устройства

1. Что такое WireGuard

WireGuard — это быстрый, современный и безопасный протокол VPN с открытым исходным кодом, работающий на уровне ядра Linux

WireGuard фактически стал современным стандартом.

Плюсы:

  • намного проще настройки
  • выше производительность
  • меньше задержки
  • кодовая база в десятки раз меньше OpenVPN
  • встроен в ядро Linux
  • меньше потребление CPU
  • быстрее устанавливает соединение

Минусы:

  • хуже маскируется под обычный HTTPS-трафик
  • в некоторых странах и сетях может блокироваться легче OpenVPN

То есть WireGuard отлично подходит для создания виртуальных частных сетей VPN которые применяются по своему прямому назначению — объединение устройств физически находящихся в разных локальных сетях в одну локальную сеть.

Что же касается другого популярного применения VPN (обход блокировок), то WireGuard для этого не подходит — трафик WireGuard довольно легко определяется и блокируется.

Для обхода блокировок вместо WireGuard рекомендуется использовать Amnezia VPN который основан на WireGuard.

Также стоит упомянуть ещё один продукт основанный на WireGuard — это Tailscale (Headscale).

2. Установка WireGuard

В этом примере я использую следующую конфигурацию: сервер на VPS (Arch Linux), клиент на домашнем компьютере (Arch Linux).

И клиент и сервер подключены к IPv4 и IPv6 сетям. У сервера есть белые IPv4 и IPv6 адреса.

Я использую этот VPS (отличное соотношение цены и качества).

Но WireGuard работает на многих дистрибутивах Linux, а также на Windows. Команду для установки в вашем дистрибутиве или скачать исполнимый файл вы можете на следующей официальной странице: https://www.wireguard.com/install/

Поскольку в архитектуре WireGuard нет жёсткого разделения на «сервер» и «клиент» (все участники сети технически являются равноправными узлами — Peers), официальное приложение выполняет обе роли одновременно. То есть вам не нужно искать специальную версию для клиента или для сервера.

  • Установка клиента/сервера WireGuard в Debian, Linux Mint, Kali Linux, Ubuntu:
sudo apt update
sudo apt install wireguard
  • Установка клиента/сервера WireGuard в Arch Linux, Manjaro, BlackArch и их производные:
sudo pacman -S wireguard-tools

После установки вы можете проверить что программа доступна:

wg --version

3. Генерация ключей

Сервер

Создаём каталог:

sudo mkdir -m 700 /etc/wireguard
cd /etc/wireguard

Генерируем ключи:

wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key

Посмотреть:

sudo cat server_private.key
sudo cat server_public.key

Клиент

sudo mkdir -m 700 /etc/wireguard
cd /etc/wireguard
wg genkey | sudo tee client_private.key | wg pubkey | sudo tee client_public.key

Записать значения:

cat client_private.key
cat client_public.key

4. Включение маршрутизации на сервере

Открываем:

sudo nano /etc/sysctl.d/99-wireguard.conf

Добавляем:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Применяем:

sudo sysctl --system

Проверяем:

sysctl net.ipv4.ip_forward
sysctl net.ipv6.conf.all.forwarding

Должно быть:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

5. Настройка сервера

Создаём:

sudo nano /etc/wireguard/wg0.conf

Пример:

[Interface]
Address = 10.10.10.1/24, fd10:10:10::1/64
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.10.10.2/32, fd10:10:10::2/128

Замените на реальные значения:

  • SERVER_PRIVATE_KEY
  • CLIENT_PUBLIC_KEY

Создаём:

sudo nano /etc/nftables.conf

Пример:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {

    chain input {
        type filter hook input priority 0;
        policy drop;

        # Loopback
        iifname "lo" accept

        # Уже установленные соединения
        ct state established,related accept

        # ICMP / ICMPv6
        ip protocol icmp accept
        meta l4proto ipv6-icmp accept

        # WireGuard — это порт по умолчанию, можно поменять, но в конфигурации на сервере и клиенте тоже нужно менять
        udp dport 51820 accept

        # Разрешаем стандартный порт SSH — если нужно
        tcp dport ssh accept

        # Разрешаем нестандартные административные порты — если нужно
        #tcp dport { 12345, 54321 } accept

        # Веб-сервер: HTTP / HTTPS — если нужно
        #tcp dport { 80, 443 } accept
    }

    chain forward {
        type filter hook forward priority 0;
        policy drop;

        # Уже установленные соединения
        ct state established,related accept

        # Трафик через WireGuard
        iifname "wg0" accept
        oifname "wg0" accept
    }
}

table inet nat {
    chain postrouting {
        type nat hook postrouting priority srcnat;
        iifname "wg0" oifname "ens3" masquerade
    }
}

где:

  • ens3 — внешний интерфейс VPS (на других дистрибутивах может отличаться);
  • wg0 — интерфейс WireGuard.

Узнать имя внешнего интерфейса:

ip route get 1.1.1.1

или

ip route

Например:

default via 1.2.3.1 dev ens3

или

default via 1.2.3.1 dev eth0

Именно этот интерфейс указывается в правиле masquerade.

Также проверьте, включён ли сервис nftables:

sudo systemctl enable --now nftables

и что правила реально загружены:

sudo nft list ruleset

6. Запуск сервера

sudo systemctl enable --now wg-quick@wg0

Проверка:

sudo wg

Ожидается примерно:

interface: wg0
  public key: ...
  private key: (hidden)
  listening port: 51820

peer: ...
  allowed ips: 10.10.10.2/32, fd10:10:10::2/128

7. Настройка клиента

Создаём:

sudo nano /etc/wireguard/wg0.conf

Пример:

[Interface]
Address = 10.10.10.2/24
PrivateKey = CLIENT_PRIVATE_KEY

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = YOUR_SERVER_IP:51820

AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Вариант для IPv6:

[Interface]
Address = 10.10.10.2/24, fd10:10:10::2/64
PrivateKey = CLIENT_PRIVATE_KEY

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = [YOUR_SERVER_IPv6]:51820

AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

Заменить:

  • CLIENT_PRIVATE_KEY
  • SERVER_PUBLIC_KEY
  • YOUR_SERVER_IP или [YOUR_SERVER_IPv6]. Обратите внимание, что квадратные скобки для IPv6 это не обозначение заполнителя, это буквальные квадратные скобки в которые нужно помещать IPv6 адрес.

8. Запуск клиента

Если вы хотите, чтобы клиент сразу после загрузки компьютера подключался к VPN, то выполните следующую команду:

sudo systemctl enable --now wg-quick@wg0

Если вы хотите управлять клиентом вручную, то для подключения к VPN используйте команду:

sudo wg-quick up wg0

Проверить:

sudo wg

Должно появиться:

sudo wg
interface: wg0
  public key: ...
  private key: (hidden)
  listening port: 51820
  fwmark: 0xca6c

peer: ...
  endpoint: ...
  allowed ips: 0.0.0.0/0, ::/0
  latest handshake: 6 seconds ago
  transfer: 167.83 KiB received, 47.84 KiB sent
  persistent keepalive: every 25 seconds

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

sudo wg-quick down wg0

9. Проверка маршрутизации

На клиенте:

curl suip.biz/ip/

Должен отображаться IP VPS.

10. Split Tunnel или Full Tunnel

Сейчас используется:

AllowedIPs = 0.0.0.0/0

Это Full Tunnel — весь трафик идёт через VPS.

Если нужен только доступ к VPN-сети, а выход в остальной интернет будет выполняться не через VPN, а обычным способом с показом реального IP клиента, то на клиенте в файле /etc/wireguard/wg0.conf используйте:

AllowedIPs = 10.10.10.0/24

11. DNS через VPS

Чтобы избежать DNS-утечек, на клиенте можно добавить:

[Interface]
Address = 10.10.10.2/24
PrivateKey = CLIENT_PRIVATE_KEY

DNS = 1.1.1.1

или:

DNS = 8.8.8.8

или свой DNS-сервер на VPS.

12. Полезные команды диагностики

Состояние туннеля:

sudo wg show

Логи:

journalctl -u wg-quick@wg0 -f

Перезапуск:

sudo systemctl restart wg-quick@wg0

Отключение:

sudo wg-quick down wg0

Поднятие вручную:

sudo wg-quick up wg0

13. WireGuard на нестандартном порту

По умолчанию WireGuard работает на порту UDP 51820. Вы без проблем можете поменять порт на любой другой нестандартный. Для этого нужно значение 51820 поменять в двух файлах не сервере:

  • /etc/wireguard/wg0.conf
  • /etc/nftables.conf

А также в одном файле на клиенте:

  • /etc/wireguard/wg0.conf

14. WireGuard и NetworkManager

При запуске WireGuard, в NetworkManager появляется пункт для отключения WireGuard и если вы им воспользуетесь, то второй раз WireGuard вы скорее всего не запустите из-за ошибки «wg-quick: `wg0' already exists». То есть это разные механизмы запуска и остановки WireGuard и их нежелательно смешивать.

Тем не менее вы можете подружить WireGuard и NetworkManager правильным способом.

Для начала импортируйте настройки — это реально проще сделать в командной строке чем заполнять вручную:

sudo nmcli connection import type wireguard file /etc/wireguard/wg0.conf

Теперь вы можете включать WireGuard и NetworkManager:

Теперь отключение WireGuard и NetworkManager не будет вызывать проблем с последующими подключениями:

Вы также можете управлять подключениями в командной строке.

  • Включить VPN:
nmcli connection up wg0
  • Выключить VPN:
nmcli connection down wg0
  • Проверить статус:
nmcli connection show --active

15. Если понадобится подключить ещё устройства

На новом устройстве настройте его собственный приватный ключ, публичный ключ сервера и Address = 10.10.10.3/24. Не используйте одну и ту же клиентскую пару ключей на нескольких устройствах.

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

[Interface]
Address = 10.10.10.1/24, fd10:10:10::1/64
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

# Клиент №1 (например, ваш домашний ПК)
[Peer]
PublicKey = CLIENT_1_PUBLIC_KEY
AllowedIPs = 10.10.10.2/32, fd10:10:10::2/128

# Клиент №2 (например, ваш смартфон)
[Peer]
PublicKey = CLIENT_2_PUBLIC_KEY
AllowedIPs = 10.10.10.3/32, fd10:10:10::3/128

# Клиент №3 (например, рабочий ноутбук)
[Peer]
PublicKey = CLIENT_3_PUBLIC_KEY
AllowedIPs = 10.10.10.4/32, fd10:10:10::4/128

Важные правила при добавлении клиентов:

  • Уникальные IP-адреса: В поле AllowedIPs на сервере для каждого клиента должен быть строго свой уникальный IP-адрес с маской /32 (для IPv4) и /128 (для IPv6). Пересекаться они не должны.
  • Перезапуск интерфейса: После того как вы отредактировали файл конфигурации на сервере, правила не применятся автоматически. Чтобы не перезапускать интерфейс целиком и не рвать соединение у текущих пользователей, можно обновить конфигурацию «на лету» командой:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *