WireGuard VPN на CentOS 7


Операционная система CentOS 7 в 2025 году уже не актуальна. Так что текущая статья полезна только единичным хипстерам, которые ковыряют старую кобылу, вместо того, чтобы её пристрелить отпустить. Но вообще-то всё описанное работает и на любых современных RedHat подобных ОС.

Как обычно, я избегаю всяких докеров, - только чистая установка. Так ощущения полнее.

Как я установил сам WireGuard сервер уже не вспомню: не зафиксировал, к сожалению. Тут были чисто мои проблемы из-за старой неподдерживаемой ОС. Сначала пришлось переключить репозитории на какие-то рабочие зеркала (вместо родных репозиториев, которые отключены). А далее установка WireGuard как модуль ядра. Скорее всего, полезна была статья "Настройка VPN сервера WireGuard в Linux?". Установка:

sudo yum install epel-release -y && yum install wireguard-tools wireguard-dkms qrencode -y

Проверка, что всё установлено (в ответе должны быть три строки):

modprobe wireguard && lsmod | grep wireguard

Настройка сервера

Далее настройка. Настройка сервера VPN и настройка клиентов, которые к серверу допускаются делается в одном конфиге. Его надо создать и наполнить:

/etc/wireguard/wg0-server.conf 

В самом каталоге лучше сразу выполнить команду для назначения прав всем новым файлам каталога:

sudo umask 007

Это позволит потом генерировать ключи и конфиги в этом же каталоге и не делать каждый раз смену прав такой командой:

sudo chmod 600 -R /etc/wireguard

В моём случае конфиг сервера получился такой (файл /etc/wireguard/wg0-server.conf все секретные ключи и внешние IP моего сервера изменены на случайные):

[Interface]
Address = 10.0.0.1/24
PrivateKey = mPxGrpLHWo64A1qh0KRwvMPAmJLMtup9BiqfCeRQpVc=
MTU = 1420

PostUp = firewall-cmd --add-port 51820/udp && firewall-cmd --add-rich-rule='rule family=ipv4 source address=85.70.49.212/24 masquerade' && firewall-cmd --add-rich-rule='rule family=ipv6 source address=0603:00c7:f9b0:4fe7:927d:9003:6935:db07/24 masquerade'
PostDown = firewall-cmd --remove-port 51820/udp && firewall-cmd --remove-rich-rule='rule family=ipv4 source address=85.70.49.212/24 masquerade' && firewall-cmd --remove-rich-rule='rule family=ipv6 source address=0603:00c7:f9b0:4fe7:927d:9003:6935:db07/24 masquerade'

ListenPort = 51820

Разберём, что тут есть и где это брать. IP адреса для локальной сети (параметр Address) придумываем себе сами (из диапазонов, которые относятся ко внутренним непубличным сетям). Секретный ключ сервера генерируем командой wg genkey. Сразу генерируем и сохраняем себе на память секретный и публичный ключи сервера (из-под рут пользователя в каталоге /etc/wireguard):

wg genkey | tee server-private.key | wg pubkey > server-public.key

В моём случае используется FirewallD, поэтому команды для него, а не для iptables. Параметры PostUp и PostDown при запуске VPN сервера будут открывать порт (сам себе придумал порт 51820), закрывать его при отключении и добавлять маскировку портов.

Чтобы заработал магия сетей, надо ещё включить IP форвардинг. Для этого в файл /etc/sysctl.d/local.conf добавил строки:

# For VPN
net.ipv4.ip_forward = 1

И после этого команда:

sudo sysctl -p

Это всё, что нужно, чтобы сервер работал. Ну его ещё только запустить можно:

sudo systemctl enable wg-quick@wg0-server.service
sudo systemctl start wg-quick@wg0-server.service

Но толку нет никакого от голого сервера: нужны ещё и клиенты, которые допускаются для соединения на этот сервер. Сначала я хотел пойти лёгким путём: поставить себе какой-то GUI и через него добавлять клиентов мышкой. Но мой старый VPS не позволил так уж легко это сделать и я отложил идею GUI на потом (не в этой жизни).

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

Добавление клиента

Для каждого клиента запускаем команды, копируем и вставляем нужные ключи. Всё в этом же каталоге /etc/wireguard и от рут.

wg genkey | tee client-oleg-ubuntu-private.key | wg pubkey > client-oleg-ubuntu-public.key

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

cat ./client-oleg-ubuntu-private.key
cat ./client-oleg-ubuntu-public.key

Генерируем ещё один ключ, уникальный для каждого клиента (не обязательно, но полезно для безопасности):

wg genpsk

Тоже копируем из консоли в текстовый файлик. Итого в текстовом файлике накопилось: приватный ключ клиента, секретный ключ клиента и ещё один серверный ключ, уникальный для каждого клиента. Это исходные данные. Теперь нужно их распихать по нужным местам.

Делаем отдельный файл-конфиг для клиента. Этот файл отдадим клиенту, он нужен будет для настройки клиентского соединения с VPN сервером. Из этого же конфига можно сгенерировать QR-код картинку для быстрой настройки на устройствах, где есть камера и возможность распознать QR-код (смартфоны).

nano ./002-client-oleg-ubuntu.conf

Внутрь файла вставляем:

[Interface]
Address = 10.0.0.2/24
PrivateKey = CLIENT_PRIVATE_KEY

DNS = 8.8.8.8,8.8.4.4

[Peer]
PublicKey = SERVER_PUBLIC_KEY
AllowedIPs = 0.0.0.0/0, ::0/0
Endpoint = 85.70.49.212:51820
PersistentKeepalive = 25
PresharedKey = KEY_FROM_GENPSK

Из этого файлика сразу в консоли сервера сгенерируем картинку QR-код с этими настройками (из-под рут):

qrencode -t ansiutf8 < 002-client-oleg-ubuntu.conf

Картинку себе можно заскриншотить и сохранить. Пригодится для настройки, если вы настраиваете VPN на смартфоне. Если не на смартфоне, то можно и не делать картинку.

Далее клиента надо добавить в основной конфиг сервера /etc/wireguard/wg0-server.conf. В конец добавляем:

[Peer]
#Oleg Ubuntu
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32
Endpoint = 85.70.49.212:51820
PersistentKeepalive = 25
PresharedKey = KEY_FROM_GENPSK

После этого надо перезапустить сервер:

sudo systemctl restart wg-quick@wg0-server.service 

По началу я перезапускал и всё было хорошо, потом дошёл до настройки клиента для Windows и забыл перезапустить сервер. В винде долго не мог понять, почему не соединяется. В интернете даже ошибки гуглил. Там народ тоже ищет решение и никто не советует ничего дельного. Соединение обламывается на рукопожатии. В общем, от всех бед, один ресет: не зыбаваем перезапускать службу, чтобы она подтянула новые изменения в конфиге.

Сложнее всего мне было настроить клиент на Android TV-box. Камеры там нет, чтобы быстро по QR-коду подтянуть конфиг. Можно импортировать конфиг из файла. Как его отправить на TV-box? Я отправил письмом на ящик своего TV-box (да, у моего телевизора есть свой гугл-аккаунт с Gmail). Но тут оказалось, что Gmail в Android не даёт сохранить файл с расширением .conf - переименовывает его в .txt. А это уже не импортируется в прогу Wireguard. Переименовать файлик не так-то просто оказалось. Пришлось установить для этого отдельную прогу для редактирования текстовых файликов и из неё делать Сохранить как. Но это мне тоже не помогло - Wineguard почему-то отказывался считывать файлик даже с правильным расширением - ругался на права. В общем, мне пришлось всю тучу параметров вбивать вручную аэропультом, подглядывая в скриншот на смартфоне... долго, крайне неудобно, но удалось-таки.

Для настройки в Linux (проверено в Kubuntu 24.04 - KDE 5.27 и Linux Mint 21.3 - Cinnamon) вот так можно импортировать настройки с систему:

nmcli connection import type wireguard file /home/oleg/Документы/002-client-oleg-ubuntu.conf

Полезные статьи по теме

"Wireguard с веб-интерфейсом", "Set Up Your Own WireGuard VPN Server on CentOS", "Проблемы установки Wireguard на Linux и объединение сетей", "Как настроить клиент WireGuard VPN с графическим интерфейсом NetworkManager",

Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа