Что такое WireGuard - полное, подробное описание и настройка | Wiki | PWODEV
, 04.06.2025 13:12

Что такое WireGuard — полное, подробное описание и настройка


Сегодня я тебе объясню, как настраивать VPN — и не просто настраивать, а понимать, что ты делаешь!

Есть куча разных протоколов, OpenVPN считается самым популярным, но мы же не идём слепо за массой — нам важны скорость, качество и современность. Мы не ищем лёгких путей, потому что нет ничего невозможного, ну и мы не такие как все, чтобы юзать то, что юзает большинство.

Поэтому самый лучший и современный VPN — это WireGuard. Он супер быстрый, не режет скорость, и при этом максимально простой в настройке.

В этой статье я покажу, как настроить WireGuard с нуля, объясню каждый термин, чтобы ты не просто бездумно копипастил, а понимал каждую строчку.

Поехали!

Что такое WireGuard простыми словами

WireGuard — это peer-to-peer VPN, работает просто, быстро и стабильно. Он встроен в ядро Linux, использует самую новую криптографию, и запускается за секунды. В WireGuard нет клиента и сервера в классическом смысле — все равны. Каждое устройство может быть как клиентом так и сервером, отличает кто есть кто только файл конфигурации. В настройках сервер это Peer и клиент это Interface.

WireGuard работает через ключи, у каждого участника есть Private Key и Public Key и конфиге указываются ключи друг друга.

Основные фишки WireGuard:

  • Максимум скорости — в 2–3 раза быстрее OpenVPN, нет лишней нагрузки, всё работает на уровне ядра
  • Никаких сложных настроек — всё максимально прозрачно 1 конфиг = 1 файл
  • Безопасность на уровне — всё шифруется по-современному, и без старья вроде TLS, как у OpenVPN

Настройки WireGuard?

Структура работы VPN WireGuard делится всего на 2 типа секций Interface и Peer.

  • Interface — это всегда своя сторона, текущее устройство на котором заполняется файл.
  • Peer — а это всегда удаленная сторона.

Тоесть в файле на сервере Interface это сам сервер а Peer это удаленные клиенты которые будут подсоеденяться к серверу. А у клиента Interface это сам клиент, а Peer это будет удаленный сервер к которому клиент хочет подсоедениться.

[interface] имеет следующие параметры:

  • PrivateKey(сервер* и клиент*) — Приватный ключ текущего устройства. НИКОГДА не шарится, всегда пишется в настройках interface, только на твоем текущем устройстве.
  • Address(сервер* и клиент*) — IP-адрес по которому устройство будет отзываться в VPN сети. Да WireGuard не имеет DHCP для VPN все IP нужно прописывать всегда для сервера и каждого клиента вручную, конечно каждое устройство должно иметь уникальный IP. Пример 10.0.1.1/24 или 10.0.1.2/24 или без подсети.
  • ListenPort(сервер*) — Обычно WireGuard слушает UDP 51820 порт, но можно любой написать.
  • DNS(только на клиентах) — DNS-сервер, который будет использовать клиент при подключении к интернету. Например 1.1.1.1, 10.0.0.1 или 8.8.8.8, 8.8.4.4. Но имеет смысл только в связке с AllowedIPs = 0.0.0.0/0 или в AllowedIPs должен быть IP этого DNS.
  • MTU(сервер и клиент) — Максимальный размер пакета (обычно 1420)
  • PreUp / PostUp(сервер и клиент) — Команда, которая выполнится при старте интерфейса, например, iptables или ip route
  • PreDown / PostDown(сервер и клиент) — Команда, которая выполнится при остановке. Чистка iptables, маршрутов и т.п.
  • Table(сервер и клиент) — Номер таблицы маршрутизации или off — если не хочешь, чтобы WireGuard сам добавлял маршруты.

[peer] имеет следующие параметры:

  • PublicKey(сервер* и клиент*) — Публичный ключ сгенерированный второй стороной будь то клиент или сервер.
  • PresharedKey — Это один дополнительный ключ для повышения безопасности, пишется для каждой пары (сервер+клиент) свой. Это не обязательно, но если используем, то писать надо один и тот же ключ и на клиенте и на сервере для каждого пира свой. Тут нет публичного или приватного. Команда для генерации ключа — wg genpsk
  • AllowedIPs(сервер* и клиент*) — Очень важный параметр. Тут пишем IP-адреса, через запятую если несколько, которые разрешены от/до этого пира. Имеет разное поведение в настройках сервера и клиента.
    • На сервере — говорит какие IP-адреса считаются принадлежащими этому клиенту.
      Обычно указывают IP клиента из VPN-сети (например, 10.0.1.10/32), тот же IP что и в его interface->Address, только подсеть не 24 а 32 чтобы чтобы указать что клиент получатель трафика только один.
      Но если клиент это роутер и дальше у него много клиентов, то в таком случае допускается подсеть, например 10.0.1.0/24.
    • На клиенте — говорит, какой трафик нужно направлять в VPN туннель к серверу.
      • 0.0.0.0/0 — говорит что весь трафик клиента будет отправляться через VPN сеть WireGuard. (Full Tunnel). Если хочешь полноценный VPN то используй именно этот параметр + DNS в Interface, чтобы интернет работал.
      • 10.0.1.0/24, 192.168.1.0/24, 10.0.0.0/24 — если написать подсети, то VPN будет использоваться только для доступа к другим устройствам подключенным к этим сетям. А остальной трафик будет идти через обычный интернет.
  • Endpoint(клиент*) — [IP-адрес или домен]:порт, куда подключаться. Пример vpn.domain.com:51820.
  • PersistentKeepalive(клиент*) — клиент будет периодически “стучаться”, чтобы не терять соединение за NAT. Обычно — 25

Примеры конфигурации WireGuard сервера и клиентов.

wg0.conf — конфиг WireGuard-сервера:

[Interface]
PrivateKey = SERVER_PRIVATE_KEY
Address = 10.0.1.1/24
ListenPort = 51820
MTU = 1420
# Разрешаем маршрутизацию для систем с iptables:
PostUp = sysctl -w net.ipv4.ip_forward=1; \
         iptables -A FORWARD -i wg0 -j ACCEPT; \
         iptables -A FORWARD -o wg0 -j ACCEPT; \
         iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PostDown = sysctl -w net.ipv4.ip_forward=0; \
           iptables -D FORWARD -i wg0 -j ACCEPT; \
           iptables -D FORWARD -o wg0 -j ACCEPT; \
           iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Альтернатива для систем с nftables:
# PostUp = sysctl -w net.ipv4.ip_forward=1; \
#          sysctl -w net.ipv6.conf.all.forwarding=1; \
#          nft add table inet wireguard-wg0; \
#          nft add chain inet wireguard-wg0 PREROUTING { type nat hook prerouting priority 0\; }; \
#          nft add chain inet wireguard-wg0 POSTROUTING { type nat hook postrouting priority 100\; }; \
#          nft add rule inet wireguard-wg0 POSTROUTING ip saddr 10.0.1.0/24 oifname eth0 masquerade; \
#          nft add rule inet wireguard-wg0 POSTROUTING ip6 saddr fd00::/8 oifname eth0 masquerade

# PostDown = sysctl -w net.ipv4.ip_forward=0; \
#            sysctl -w net.ipv6.conf.all.forwarding=0; \
#            nft delete table inet wireguard-wg0

[Peer]
# Клиент A
PublicKey = CLIENT_A_PUBLIC_KEY
PresharedKey = CLIENT_A_PRESHARED_KEY
AllowedIPs = 10.0.1.10/32

[Peer]
# Клиент B
PublicKey = CLIENT_B_PUBLIC_KEY
PresharedKey = CLIENT_B_PRESHARED_KEY
AllowedIPs = 10.0.1.11/32

Конфигурация клиента A (client-a.conf)

[Interface]
PrivateKey = CLIENT_A_PRIVATE_KEY
Address = 10.0.1.10/24
DNS = 8.8.8.8, 8.8.4.4
MTU = 1420

[Peer]
PublicKey = SERVER_PUBLIC_KEY
PresharedKey = CLIENT_A_PRESHARED_KEY
Endpoint = vpn.domain.com:51820 
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Конфигурация клиента B (client-b.conf)

[Interface]
PrivateKey = CLIENT_B_PRIVATE_KEY
Address = 10.0.1.11/24
DNS = 8.8.8.8, 8.8.4.4
MTU = 1420

[Peer]
PublicKey = SERVER_PUBLIC_KEY
PresharedKey = CLIENT_B_PRESHARED_KEY
Endpoint = vpn.domain.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Команды для быстрой установки WireGuard сервера

Установка WireGuard на сервер:

sudo apt install -y wireguard wireguard-tools

Создание ключей на сервере:

umask 077
wg genkey | tee /etc/wireguard/server.key | wg pubkey > /etc/wireguard/server.pub

Дальше проверяем на сервере какой у нас интерфейс для доступа к интернету обычно eth0, но нужно проверить.

ip route | grep default
ip -br a

дальше сохраняем значение чтобы потом вставить ниже в файл

cat /etc/wireguard/server.key

Создание конфигурации сервера:

sudo nano /etc/wireguard/wg0.conf

внутрь файла положи настройки сервера, где нужно поменять правильные IP где 10.0.1.0/24 это сеть VPN а 192.168.0.0/24 локальная сеть сервера, PrivateKey и <WAN_IF> — заменить на что-то типа ens18, eth0

[Interface]
Address = 10.0.1.1/24
ListenPort = 51820
PrivateKey = <вставь что вернет - cat /etc/wireguard/server.key>

PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o ens18 -j MASQUERADE; iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -d 192.168.0.0/24 -o ens19 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.0.1.0/24 -o ens18 -j MASQUERADE; iptables -t nat -D POSTROUTING -s 10.0.1.0/24 -d 192.168.0.0/24 -o ens19 -j MASQUERADE

не забудь поменять IP, PrivateKey и eth0 на твой интерфейс <WAN_IF> для выхода в интернет

Включить IP-форвардинг

echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system

Если есть firewall то нужно еще порт открыть:

sudo sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
sudo ufw reload
cat /etc/default/ufw | grep DEFAULT_FORWARD_POLICY
sudo ufw allow 51820/udp
ufw status

Запуск и автозагрузка

sudo systemctl enable --now wg-quick@wg0

Проверка:

sudo wg

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

sudo mkdir -p /etc/wireguard/clients
sudo chmod 700 /etc/wireguard/clients
umask 077
wg genkey | tee /etc/wireguard/clients/client1.key | wg pubkey > /etc/wireguard/clients/client1.pub
wg genpsk > /etc/wireguard/clients/client1.psk

Итак, у нас есть уже ключи, мы их либо сгенерировали на сервере или в самом клиенте, теперь составим файл конфигурации клиента для подключения к нашему серверу:

[Interface]
PrivateKey = <вставь что вернет - cat /etc/wireguard/clients/client1.key>
Address = 10.0.1.10/24
DNS = 1.1.1.1
MTU = 1420PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.10.251.0/24 -o ens18 -j MASQUERADE; iptables -t nat -A POSTROUTING -s 10.10.251.0/24 -d 192.168.0.0/24 -o ens19 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.10.251.0/24 -o ens18 -j MASQUERADE; iptables -t nat -D POSTROUTING -s 10.10.251.0/24 -d 192.168.0.0/24 -o ens19 -j MASQUERADE

[Peer]
PublicKey = <вставь что вернет - cat /etc/wireguard/server.pub>
PresharedKey = <вставь что вернет - cat /etc/wireguard/clients/client1.psk>
AllowedIPs = 0.0.0.0/0
Endpoint = vpn.example.com:51820
PersistentKeepalive = 25

Это настройки именно на стороне клиента, теперь надо сделать так чтобы сервер знал что этот клиент будет подключаться, для этого снова открываем файл wg0.conf и добавляем устройство которое может подключаться:

sudo nano /etc/wireguard/wg0.conf
[Peer]
PublicKey = <вставь что вернет - cat /etc/wireguard/client1.pub>
PresharedKey = <вставь что вернет - cat /etc/wireguard/client1.psk>
AllowedIPs = 10.0.1.10/32

Дальше чтобы применить изменения надо перезагрузить сервер WireGuard:

sudo systemctl restart wg-quick@wg0

Можно это же сделать и не вручную а с помощью специальной команды, она позволяет добавить в конфиг сервера еще один Peer.

sudo wg set wg0 \
  peer <КЛИЕНТ_PUBKEY> \
  preshared-key <(cat client1.psk) \
  allowed-ips 10.0.1.10/32

Для простоты есть генератор QR кода для клиента:

sudo apt install qrencode
qrencode -t ansiutf8 < client1.conf

Быстрый автоматический способ установки WireGuard я писал в другой статье.


Добавить комментарий