Что такое 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 будет использоваться только для доступа к другим устройствам подключенным к этим сетям. А остальной трафик будет идти через обычный интернет.
- На сервере — говорит какие IP-адреса считаются принадлежащими этому клиенту.
- 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 я писал в другой статье.
Читайте также:
- Устанавливаем самый быстрый WireGuard VPN Server
- PiKVM — Делаем KVM на основе Raspberry Pi 4
- Поднимаем Mailcow на Centos 9
- Debian ssh root — Permission denied, please try again.
- Автоматически отправляем Mailcow backup по FTP