Свой WireGuard за десять минут
WireGuard живёт в ядре Linux с версии 5.6, конфигурация умещается в пятнадцать строк, а накладные расходы на шифрование заметно ниже, чем у OpenVPN. Для личного или корпоративного использования это лучший выбор по умолчанию.
1. Установка и ключи
apt update && apt install -y wireguard
umask 077
wg genkey | tee /etc/wireguard/server.key | wg pubkey > /etc/wireguard/server.pub
umask 077 — не украшение: приватный ключ, доступный на чтение другим пользователям системы, обесценивает всю конструкцию.
2. Конфигурация сервера
Файл /etc/wireguard/wg0.conf:
[Interface]
Address = 10.8.0.1/24, fd42:42::1/64
ListenPort = 51820
PrivateKey = <содержимое server.key>
PostUp = nft add table ip nat; \
nft 'add chain ip nat postrouting { type nat hook postrouting priority 100 ; }'; \
nft add rule ip nat postrouting oifname "ens3" masquerade
PostDown = nft delete table ip nat
[Peer]
# ноутбук
PublicKey = <публичный ключ клиента>
AllowedIPs = 10.8.0.2/32, fd42:42::2/128
Имя внешнего интерфейса уточните командой ip -br a — на наших образах это обычно ens3, реже eth0.
3. Включаем маршрутизацию
cat > /etc/sysctl.d/99-wg.conf <<'EOF'
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
sysctl --system
И разрешаем порт в файрволе (см. nftables):
udp dport 51820 accept
4. Запуск
systemctl enable --now wg-quick@wg0
wg show
Вывод wg show покажет интерфейс, порт и список пиров. Пустая строка latest handshake означает, что клиент ещё не подключался.
5. Конфигурация клиента
[Interface]
PrivateKey = <приватный ключ клиента>
Address = 10.8.0.2/32, fd42:42::2/128
DNS = 9.9.9.9, 149.112.112.112
[Peer]
PublicKey = <публичный ключ сервера>
Endpoint = 92.223.14.87:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
AllowedIPs = 0.0.0.0/0, ::/0 заворачивает весь трафик в туннель. Если нужен доступ только к внутренней сети — укажите конкретную подсеть, например 10.8.0.0/24.
PersistentKeepalive = 25 обязателен, когда клиент за NAT: без него запись в таблице трансляции роутера протухает, и входящие пакеты перестают доходить.
Не забудьте про DNS: без него запросы уйдут к провайдерскому резолверу мимо туннеля, и смысл теряется.
6. Подключение по QR-коду
Для телефона удобнее не копировать текст, а отсканировать:
apt install qrencode
qrencode -t ansiutf8 < /etc/wireguard/clients/phone.conf
7. Про MTU
Классический симптом неверного MTU: туннель поднялся, ping работает, но крупные страницы не открываются, а ssh «зависает» на выводе. Заголовок WireGuard занимает 60 байт для IPv4 и 80 для IPv6.
ping -M do -s 1372 -c 3 1.1.1.1 # подбираем максимальный проходящий размер
К найденному значению прибавьте 28 (заголовки ICMP и IP) — получите MTU канала, вычтите 60 — получите MTU для интерфейса. При работе через мобильного оператора рабочее значение обычно 1280–1380:
[Interface]
MTU = 1360
8. Добавление клиентов
Каждому устройству — свой ключ и свой адрес. Не используйте одну конфигурацию на двух устройствах: при одновременном подключении оба будут периодически терять связь.
wg genkey | tee client2.key | wg pubkey > client2.pub
wg set wg0 peer $(cat client2.pub) allowed-ips 10.8.0.3/32
wg-quick save wg0 # сохранить изменения в конфиг
9. Типовые ошибки
- Handshake не проходит. Проверьте, что порт открыт в nftables и что в конфиге клиента указан правильный публичный ключ сервера (легко перепутать с приватным).
- Туннель поднялся, интернета нет. Не включён
ip_forwardили не работает masquerade. Проверьтеnft list table ip nat. - Работает, но медленно. Почти всегда MTU. См. раздел 7.
- Отваливается через несколько минут. Нет
PersistentKeepaliveна клиенте за NAT. - Утечка DNS. Не указан параметр
DNSв секции Interface клиента.
Правовая сторона
Личный и корпоративный VPN разрешён на всех наших локациях без согласования. Публичный VPN-сервис с массовой регистрацией пользователей требует предварительного согласования — такие проекты генерируют поток жалоб, который бьёт по репутации всей подсети. Подробности — в правилах использования.