Настройка 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.
-
Переходим в каталог с wireguard:
-
Создаем приватный и публичный ключ для текущего сервера:
Для наглядности, ключи будут иметь префикс server- -
Создаем приватный и публичный ключ для сервера, на который будем ходить: Для наглядности, ключи будут иметь префикс home-
-
Запоминаем содержимое ключей, они нам понадобятся ниже. Cодержимое можно показать командой
cat
:
Настройка конфигов¶
Включаем форвардинг¶
Добавляем в файл /etc/sysctl.conf
на хосте с публичным IP (server) следующую строку:
sudo sysctl -p
.
На хосте с публичным IP (server)¶
- Смотрим имя нашего интерфейса и его публичный IP, который ходит в интернет:
Делается это при помощи
ip a
. Запоминаем его, в будущем он нам понадобится. В нашем случае пускай он будет называтьсяens0
- Создаем файл по пути и открываем его на редактирование
/etc/wireguard/wg0.conf
- Вставляем следующее содержимое:
[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 и 2 отсюда.
- Вставляем следующее содержимое:
Примечания:
- Вместо
server
вставляем публичный IPserver
вEndpoint
. - Установив
AllowedIPs
на10.1.1.0/24
, мы используем VPN только для доступа к внутренней сети. Трафик на все остальные IP-адреса/серверы будет по-прежнему идти по обычным каналам.
Запускаем и включаем сервисы¶
Команды выполняем на обоих серверах
- Поднимаем интерфейс
wg0
:wg-quick up wg0
- Включаем автоматическое поднятие сервиса:
systemctl enable wg-quick@wg0.service
- Проверяем доступ с помощью команды
wg
, пытаемся пропинговать друг друга.
Решение проблем¶
Порт Wireguard закрыт фаерволом¶
В качестве порта Wireguard будем использовать 51111 1. Если Iptables, выполняем:
2. Если UFW, выполняем:Включение дебага¶
Если вы используете Linux и ваше ядро поддерживает дебаг вы можете включить дебаг в модуле: