Перейти к содержанию

Настройка Wireguard

Здесь будет рассмотрена базовая установка Wireguard для двух Linux хостов, при чем один из этих хостов имеет публичный IP (выступает эндпоинтом).
В текущем кейсе такой клиент будем именовать server. Второй клиент без публичного IP будем именовать home.

Установка Wireguard

Зачастую он устанавливается дефолтным пакетным менеджером в вашей ОС:
1. Debian based: apt install wireguard
2. CentOS based: dnf install wireguard-dkms wireguard-tools
3. Btw I use ArchLinux: pacman -S wireguard-tools
4. SLES: zypper install wireguard-tools

Если нет у вас что-то другое - смело идите на офф.сайт. Там же ссылка для Android, Windows и так далее.

Как правило, хуки вашего пакетного менеджера уже включили модуль ядра. Если нет, можете сделать modprobe wireguard

Генерация ключей

Выполняем на сервере с публичным IP.

  1. Переходим в каталог с wireguard:

    cd /etc/wireguard
    

  2. Создаем приватный и публичный ключ для текущего сервера:
    Для наглядности, ключи будут иметь префикс server-

    wg genkey | tee server-privatekey | wg pubkey > server-publickey
    

  3. Создаем приватный и публичный ключ для сервера, на который будем ходить: Для наглядности, ключи будут иметь префикс home-

    wg genkey | tee home-privatekey | wg pubkey > home-publickey
    

  4. Запоминаем содержимое ключей, они нам понадобятся ниже. Cодержимое можно показать командой cat:

    cat server-privatekey
    cat server-publickey
    cat home-privatekey
    cat home-publickey
    

Настройка конфигов

Включаем форвардинг

Добавляем в файл /etc/sysctl.conf на хосте с публичным IP (server) следующую строку:

net.ipv4.ip_forward = 1
Это включит форвардинг для ipv4. Применяем настройки командой sudo sysctl -p.

На хосте с публичным IP (server)

  1. Смотрим имя нашего интерфейса и его публичный IP, который ходит в интернет: Делается это при помощи ip a. Запоминаем его, в будущем он нам понадобится. В нашем случае пускай он будет называться ens0
  2. Создаем файл по пути и открываем его на редактирование /etc/wireguard/wg0.conf
  3. Вставляем следующее содержимое:
    [Interface]
    Address = 10.1.1.1/24
    ListenPort = 51111
    PrivateKey = <сюда вставляем ключ с server-privatekey>
    PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o <наш сетевой интерфейс> -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o <наш сетевой интерфейс> -j MASQUERADE
    
    [Peer]
    # home
    PublicKey = <сюда вставляем ключ с home-publickey>
    AllowedIPs = 10.1.1.2/32
    

Содержимое блока [Interface]

  • Конфиг начинается с блока [Interface]. Он обозначает блок для настроек локального интерфейса
  • Address - IP адресс локальной сети, по которому сервер будет вас идентифицировать и выпускать в сеть
  • ListenPort указывает, какой порт будем слушать для подключений к этому интерфейсу
  • PrivateKey приватный ключ, никому не показываем. Всегда должен оставаться на стороне сервера
  • PostUp - команды, которые будут выполнены после поднятия интерфейса. Здесь же мы просто принимаем транзитный трафик (FORWARD) и настраиваем маскарадинг на наш сетевой интерфейс
  • PostDown - команды, которые будут выполнены после опускания интерфейса. Здесь мы просто удаляем правила, которые были записаны сверху (ключ -D)

Cодержимое блока [Peer]

  • [Peer] указывает на начало блока для настройки клиента
  • PublicKey - публичный ключ клиента
  • AllowedIPs - согласованный IP клиента, если не будет совпадать - туннель не будет функционировать

На хосте без публичного IP (home)

  1. Выполняем пункты 1 и 2 отсюда.
  2. Вставляем следующее содержимое:
    [Interface]
    Address = 10.1.1.2/24
    PrivateKey = <сюда вставляем ключ с home-privatekey>
    
    [Peer]
    PublicKey = <сюда вставляем ключ с server-publickey>
    AllowedIPs = 10.1.1.0/24
    Endpoint = server:51111
    

Примечания:

  1. Вместо server вставляем публичный IP server в Endpoint.
  2. Установив AllowedIPs на 10.1.1.0/24, мы используем VPN только для доступа к внутренней сети. Трафик на все остальные IP-адреса/серверы будет по-прежнему идти по обычным каналам.

Запускаем и включаем сервисы

Команды выполняем на обоих серверах

  1. Поднимаем интерфейс wg0: wg-quick up wg0
  2. Включаем автоматическое поднятие сервиса: systemctl enable wg-quick@wg0.service
  3. Проверяем доступ с помощью команды wg, пытаемся пропинговать друг друга.

Решение проблем

Порт Wireguard закрыт фаерволом

В качестве порта Wireguard будем использовать 51111 1. Если Iptables, выполняем:

sudo iptables -I INPUT -p udp --dport 51111 -j ACCEPT
2. Если UFW, выполняем:
ufw allow 51111/udp

Включение дебага

Если вы используете Linux и ваше ядро поддерживает дебаг вы можете включить дебаг в модуле:

modprobe wireguard && echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control