Создание скриптов для управления пользователями VPN: полное руководство
Управление пользователями на VPN-сервере — задача, которая быстро перестаёт быть ручной, как только количество клиентов переваливает за десяток. Добавление новых пользователей, генерация ключей, выдача конфигураций, блокировка доступа, ротация сертификатов — всё это требует автоматизации. В этой статье мы разберём, как создавать скрипты для управления пользователями VPN на примере OpenVPN, WireGuard и Xray. Вы узнаете, как писать простые и эффективные Bash-скрипты, использовать Python для более сложной логики и интегрировать всё это в единую систему администрирования.
Но прежде чем мы перейдём к коду, давайте поговорим о том, почему автоматизация управления пользователями — это не просто удобство, а необходимость, особенно если вы используете личный VPN-сервер на VPS.
📑 Содержание:
Зачем автоматизировать управление пользователями VPN?
Представьте ситуацию: у вас 50 пользователей, каждому нужно выдать индивидуальные сертификаты и конфигурационные файлы. Вручную это займёт несколько часов, а если пользователь потерял ключи или нужно отозвать доступ — процесс повторяется. Автоматизация решает эти проблемы:
- Экономия времени — добавление нового пользователя занимает секунды.
- Минимизация ошибок — скрипты исключают человеческий фактор.
- Масштабируемость — вы можете управлять сотнями пользователей без дополнительных усилий.
- Безопасность — автоматическая ротация ключей и отзыв доступа при необходимости.
- Интеграция — скрипты можно подключить к веб-интерфейсу или биллинговой системе.
💡 Важно:
Если вы используете личный VPN-сервер на VPS, автоматизация становится особенно актуальной. Вы сами отвечаете за безопасность и доступ пользователей — скрипты помогут вам поддерживать порядок без лишних хлопот.
Скрипты для OpenVPN
OpenVPN — один из самых популярных протоколов, и для него существует множество готовых решений. Однако мы рассмотрим, как написать собственные скрипты для управления пользователями.
Структура файлов OpenVPN
Для управления пользователями OpenVPN используются следующие файлы и директории:
/etc/openvpn/server.conf— основной конфигурационный файл./etc/openvpn/easy-rsa/— директория с утилитами для управления сертификатами./etc/openvpn/ccd/— директория для индивидуальных настроек клиентов./etc/openvpn/server/clients/— место для хранения конфигураций клиентов.
Пример скрипта добавления пользователя (Bash)
📄 add_user.sh
#!/bin/bash
# Скрипт для добавления нового пользователя OpenVPN
USERNAME=$1
if [ -z "$USERNAME" ]; then
echo "Использование: $0 <имя_пользователя>"
exit 1
fi
cd /etc/openvpn/easy-rsa
./easyrsa gen-req "$USERNAME" nopass
./easyrsa sign-req client "$USERNAME"
# Создание конфигурационного файла
cat > /etc/openvpn/clients/"$USERNAME".ovpn <<EOF
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
verb 3
<ca>
$(cat /etc/openvpn/easy-rsa/pki/ca.crt)
</ca>
<cert>
$(cat /etc/openvpn/easy-rsa/pki/issued/"$USERNAME".crt)
</cert>
<key>
$(cat /etc/openvpn/easy-rsa/pki/private/"$USERNAME".key)
</key>
EOF
echo "✅ Пользователь $USERNAME добавлен. Конфиг: /etc/openvpn/clients/$USERNAME.ovpn"Пример скрипта удаления пользователя
📄 remove_user.sh
#!/bin/bash
# Скрипт для удаления пользователя OpenVPN (отзыв сертификата)
USERNAME=$1
if [ -z "$USERNAME" ]; then
echo "Использование: $0 <имя_пользователя>"
exit 1
fi
cd /etc/openvpn/easy-rsa
./easyrsa revoke "$USERNAME"
./easyrsa gen-crl
# Копируем новый CRL в основную директорию
cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/
# Удаляем файлы клиента
rm -f /etc/openvpn/clients/"$USERNAME".ovpn
echo "❌ Пользователь $USERNAME удалён. Сертификат отозван."Эти скрипты можно расширить, добавив проверку на существование пользователя, логирование действий и отправку конфигурации по email.
Скрипты для WireGuard
WireGuard проще в управлении, так как использует статические ключи и не требует сертификатов. Основной файл конфигурации — /etc/wireguard/wg0.conf.
Структура конфигурации WireGuard
Каждый пользователь — это секция [Peer] с публичным ключом, разрешёнными IP-адресами и опциональными настройками.
Пример скрипта добавления пользователя
📄 wg_add_user.sh
#!/bin/bash
# Скрипт для добавления нового пользователя WireGuard
USERNAME=$1
if [ -z "$USERNAME" ]; then
echo "Использование: $0 <имя_пользователя>"
exit 1
fi
# Генерация ключей
PRIVATE_KEY=$(wg genkey)
PUBLIC_KEY=$(echo "$PRIVATE_KEY" | wg pubkey)
# Определение следующего доступного IP-адреса (подсеть 10.0.0.0/24)
LAST_IP=$(grep -oP '10\.0\.0\.\d+' /etc/wireguard/wg0.conf | sort -n | tail -1 | cut -d. -f4)
if [ -z "$LAST_IP" ]; then
NEXT_IP=2
else
NEXT_IP=$((LAST_IP + 1))
fi
# Добавление пира в конфигурацию
cat >> /etc/wireguard/wg0.conf <<EOF
[Peer]
PublicKey = $PUBLIC_KEY
AllowedIPs = 10.0.0.$NEXT_IP/32
EOF
# Создание конфигурации для клиента
cat > /root/"$USERNAME"-wg.conf <<EOF
[Interface]
PrivateKey = $PRIVATE_KEY
Address = 10.0.0.$NEXT_IP/24
DNS = 1.1.1.1
[Peer]
PublicKey = $(wg show wg0 public-key)
Endpoint = YOUR_SERVER_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
# Перезагрузка WireGuard
wg syncconf wg0 <(wg-quick strip wg0)
echo "✅ Пользователь $USERNAME добавлен. IP: 10.0.0.$NEXT_IP"
echo "📄 Конфиг клиента: /root/$USERNAME-wg.conf"Пример скрипта удаления пользователя
📄 wg_remove_user.sh
#!/bin/bash
# Скрипт для удаления пользователя WireGuard по публичному ключу
PUBLIC_KEY=$1
if [ -z "$PUBLIC_KEY" ]; then
echo "Использование: $0 <публичный_ключ>"
exit 1
fi
# Удаление пира из конфигурации
sed -i "/^\[Peer\]$/,/^$/d" /etc/wireguard/wg0.conf
# Более точное удаление: ищем секцию с нужным ключом
awk -v key="$PUBLIC_KEY" '
BEGIN { skip=0 }
/^\[Peer\]/ { skip=0 }
skip { next }
$0 ~ "PublicKey = " key { skip=1; next }
!skip { print }
' /etc/wireguard/wg0.conf > /tmp/wg0.conf.tmp
mv /tmp/wg0.conf.tmp /etc/wireguard/wg0.conf
# Перезагрузка WireGuard
wg syncconf wg0 <(wg-quick strip wg0)
echo "❌ Пользователь с ключом $PUBLIC_KEY удалён."Скрипты для Xray (XHTTP + Reality)
Xray — это современный прокси-сервер, который поддерживает протоколы XHTTP, Reality, VLESS, Trojan и другие. Управление пользователями в Xray осуществляется через JSON-конфигурацию.
Технология XHTTP + Reality — это передовой метод маскировки VPN-трафика под обычный HTTPS-запрос к легитимному сайту. DPI-системы не могут отличить ваше соединение от реального браузера Chrome, потому что:
- Имитация TLS-рукопожатия — соединение выглядит как стандартный HTTPS-запрос.
- Маскировка под Chrome — все параметры соответствуют реальному браузеру.
- Отсутствие характерных сигнатур — в отличие от OpenVPN или WireGuard, у XHTTP нет узнаваемых паттернов.
Для управления пользователями в Xray используется файл /etc/xray/config.json. Рассмотрим примеры скриптов.
Структура конфигурации Xray
В конфигурации Xray пользователи определяются в секции inbounds с указанием clients — массива объектов с полями id (UUID) и email.
Пример скрипта добавления пользователя (Python)
📄 xray_add_user.py
#!/usr/bin/env python3
import json
import uuid
import sys
import os
CONFIG_PATH = "/etc/xray/config.json"
def add_user(email):
with open(CONFIG_PATH, 'r') as f:
config = json.load(f)
new_id = str(uuid.uuid4())
new_user = {
"id": new_id,
"email": email,
"flow": "xtls-rprx-vision"
}
# Находим нужный inbound (обычно с protocal = "vless" или "trojan")
for inbound in config.get("inbounds", []):
if inbound.get("protocol") in ["vless", "trojan"]:
clients = inbound.get("settings", {}).get("clients", [])
clients.append(new_user)
inbound["settings"]["clients"] = clients
break
else:
print("❌ Inbound с поддерживаемым протоколом не найден")
sys.exit(1)
with open(CONFIG_PATH, 'w') as f:
json.dump(config, f, indent=2)
# Перезапуск Xray
os.system("systemctl restart xray")
print(f"✅ Пользователь {email} добавлен. UUID: {new_id}")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Использование: python3 xray_add_user.py ")
sys.exit(1)
add_user(sys.argv[1]) Пример скрипта удаления пользователя
📄 xray_remove_user.py
#!/usr/bin/env python3
import json
import sys
import os
CONFIG_PATH = "/etc/xray/config.json"
def remove_user(email):
with open(CONFIG_PATH, 'r') as f:
config = json.load(f)
removed = False
for inbound in config.get("inbounds", []):
if inbound.get("protocol") in ["vless", "trojan"]:
clients = inbound.get("settings", {}).get("clients", [])
new_clients = [c for c in clients if c.get("email") != email]
if len(new_clients) != len(clients):
removed = True
inbound["settings"]["clients"] = new_clients
if not removed:
print(f"❌ Пользователь {email} не найден")
sys.exit(1)
with open(CONFIG_PATH, 'w') as f:
json.dump(config, f, indent=2)
os.system("systemctl restart xray")
print(f"❌ Пользователь {email} удалён.")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Использование: python3 xray_remove_user.py ")
sys.exit(1)
remove_user(sys.argv[1]) Python для сложной автоматизации
Bash-скрипты хороши для простых задач, но для сложной логики (интеграция с базой данных, веб-интерфейс, API) лучше использовать Python. Вот пример структуры для управления пользователями через SQLite:
📄 vpn_manager.py (фрагмент)
import sqlite3
import uuid
import json
import subprocess
class VPNManager:
def __init__(self, db_path="users.db"):
self.conn = sqlite3.connect(db_path)
self.cursor = self.conn.cursor()
self._init_db()
def _init_db(self):
self.cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
username TEXT UNIQUE,
protocol TEXT,
config TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
active BOOLEAN DEFAULT 1
)
''')
self.conn.commit()
def add_user(self, username, protocol="wireguard"):
# Генерация конфигурации в зависимости от протокола
if protocol == "wireguard":
config = self._generate_wireguard_config(username)
elif protocol == "openvpn":
config = self._generate_openvpn_config(username)
elif protocol == "xray":
config = self._generate_xray_config(username)
else:
raise ValueError(f"Неподдерживаемый протокол: {protocol}")
user_id = str(uuid.uuid4())
self.cursor.execute(
"INSERT INTO users (id, username, protocol, config) VALUES (?, ?, ?, ?)",
(user_id, username, protocol, json.dumps(config))
)
self.conn.commit()
return user_id, config
def remove_user(self, username):
self.cursor.execute("UPDATE users SET active = 0 WHERE username = ?", (username,))
self.conn.commit()
# Дополнительно: отзыв сертификатов/ключей
def get_user_config(self, username):
self.cursor.execute("SELECT config FROM users WHERE username = ? AND active = 1", (username,))
row = self.cursor.fetchone()
if row:
return json.loads(row[0])
return None
# ... остальные методыЛучшие практики и безопасность
При создании скриптов для управления пользователями VPN важно соблюдать несколько правил:
- Храните конфиденциальные данные в безопасном месте — ключи и сертификаты должны быть доступны только для чтения root.
- Используйте логирование — записывайте все действия с пользователями (кто, когда, что сделал).
- Проверяйте входящие данные — никогда не доверяйте пользовательскому вводу без санитизации.
- Автоматизируйте ротацию ключей — например, раз в 30 дней генерируйте новые ключи для всех пользователей.
- Интегрируйте с системой мониторинга — чтобы видеть, кто и когда подключается.
- Регулярно делайте бекапы — конфигурации, базы данных пользователей, сертификаты.
🔒 Безопасность прежде всего:
Если вы используете личный VPN-сервер на VPS, вы несёте полную ответственность за безопасность данных. Автоматизация должна не только упрощать управление, но и усиливать защиту. Используйте Fail2Ban, настраивайте брандмауэр и регулярно обновляйте сервер.
Личный VPS — идеальная платформа для автоматизации
🚀 Почему личный VPS лучше массового VPN?
В отличие от обычных VPN-сервисов, где 1000+ человек сидят на одном IP, вы получаете персональный VPS.
- Никаких «шумных соседей»: ваш IP-адрес используете только вы. Никто не сможет «подставить» вас своей активностью.
- Стабильная скорость: пропускная способность не делится между сотнями пользователей.
- Минимальный риск блокировок: массовые IP-адреса часто попадают в бан-листы из-за действий других пользователей. Ваш личный IP — чистый.
- Полный контроль: вы сами управляете сервером, выбираете протоколы и настройки безопасности. Вы можете запускать свои скрипты и полностью контролировать процесс.
- Технология XHTTP + Reality: ваш трафик маскируется под обычный HTTPS, DPI не может его отличить от обычного браузера Chrome.
🎯 Нас в 1000 раз сложнее заблокировать и отследить.
Потому что каждый клиент VPS-VPN — это отдельный выделенный сервер с уникальным IP-адресом и индивидуальными настройками маскировки.
Скрипты, которые мы рассмотрели, прекрасно работают на любом VPS. Но если вы хотите получить максимальную защиту от DPI и блокировок, выбирайте решение с поддержкой XHTTP + Reality. Эта технология делает ваш трафик неотличимым от обычного веб-сёрфинга, а значит — ваши пользователи всегда будут на связи.
🔥 Получите свой личный VPN-сервер с технологией XHTTP + Reality
Мы в VPS-VPN предлагаем полностью выделенный VPN-сервер на вашем собственном VPS. Никаких общих IP, никаких «соседей», только ваш трафик и максимальная защита.
Ваш трафик будет неотличим от обычного HTTPS — DPI-системы увидят обычный браузер Chrome. Нас в 1000 раз сложнее заблокировать.
А наши скрипты для управления пользователями помогут вам автоматизировать администрирование и сэкономить время.
🚀 Заказать личный VPN-серверЗаключение
Создание скриптов для управления пользователями VPN — это ключевой навык для любого администратора, который хочет эффективно управлять своей VPN-инфраструктурой. Мы рассмотрели примеры для OpenVPN, WireGuard и Xray, а также затронули вопросы безопасности и лучшие практики.
Автоматизация — это не просто удобство, это необходимость в современном мире, где количество пользователей и угроз постоянно растёт. А использование личного VPS с технологией XHTTP + Reality даёт вам не только полный контроль, но и максимальную защиту от блокировок.
✅ Готовы попробовать?
Выберите VPS-VPN — и получите не просто VPN, а полноценный выделенный сервер с передовыми технологиями маскировки. Автоматизируйте управление пользователями с помощью скриптов и наслаждайтесь стабильной и безопасной работой.
Интернет должен быть свободным, быстрым и безопасным. Выбирайте решение, которое работает по-настоящему.