Что такое 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 — это ты, твоя сторона, твое устройство которое хочет подключиться к серверу WireGuard
  • 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

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

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

Проверяем что у нас на сервере nftables или iptables:

sudo systemctl status nftables
sudo systemctl status netfilter-persistent

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

ip route | grep default

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

sudo nano /etc/wireguard/wg0.conf

внутрь файла положи настройки сервера:

[Interface]
Address = 10.0.1.1/24
ListenPort = 51820
PrivateKey = <вставь содержимое /etc/wireguard/server.key>
MTU = 1420

# Включение маршрутизации и NAT для iptables
# Использовать, если у вас работает iptables-legacy:
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, использовать если на сервере работает nftables (iptables-nft):
# 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

не забудь поменять PrivateKey и eth0 на твой интерфейс для выхода в интернет, и раскоментировать нужный PostUp & PostDown

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

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

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

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

Проверка:

sudo wg

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

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 = <вставь содержимое client1.key>
Address = 10.0.1.10/24
DNS = 1.1.1.1
MTU = 1420

[Peer]
PublicKey = <вставь server.pub>
PresharedKey = <вставь client1.psk>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Для сервера опять открываем файл wg0.conf и добавляем устройство:

sudo nano /etc/wireguard/wg0.conf
[Peer]
PublicKey = <вставь client1.pub>
PresharedKey = <вставь 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 я писал в другой статье.


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