WireGuard VPN на CentOS 7
Операционная система CentOS 7 в 2025 году уже не актуальна. Так что текущая статья полезна только единичным хипстерам, которые ковыряют старую кобылу, вместо того, чтобы её
Как обычно, я избегаю всяких докеров, - только чистая установка. Так ощущения полнее.
Как я установил сам 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",
Комментарии
Отправить комментарий