Развертывание WireGuard VPN сервера в rootless контейнере podman

Попробую запустить VPN-сервер WireGuard в rootless контейнере (использую podman-контейнеры, которые нативно поддерживаются CentOS). Для конфигурации контейнера буду использовать podman-compose.
Подготовка и настройка системы и компонентов
В системе должны быть установлены podman и podman-compose, открыты порты для VPN и для веб-панели (по умолчанию это 51820/udp и 51821/tcp).
Если установлен firewall-cmd, необходимо открыть порты.
1 |
sudo firewall-cmd --list-all |
1 |
sudo firewall-cmd --permanent --zone=public --add-port=51820/udp |
1 |
sudo firewall-cmd --permanent --zone=public --add-port=51821/tcp |
1 |
sudo firewall-cmd --reload |
Настройка и запуск контейнера
Для начала необходимо создать директорию wireguard, где будут храниться конфигурации VPN-клиентов, и файл compose.yaml со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
services: wg: name: wg image: ghcr.io/wg-easy/wg-easy:14 ports: - {WG_PORT}:51820/udp - {WEB_PORT}:51821/tcp volumes: - ./wireguard:/etc/wireguard:Z cap_add: - NET_ADMIN - NET_RAW - SYS_MODULE cap_drop: - MKNOD - AUDIT_WRITE sysctls: - net.ipv4.ip_forward=1 - net.ipv4.conf.all.src_valid_mark=1 environment: WG_HOST: {HOST_ADDRESS} WG_PORT: {WG_PORT} # PASSWORD_HASH: {PASSWORD_HASH} # Пароль установим позднее |
В compose файле необходимо заменить значения на свои:
- {WG_PORT} — порт VPN-сервера (по умолчанию 51820)
- {WEB_PORT} — порт веб-панели, из которой будет производиться настройка сервера (по умолчанию 51821)
- {HOST_ADDRESS} — имя хоста (домен или IP-адрес сервера)
- {PASSWORD_HASH} — хеш пароля от веб-панели (если не указать, то панель будет доступна без пароля)
Далее необходимо запустить контейнер командой:
1 |
podman-compose up -d |
Создание пароля для веб-панели
Хеш пароля необходимо указать в переменной среды PASSWORD_HASH. Если использовать нехешированный пароль в переменной PASSWORD, то получим следующую ошибку:
1 2 |
DO NOT USE PASSWORD ENVIRONMENT VARIABLE. USE PASSWORD_HASH INSTEAD. See https://github.com/wg-easy/wg-easy/blob/master/How_to_generate_an_bcrypt_hash.md' |
Причем ссылка уже недоступна, инструкция по генерации хеша пароля доступна на github.
А потому запускаем контейнер без пароля, и запускаем скрипт генерации хеша из контейнера:
1 2 |
podman exec -it wg bash wgpw 'YOUR_PASSWORD' # PASSWORD_HASH='$2a$12$ROSbQVfWLbUXG6skugTdrOINb8kuMo2uRP3Kma3dKZxmjzfa1WBD2' |
Команда выведет хеш пароля, который нужно указать в переменной среды PASSWORD_HASH. Будьте внимательны, когда сохраняете хеш в compose.yaml файле, все символы $ необходимо заменить на $$ , чтоб они не воспринимались интерпретатором как переменные.
1 2 3 4 5 |
services: environment: PASSWORD: YOUR_PASSWORD # неправильно - будет ошибка, т.к. нельзя использовать переменную PASSWORD PASSWORD_HASH: $2a$12$ROSbQVfWLbUXG6skugTdrOINb8kuMo2uRP3Kma3dKZxmjzfa1WBD2 # неправильно, т.к. необходимо заменить символы $ на $$ PASSWORD_HASH: $$2a$$12$$ROSbQVfWLbUXG6skugTdrOINb8kuMo2uRP3Kma3dKZxmjzfa1WBD2 # правильно |
Запуск VPN-сервера и создание конфигурации для пользователей
Перезапускаем контейнер с VPN-сервером.
1 2 |
podman-compose down podman-compose up -d |
И далее заходим на веб-панель по адресу {HOST_ADDRESS}:{WEB_PORT} (по умолчанию порт 51821), вводим пароль, добавляем пользователей. Подключиться к серверу можно после скачивания ключей доступа либо по QR-коду.