// DevOps

OpenVPN: настройка Ubuntu-сервера и клиента Keenetic

Опубликовано 22.09.2026

В этой инструкции разберём, как поднять OpenVPN-сервер на Ubuntu и подключить к нему роутер Keenetic. Такой сценарий удобен, если нужно дать доступ к домашней сети или пробросить сервисы (например, PBX или веб-сервер) через VPN.

С 2025 года в России роутеры этой платформы выпускаются под брендом Netcraze (ООО «Неткрейз», ранее ООО «Кинетик»), модели NC-xxxx; прошивка та же — NDMS, поэтому всё описанное применимо и к ним.

Как устроена инфраструктура сертификатов OpenVPN и зачем нужен каждый ключ, подробно разобрано в статье OpenVPN: PKI, сертификаты и базовая настройка. Здесь — практический сценарий.


1. Подготовка Ubuntu-сервера

1.1 Установка пакетов

bash
sudo apt update
sudo apt install -y openvpn easy-rsa iptables-persistent

1.2 Создание PKI (Easy-RSA v3)

bash
make-cadir ~/easy-rsa
cd ~/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass

Серверные ключи

bash
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh

Клиентские ключи (для Keenetic)

bash
./easyrsa gen-req keenetic nopass
./easyrsa sign-req client keenetic

Общий TLS-ключ для tls-auth

bash
openvpn --genkey secret ta.key

1.3 Разложить ключи

  • В /etc/openvpn/server/:

    • ca.crt (из pki/), server.crt (из pki/issued/), server.key (из pki/private/), dh.pem (из pki/), ta.key
  • В /etc/openvpn/ccd/keenetic (создадим позже) — подсеть за Keenetic.

Имя файла в ccd должно совпадать с Common Name клиентского сертификата — в примере это keenetic.


2. Конфигурация OpenVPN-сервера

Файл /etc/openvpn/server/server.conf:

conf
port 1194
proto udp
dev tun
user nobody
group nogroup
topology subnet

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

ca ca.crt
cert server.crt
key server.key
dh dh.pem

# TLS-защита
tls-auth ta.key 0
auth SHA256
# Шифры данных: GCM для клиентов с согласованием шифра (OpenVPN 2.4+),
# CBC — запасной вариант для клиентов без согласования
data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC
data-ciphers-fallback AES-256-CBC

keepalive 10 120
persist-key
persist-tun
explicit-exit-notify 1

# Маршрут в сеть за Keenetic в таблицу ядра сервера (вместе с iroute в ccd)
route 192.168.45.0 255.255.255.0

# Пушим только нужные маршруты
push "route 10.8.0.0 255.255.255.0"
push "route 192.168.45.0 255.255.255.0"

# Индивидуальные настройки клиентов
client-config-dir /etc/openvpn/ccd

status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3

3. Указать сеть за Keenetic (CCD)

Файл /etc/openvpn/ccd/keenetic:

conf
iroute 192.168.45.0 255.255.255.0

Нужны обе директивы: route в server.conf направляет пакеты из ядра сервера в OpenVPN, а iroute внутри OpenVPN указывает, какому клиенту их отдать. Без route трафик в 192.168.45.0/24 в туннель не попадёт (так это описано в справке OpenVPN к --iroute).

Запуск сервера (в Ubuntu конфигурация из /etc/openvpn/server/ запускается шаблоном openvpn-server@):

bash
sudo mkdir -p /var/log/openvpn
sudo systemctl enable --now openvpn-server@server

4. Включить IP-форвардинг

bash
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-openvpn.conf
sudo sysctl --system

5. Настройка iptables (DNAT + SNAT)

Пример для:

  • Web-сервер: 192.168.45.230:443
  • PBX: 192.168.45.235:5060–5065 TCP, 10000–20000 UDP
bash
EXT_IF=enp3s0   # внешний интерфейс

# DNAT
iptables -t nat -A PREROUTING -i $EXT_IF -p tcp --dport 443        -j DNAT --to-destination 192.168.45.230
iptables -t nat -A PREROUTING -i $EXT_IF -p tcp --dport 5060:5065   -j DNAT --to-destination 192.168.45.235
iptables -t nat -A PREROUTING -i $EXT_IF -p udp --dport 10000:20000 -j DNAT --to-destination 192.168.45.235

# FORWARD (туда и обратно)
iptables -A FORWARD -i $EXT_IF -o tun0 -d 192.168.45.230 -p tcp --dport 443 \
  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $EXT_IF -o tun0 -d 192.168.45.235 -p tcp --dport 5060:5065 \
  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $EXT_IF -o tun0 -d 192.168.45.235 -p udp --dport 10000:20000 \
  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun0 -o $EXT_IF \
  -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SNAT (чтобы ответы шли через VPN-сервер)
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 192.168.45.0/24 -o tun0 -j MASQUERADE

Сохранить правила:

bash
netfilter-persistent save

6. Конфигурация клиента Keenetic

Файл keenetic.ovpn:

conf
client
dev tun
proto udp
remote <PUBLIC_IP_UBUNTU> 1194
resolv-retry infinite
nobind
persist-key
persist-tun

remote-cert-tls server
tls-auth ta.key 1
key-direction 1
auth SHA256
cipher AES-256-CBC
verb 3

<ca>
-----BEGIN CERTIFICATE-----
... ca.crt ...
-----END CERTIFICATE-----
</ca>

<cert>
-----BEGIN CERTIFICATE-----
... keenetic.crt ...
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
... keenetic.key ...
-----END PRIVATE KEY-----
</key>

<tls-auth>
-----BEGIN OpenVPN Static key V1-----
... ta.key ...
-----END OpenVPN Static key V1-----
</tls-auth>

Требования Keenetic к файлу (по документации производителя):

  • вся конфигурация, сертификаты и ключи — в одном файле;
  • только опции из справки OpenVPN 2.4, опции для IPv6 не поддерживаются;
  • закрытый ключ без пароля — ввести его в интерфейсе роутера негде;
  • файл не сохраняется в startup-config, резервную копию храните отдельно.

Строка cipher AES-256-CBC в клиенте — запасная: клиент OpenVPN 2.4 с согласованием шифров сообщает серверу о поддержке AES-256-GCM и AES-128-GCM, и сервер выберет GCM из своего списка data-ciphers.

Для работы OpenVPN на Keenetic нужен компонент «OpenVPN client and server». Подключение создаётся на странице Другие подключения → VPN-подключения → Создать подключение: тип — OpenVPN, содержимое keenetic.ovpn вставляется в поле конфигурации.

  • Отключите «Использовать для выхода в интернет», иначе весь трафик пойдёт в VPN.
  • Чтобы трафик из туннеля мог попасть в домашнюю сеть, в командной строке Keenetic переведите интерфейс в частный уровень безопасности и разрешите связь между частными интерфейсами (команды из примера site-to-site в документации Keenetic):
cli
(config)> interface OpenVPN0 security-level private
(config)> no isolate-private
(config)> system configuration save

Номер интерфейса (OpenVPN0) посмотрите командой show interface — он зависит от числа созданных подключений. Другие варианты VPN-клиента на Keenetic разобраны в статье Keenetic как VPN-клиент.


✅ Итог

Ubuntu-сервер выполняет роль VPN-шлюза, а Keenetic даёт доступ к своей локальной сети 192.168.45.0/24. Сервисы за роутером доступны снаружи через проброс портов на публичном адресе сервера.

// Contact

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Написать в Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Подтвердите, что вы не бот.

Написать и получить быстрый ответ