Найти тему
Affect-X

Заметки СисАдмина о быстром и безопасном VPN на основе WireGuard в Debian 9-10

Оглавление

Данная статья, написана исключительно, как личные записи системного администратора. Чтобы в дальнейшем, можно было обратиться к данной статье и избежать подводных камней в развертывании и настройке VPN-сервера на основе WireGuard. Сразу скажу, данная статья, не несет обучающий смысл. Это скорей вспомогательный манул, в котором учтены все, те моменты и задачи, с которыми у меня возникли трудности, и я их решил.

WireGuard в Debian 9 - 10
WireGuard в Debian 9 - 10

И на основе этого, сделал свои заметки, чтобы если вдруг забуду что-то, то можно было всегда посмотреть и освежить память. Потому что, искать ответы из разных источников необходимые ответы, это очень большая трата времени, а время, это деньги. Так что может мои записи помогут не только новичкам, но и более опытным специалистам.

Для новичков: Никогда не работайте на сервере, напрямую под ROOT пользователем. Всегда создавайте обычного пользователя и начинайте сессию именно из под обычного пользователя. А уже из командной строки, переходите под управление с правами ROOT пользователя и выполняйте необходимые команды.

В августе прошлого года, на заказ, я создавал скрипт для статьи, по развертыванию собственного ВПН сервера по скоростному протоколу IKEv2, на безе дистрибутива Debian 9. И там, подробно написано, как создавать нового пользователя. cpa.rip

Этап 1. Подготовка сервера и установка необходимых пакетов.

Для начала добавляем репозиторий.

Команда для Debian 9.x (Stretch):

echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable-wireguard.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' > /etc/apt/preferences.d/limit-unstable
apt-get update

Команда для Debian 10.x (Buster):

echo "deb http://deb.debian.org/debian buster-backports main non-free" > /etc/apt/sources.list.d/backports -wireguard.list
apt-get update

Чтобы в дальнейшем, при запуске, Wireguard не ругался логами и нормально запустился.

systemctl status wg-quick@wg0.service
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/wg-quick@.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2022-03-29 18:05:11 MSK; 3min 26s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 786 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=1/FAILURE)
Main PID: 786 (code=exited, status=1/FAILURE)
март 29 18:05:11 Server systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
март 29 18:05:11 Server wg-quick[786]: wg-quick: `wg0' already exists
март 29 18:05:11 Server systemd[1]: wg-quick@wg0.service: Main process exited, code=exited, status=1/FAILURE
март 29 18:05:11 Server systemd[1]: wg-quick@wg0.service: Failed with result 'exit-code'.
март 29 18:05:11 Server systemd[1]: Failed to start WireGuard via wg-quick(8) for wg0.

Рекомендую сразу установить заголовки для вашего ядра. Для этого, как для Debian 9, так и для Debian 10, выполним команду:

apt-get install linux-headers-$(uname -r|sed 's/[^-]*-[^-]*-//')

А затем перезагрузить сервер, командой:

reboot

Затем установите Wireguard:

apt-get install wireguard

Всё, на этом, установка окончена. Теперь осталось только настроить и запустить сам Wireguard.

Этап 2. Создание конфигурационных файлов и запуск Wireguard.

Перед тем как начать работу с файлами, рекомендую перейти в каталог самого Wireguard.

Для этого, выполняем команду:

cd /etc/wireguqrd/

Затем, чтобы в дальнейшем, во время запуска, Wireguard опять же не ругался.

Установим в текущем каталоге маску, на создание файлов:

Umasck 077 .

Точка, обязательно нужна, именно она указывает, что маска будет работать только в текущем каталоге, в котором вы находитесь. И как мы помним, командой выше, мы перешли в каталог wireguqrd.

Далее, по стандарту. Командой, создаем ключи:

wg genkey | tee /etc/wireguard/wg-private.key | wg pubkey > /etc/wireguard/wg-public.key

Имя файлов с ключами, не обязательно должно быть wg-private.key и wg-public.key.

Они могут называться wgprivatkey и wgpubkey, главное чтобы вы знали, где приватный ключ, а где публичный. Это важно.

Теперь пора создать сам конфигурационный файл Wireguard, который является основным, в работе нашего VPN.

Создаем файл wg0.conf:

touch wg0.conf

И опять же, имя файла может быть и другим, но его расширение должно быть именно .conf. То-есть имя может быть wgserv0.conf или vpnserv1.conf. И так же нужно учитывать, что будет зависеть и имя VPN сетевого интерфейса, от имени файла, при запуска Wireguard.

Когда создали файл wg0.conf, пора внести в него конфигурации. Для этого нам поможет команда nano:

nano wg0.conf

И добавляем следующие параметры.

[Interface]
PrivateKey = SERVER PRIVATE KEY
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
[Peer]
PublicKey = CLIENT PUBLIC KEY
AllowedIPs = 10.0.0.2/32

SERVER PRIVATE KEYтут, вставляем приватный ключ из файла wg-private.key, который создавали ранее.

CLIENT PUBLIC KEYа здесь, вставляем публичный ключ из файла wgc-public.key на стороне клиента, который должны создать во время настройки клиента.

Чтобы посмотреть содержимое файлов, воспользуемся командой:

cat wg-private.key

и

cat wg-public.key

Вывод и является ключами, которые нужно скопировать и вставить в параметры выше.

Аналогичные операции проводим, на стороне клиента. Лишь с некоторыми отличиями в конфигурационном файле. Пусть на клиенте он называется wgc0.conf

Содержание файла wgc0.conf

[Interface]
PrivateKey = CLIENT PRIVATE KEY
Address = 10.0.0.2/32
[Peer]
PublicKey = SERVER PUBLIC KEY
Endpoint = pub.ip.server:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

Для того чтобы весь трафик клиента шел через VPN, нужно немного изменить параметры файла wgc0.conf

[Interface]
PrivateKey = CLIENT PRIVATE KEY
Address = 10.0.0.2/32
DNS = 8.8.8.8
[Peer]
PublicKey = SERVER PUBLIC KEY
Endpoint = pub.ip.server:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

CLIENT PRIVATE KEYтут, вставляем приватный ключ клиента из файла wgc-private.key, который создавали ранее, по аналогии с серверным.

SERVER PUBLIC KEYа здесь, вставляем публичный ключ из файла wg-public.key, который создавали ранее, на стороне сервера.

AllowedIPs = 0.0.0.0/0 – Как раз этот параметр отвечает за то, чтобы вся сеть клиента, шла через VPN.

PersistentKeepalive = 25 – это интервал рукопожатия в секундах, которое не дает потерять связь с клиентом.

Этап 3. Делаем сервер публичным.

Чтобы трафик начал ходить между сервером и клиентом, на сервере нужно включит forward

Вводим следующие команды:

echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl –p

А затем:

nano /etc/sysctl.conf

Там находим net.ipv4.ip_forward = 0, заменяем на net.ipv4.ip_forward = 1

Этап 4. Запуск сервера и клиента.

Это последний этап и если ранее, всё сделали правильно, то всё пройдет гладко.

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

systemctl enable wg-quick@wg0

И стартуем.

systemctl start wg-quick@wg0

или

wg-quick up wg0

По аналогии, запускается и клиент.

Дополнение

  • В некоторых случиях, на сервере, нужно добавить правила в файрвол.
/sbin/iptables -A FORWARD -i wg0 -j ACCEPT
/sbin/iptables -A FORWARD -o wg0 -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Для облегчения настройки клиента на Android, можно создать ключи и конфигурационный файл на стороне сервера, но в отдельном для этого каталоге.

  • А потом просто, через генератор QR-кода, прямо в командной строке, передаем конфигурацию, в клиент на Android.
apt install qrencode
qrencode -t ansiutf8 < wg-droid.conf

Заключение.

  • Опираясь на данные заметки, без проблем запускаем WireGuard на Debian 9-10
  • За счет добавления репозитория, мы получили доступ к пакету WireGuard.
  • А установив заголовки ядра, мы исключили ругательства WireGuard во время запуска.
  • И немало важно, что добавили параметр PersistentKeepalive = 25 поддержания соединения, а конфигурационный файл клиента.