Автоматична инсталация на OpenVPN сървър в Proxmox LXC контейнер

🎯 Въведение
Това ръководство е създадено за хора, които искат бързо и лесно да разгърнат OpenVPN сървър в Proxmox LXC контейнер. Представеният скрипт автоматизира целия процес на инсталация, конфигурация и генериране на сертификати, като изисква минимална намеса от потребителя.
Какво ще постигнем:
✅ Пълна автоматична инсталация на OpenVPN
✅ Генериране на CA и сървърни/клиентски сертификати
✅ Автоматична настройка на firewall и маршрутизация
✅ Готов за употреба .ovpn файл за клиенти
✅ Скрипт за лесно добавяне на нови потребители
🔐 Какво е OpenVPN и защо да го използваме
OpenVPN е open-source VPN (Virtual Private Network) решение, което създава защитени, криптирани тунели между клиенти и сървър. Използва се за:
- Сигурен отдалечен достъп до корпоративна мрежа
- Криптиране на трафик в несигурни мрежи (например публични WiFi)
- Заобикаляне на географски ограничения
- Свързване на офиси чрез site-to-site VPN
- Защита на лични данни при сърфиране
Защо OpenVPN?
- ✅ Open-source и безплатен
- ✅ Високо ниво на сигурност (AES-256 криптиране)
- ✅ Работи на всички платформи (Windows, Linux, macOS, Android, iOS)
- ✅ Може да работи през firewall-и (поддържа TCP и UDP)
- ✅ Активна общност и отлична документация
🐳 Предимства на LXC контейнери в Proxmox
LXC (Linux Containers) е технология за виртуализация на ниво операционна система. За разлика от пълноценните виртуални машини, LXC контейнерите:
Предимства:
- По-малко ресурси: Използват по-малко RAM и CPU
- По-бързо стартиране: Стартират за секунди вместо минути
- По-ефективни: Няма overhead от хипервизор
- Лесно управление: Proxmox предлага отлично web-базирано управление
- Snapshots и backups: Бързо създаване на резервни копия
Когато да използваме LXC вместо VM:
- За Linux-базирани услуги (като OpenVPN)
- Когато ресурсите са ограничени
- За тестови среди и development
- Когато не е нужно пълна изолация на хардуера
🔌 Проблемът с TUN устройството
Какво е TUN/TAP?
TUN и TAP са виртуални мрежови устройства в Linux:
- TUN (network TUNnel): Работи на Layer 3 (IP пакети) – използва се от OpenVPN
- TAP (network TAP): Работи на Layer 2 (Ethernet рамки)
OpenVPN използва TUN устройство (/dev/net/tun
) за създаване на виртуален мрежови интерфейс.
Защо е проблем в LXC контейнерите?
По подразбиране, LXC контейнерите в Proxmox нямат достъп до /dev/net/tun
устройството по соображения за сигурност. Контейнерите са изолирани и не могат да създават произволни устройства.
Решението
Трябва да разрешим достъп до TUN устройството от Proxmox хоста, като редактираме конфигурацията на контейнера. Това става чрез добавяне на специални директиви в конфигурационния файл на контейнера.
🚀 Инсталация стъпка по стъпка
Предпоставки
- Proxmox VE 6.0 или по-нова версия
- Ubuntu LXC контейнер (препоръчвам 22.04 или 24.04)
- Root достъп до Proxmox хоста
- Публичен IP адрес или port forwarding настроен
Първо изтеглете скрипта:
wget https://gist.fedia.eu/urocibg/14c214720d214a839880a903f1188d43/raw/HEAD/openvpn-install.sh
Дайте му права за изпълнение:
chmod +x openvpn-install.sh
Стартиране:
./openvpn-install.sh
Стъпка 1: Създаване на LXC контейнер
От Proxmox Web UI:
- Кликнете на "Create CT" (Create Container)
- Попълнете данните:
- CT ID: Например 100
- Hostname: openvpn-server
- Password: Задайте сигурна парола
- Template: ubuntu-24.04-standard
- Disk: 8-10 GB е достатъчно
- CPU: 1-2 cores
- Memory: 1024-2048 MB RAM
- Network: Bridge vmbr0, DHCP или статичен IP
- ВАЖНО: Не поставяйте отметка на "Unprivileged container" (или я поставете, работи и в двата случая)
Или от командния ред на Proxmox хоста:
pct create 100 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
--hostname openvpn-server \
--password <ПАРОЛА> \
--memory 2048 \
--rootfs local-lvm:10 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--onboot 1 \
--unprivileged 1
Стъпка 2: Конфигуриране на TUN устройството
Това е най-важната стъпка!
На Proxmox хоста (не в контейнера):
# Спрете контейнера
pct stop 100
# Редактирайте конфигурацията
nano /etc/pve/lxc/100.conf
Добавете следните редове в края на файла:
# TUN/TAP устройство за OpenVPN
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net dev/net none bind,create=dir
За по-стари версии на Proxmox (под 7.0):
lxc.cgroup.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
Обяснение на директивите:
lxc.cgroup2.devices.allow: c 10:200 rwm
– Разрешава достъп до character device с major:minor номер 10:200 (това е /dev/net/tun)c
= character device10:200
= major:minor номера на устройствотоrwm
= read, write, mknod права
lxc.mount.entry: /dev/net dev/net none bind,create=dir
– Прави bind mount на /dev/net директорията от хоста в контейнера
# Запазете файла (Ctrl+O, Enter, Ctrl+X)
# Стартирайте контейнера
pct start 100
Стъпка 3: Проверка на TUN устройството
Влезте в контейнера:
pct enter 100
Проверете дали TUN устройството съществува:
ls -l /dev/net/tun
Очакван резултат:
crw-rw-rw- 1 root root 10, 200 Oct 18 12:00 /dev/net/tun
Тест за достъп:
cat /dev/net/tun
Ако видите грешка cat: /dev/net/tun: File descriptor in bad state
– това е нормално! Означава, че устройството съществува и е достъпно.
Стъпка 4: Инсталиране на OpenVPN със скрипта
В контейнера:
# Актуализирайте системата
apt update && apt upgrade -y
# Създайте скрипта (използвайте nano или vim)
nano openvpn-install.sh
# Копирайте съдържанието на скрипта от артефакта
# Направете го изпълним
chmod +x openvpn-install.sh
# Стартирайте скрипта
./openvpn-install.sh
Стъпка 5: Следвайте инструкциите на скрипта
Скриптът ще ви попита:
- IP адрес на сървъра – Публичният IP или IP на контейнера
- Порт за OpenVPN – По подразбиране 1194
- Протокол (UDP/TCP) – UDP е по-бърз, TCP е по-стабилен
- Име на първия клиент – Например "laptop" или "mobile"
След това скриптът автоматично:
- ✅ Инсталира OpenVPN и Easy-RSA
- ✅ Генерира CA сертификат
- ✅ Създава сървърен сертификат
- ✅ Генерира Diffie-Hellman параметри
- ✅ Създава tls-auth ключ
- ✅ Генерира клиентски сертификат
- ✅ Конфигурира firewall и IP forwarding
- ✅ Стартира OpenVPN сървъра
- ✅ Създава готов .ovpn файл за клиента
Стъпка 6: Отваряне на порта на Proxmox firewall
Ако имате активиран firewall на Proxmox хоста:
# На Proxmox хоста
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
netfilter-persistent save
Или от Proxmox Web UI:
- Datacenter → Firewall → Add rule
- Direction: in
- Action: ACCEPT
- Protocol: UDP
- Dest. port: 1194
💻 Използване на скрипта
Какво прави скриптът?
Скриптът е проектиран да автоматизира сложния процес на настройка на OpenVPN. Ето какво се случва зад кулисите:
1. Проверки за сигурност
# Проверява дали се изпълнява като root
if [[ $EUID -ne 0 ]]; then
echo "Този скрипт трябва да се изпълни като root!"
exit 1
fi
2. Конфигурационен диалог
Скриптът използва интелигентни default стойности:
- Автоматично открива IP адреса на сървъра
- Предлага стандартни настройки, които работят в 99% от случаите
- Позволява персонализация при нужда
3. PKI (Public Key Infrastructure) настройка
# Използва Easy-RSA за създаване на CA
./easyrsa init-pki
./easyrsa build-ca nopass
Какво е PKI?
- CA (Certificate Authority): "Доверено лице", което подписва сертификати
- Сървърен сертификат: Удостоверява идентичността на VPN сървъра
- Клиентски сертификат: Удостоверява идентичността на всеки клиент
- Diffie-Hellman: Параметри за сигурен обмен на ключове
- TLS-Auth: Допълнителен слой на защита срещу DoS атаки
4. Криптографски настройки
Скриптът използва съвременни, сигурни алгоритми:
cipher AES-256-GCM # Криптиране с AES-256 в GCM режим
auth SHA256 # HMAC с SHA256
- AES-256-GCM: Военно ниво на криптиране, бързо и сигурно
- SHA256: Устойчив hash алгоритъм за проверка на интегритет
5. Мрежова конфигурация
# IP forwarding - позволява на сървъра да маршрутизира трафик
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
# NAT - превежда VPN клиентски IP адреси към публични
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o $INTERFACE -j MASQUERADE
Обяснение:
- VPN клиентите получават IP адреси от диапазона
10.8.0.0/24
- NAT (MASQUERADE) променя source IP на пакетите, за да изглеждат като идващи от сървъра
- Това позволява на клиентите да достъпват интернет през VPN
6. Генериране на .ovpn файл
Скриптът създава единичен .ovpn
файл с вградени сертификати:
<ca>
-----BEGIN CERTIFICATE-----
...сертификат на CA...
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
...клиентски сертификат...
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
...клиентски частен ключ...
-----END PRIVATE KEY-----
</key>
Предимства:
- Един файл съдържа всичко необходимо
- Лесно за споделяне и импортиране
- Не се налага да се управляват отделни файлове
Структура на генерираните файлове
След изпълнение на скрипта, ще имате:
/etc/openvpn/
├── ca.crt # CA сертификат
├── server.conf # Конфигурация на сървъра
├── openvpn-server.crt # Сървърен сертификат
├── openvpn-server.key # Сървърен частен ключ
├── dh.pem # Diffie-Hellman параметри
├── ta.key # TLS-Auth ключ
└── openvpn-status.log # Status log
/root/openvpn-ca/
└── pki/
├── ca.crt
├── issued/
│ ├── openvpn-server.crt
│ └── client1.crt
├── private/
│ ├── ca.key
│ ├── openvpn-server.key
│ └── client1.key
└── dh.pem
/root/client-configs/
├── base.conf # Базова клиентска конфигурация
└── client1.ovpn # Готов за употреба клиентски файл
👥 Добавяне на нови клиенти
След началната инсталация, скриптът създава помощен скрипт ~/add-client.sh
за лесно добавяне на нови потребители.
Използване:
# В контейнера
~/add-client.sh client2
Това автоматично:
- Генерира нов клиентски сертификат
- Подписва го с CA
- Създава нов .ovpn файл в
~/client-configs/
Примери за имена на клиенти:
~/add-client.sh laptop-john
~/add-client.sh phone-maria
~/add-client.sh office-pc
~/add-client.sh remote-worker-5
Добра практика:
- Използвайте описателни имена
- Включете потребител и устройство
- Избягвайте специални символи
Сваляне на клиентски файлове
От вашия компютър (не от контейнера):
# SCP
scp root@<IP_НА_КОНТЕЙНЕРА>:~/client-configs/client2.ovpn .
# Или от Proxmox хоста
pct pull 100 /root/client-configs/client2.ovpn client2.ovpn
Отменяне на достъп на клиент (Revoke)
Ако искате да отмените достъп на клиент:
cd ~/openvpn-ca
./easyrsa revoke client2
./easyrsa gen-crl
# Копирайте CRL в OpenVPN директорията
cp pki/crl.pem /etc/openvpn/
# Добавете в server.conf
echo "crl-verify crl.pem" >> /etc/openvpn/server.conf
# Рестартирайте OpenVPN
systemctl restart openvpn@server
🔧 Отстраняване на проблеми
Проблем 1: OpenVPN не стартира
Симптоми:
systemctl status openvpn@server
# Active: activating (auto-restart)
Решение:
# Проверете логовете
journalctl -u openvpn@server -n 50
# Най-чести причини:
# 1. Липсва TUN устройство
ls -l /dev/net/tun
# Ако липсва, върнете се към Стъпка 2
# 2. Грешка в конфигурацията
openvpn --config /etc/openvpn/server.conf
# Ще видите точната грешка
# 3. Портът е зает
netstat -tulpn | grep 1194
Проблем 2: Клиент се свързва, но няма интернет
Симптоми: Клиентът се свързва към VPN, но не може да достъпва интернет или локални ресурси.
Решение:
# 1. Проверете IP forwarding
cat /proc/sys/net/ipv4/ip_forward
# Трябва да е 1
# Ако е 0:
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p
# 2. Проверете NAT правилата
iptables -t nat -L -n -v | grep MASQUERADE
# Ако липсват:
INTERFACE=$(ip route | grep default | awk '{print $5}')
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o $INTERFACE -j MASQUERADE
netfilter-persistent save
# 3. Проверете дали tun0 интерфейсът съществува
ip addr show tun0
Проблем 3: "TLS handshake failed"
Причина: Различни TLS-Auth ключове или certificate chain проблеми.
Решение:
# Регенерирайте клиентския .ovpn файл
~/add-client.sh client1-new
# Изтрийте стария клиентски профил и използвайте новия
Проблем 4: Бавна скорост
Оптимизации:
# Редактирайте /etc/openvpn/server.conf
nano /etc/openvpn/server.conf
# Добавете:
sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"
# За UDP:
fast-io
# Рестартирайте
systemctl restart openvpn@server
Проблем 5: Клиентът не може да се свърже
Checklist:
# 1. Порт отворен на firewall?
# На Proxmox хоста:
iptables -L -n | grep 1194
# 2. OpenVPN слуша на правилния порт?
netstat -tulpn | grep openvpn
# 3. Router port forwarding настроен? (ако сте зад NAT)
# Проверете router конфигурацията
# 4. Правилен IP в .ovpn файла?
grep "^remote" ~/client-configs/client1.ovpn
Проблем 6: "Cannot allocate TUN/TAP device"
Причина: Липсват permissions за TUN или устройството не е правилно монтирано.
Решение:
# На Proxmox хоста, проверете конфигурацията:
cat /etc/pve/lxc/100.conf | grep -E "lxc.cgroup|lxc.mount"
# Трябва да видите:
# lxc.cgroup2.devices.allow: c 10:200 rwm
# lxc.mount.entry: /dev/net dev/net none bind,create=dir
# Ако липсват, добавете ги и рестартирайте контейнера
pct stop 100
pct start 100
Debugging команди
# Пълни логове на OpenVPN
tail -f /var/log/openvpn.log
# System logs
journalctl -u openvpn@server -f
# Мрежови интерфейси
ip addr show
# Routing table
ip route show
# Active connections
ss -tulpn
# Firewall rules
iptables -L -n -v
iptables -t nat -L -n -v
# Test connectivity от клиента
ping 10.8.0.1 # VPN gateway
ping 8.8.8.8 # External IP
🎓 Заключение
Какво постигнахме:
✅ Научихме какво е OpenVPN и защо е полезен
✅ Разбрахме какво представляват LXC контейнерите
✅ Решихме проблема с TUN устройството в Proxmox
✅ Инсталирахме пълнофункционален OpenVPN сървър
✅ Автоматизирахме процеса с готов скрипт
✅ Създадохме система за лесно добавяне на клиенти
Следващи стъпки:
- Backup на сертификатите:
tar -czf openvpn-backup-$(date +%Y%m%d).tar.gz ~/openvpn-ca /etc/openvpn
- Мониторинг:
# Вижте свързани клиенти cat /etc/openvpn/openvpn-status.log
- Автоматични updates:
# В контейнера apt install unattended-upgrades dpkg-reconfigure -plow unattended-upgrades
- Fail2ban за защита:
apt install fail2ban # Създайте jail за OpenVPN
Допълнителни ресурси:
- 📖 Официална документация на OpenVPN
- 📖 Proxmox LXC документация
- 📖 Easy-RSA GitHub
- 🎥 OpenVPN Best Practices
Безопасност:
⚠️ ВАЖНО:
- Пазете
/root/openvpn-ca/pki/private/
в СИГУРНОСТ - Никога не споделяйте CA частния ключ
- Използвайте силни пароли за защита на контейнера
- Редовно актуализирайте системата
- Ревютирайте свързани клиенти периодично
- Създавайте backups на сертификатите
Поддръжка:
Месечни задачи:
- Проверка на логовете за необичайна активност
- Актуализация на системата
- Backup на конфигурацията
При нужда от помощ:
- Проверете секцията "Отстраняване на проблеми"
- Консултирайте логовете:
journalctl -u openvpn@server
- OpenVPN форуми и общност
📝 Кратко Cheat Sheet
# Проверка на статус
systemctl status openvpn@server
# Рестартиране
systemctl restart openvpn@server
# Логове
tail -f /var/log/openvpn.log
# Свързани клиенти
cat /etc/openvpn/openvpn-status.log
# Добавяне на клиент
~/add-client.sh new-client
# Тест на конфигурацията
openvpn --config /etc/openvpn/server.conf
# Backup
tar -czf vpn-backup.tar.gz ~/openvpn-ca /etc/openvpn
# Проверка на TUN
ls -l /dev/net/tun
ip addr show tun0
Автор: Федя Серафиев
Дата: Октомври 2025
Версия на скрипта: 1.0
Тествано на: Proxmox 9.0.10, Ubuntu 24.04 LXC
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut