Данная статья не ставит целью обходить блокировки. В ней рассказано как объединить устройства в одну виртуальную частную сеть.
Оглавление
- Что такое WireGuard
- Установка WireGuard
- Генерация ключей
- Включение маршрутизации на сервере
- Настройка сервера
- Запуск сервера
- Настройка клиента
- Запуск клиента
- Проверка маршрутизации
- Split Tunnel или Full Tunnel
- DNS через VPS
- Полезные команды диагностики
- WireGuard на нестандартном порту
- WireGuard и NetworkManager
- Если понадобится подключить ещё устройства
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)
Связанные статьи:
- Как подключиться к Tor через OpenVPN (56.3%)
- Какие есть полезные инструменты с интерфейсом командной строки для системных администраторов Linux (50%)
- Анонимизация трафика утилит командной строки с ProxyChains (50%)
- Ошибка «[WARN] Failed to find node for hop #1 of our path. Discarding this circuit. » (РЕШЕНО) (50%)
- Как установить Tor последней версии в Ubuntu (50%)
- Как установить dnscrypt-proxy в Kali Linux (RANDOM - 27.5%)

