Данная статья, написана исключительно, как личные записи системного администратора. Чтобы в дальнейшем, можно было обратиться к данной статье и избежать подводных камней в развертывании и настройке VPN-сервера на основе WireGuard. Сразу скажу, данная статья, не несет обучающий смысл. Это скорей вспомогательный манул, в котором учтены все, те моменты и задачи, с которыми у меня возникли трудности, и я их решил.
И на основе этого, сделал свои заметки, чтобы если вдруг забуду что-то, то можно было всегда посмотреть и освежить память. Потому что, искать ответы из разных источников необходимые ответы, это очень большая трата времени, а время, это деньги. Так что может мои записи помогут не только новичкам, но и более опытным специалистам.
Для новичков: Никогда не работайте на сервере, напрямую под 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 поддержания соединения, а конфигурационный файл клиента.