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

Автоматична инсталация на 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:

  1. Кликнете на "Create CT" (Create Container)
  2. Попълнете данните:
    • 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
  3. ВАЖНО: Не поставяйте отметка на "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 device
    • 10: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: Следвайте инструкциите на скрипта

Скриптът ще ви попита:

  1. IP адрес на сървъра – Публичният IP или IP на контейнера
  2. Порт за OpenVPN – По подразбиране 1194
  3. Протокол (UDP/TCP) – UDP е по-бърз, TCP е по-стабилен
  4. Име на първия клиент – Например "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

Това автоматично:

  1. Генерира нов клиентски сертификат
  2. Подписва го с CA
  3. Създава нов .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 сървър
Автоматизирахме процеса с готов скрипт
Създадохме система за лесно добавяне на клиенти

Следващи стъпки:

  1. Backup на сертификатите: tar -czf openvpn-backup-$(date +%Y%m%d).tar.gz ~/openvpn-ca /etc/openvpn
  2. Мониторинг: # Вижте свързани клиенти cat /etc/openvpn/openvpn-status.log
  3. Автоматични updates: # В контейнера apt install unattended-upgrades dpkg-reconfigure -plow unattended-upgrades
  4. Fail2ban за защита: apt install fail2ban # Създайте jail за OpenVPN

Допълнителни ресурси:

Безопасност:

⚠️ ВАЖНО:

  • Пазете /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


Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:

Подобни статии