Как настроить доступ к серверу 1С через OpenVPN, если VPN-шлюз и сервер 1С находятся на одном хосте

Системный администратор IT и автоматизация бизнеса
← На главную

Организация удаленного доступа к 1С через VPN — стандартная задача для системного администратора. Однако часто возникает ситуация, когда VPN-сервер и сервер 1С:Предприятие развернуты на одной физической или виртуальной машине с одним внешним IP-адресом. В этом случае попытка завернуть весь трафик в туннель или добавить маршрут до внешнего IP сервера приводит к обрыву связи. Рассмотрим подробно, как решить эту проблему с помощью OpenVPN и dnsmasq.

Анализ проблемы: почему пакеты «не доходят» до сервера

Разберем классическую ситуацию: у вас есть сервер с внешним адресом (WAN) и установленным OpenVPN. Вы хотите, чтобы клиенты подключались по VPN и работали с базой 1С. Если вы попытаетесь прописать на клиенте маршрут к внешнему IP-адресу сервера через туннель tun0, возникнет рекурсия. OpenVPN-пакет, содержащий внутри себя данные для 1С, попытается выйти через туннель, который сам же и создает. Это приведет к немедленной потере связи с сервером.

Проанализируем основные способы решения этой задачи:

  1. Использование разных IP-адресов: вынос VPN-шлюза на отдельный хост (или использование второго публичного IP).
  2. Правка файла hosts: указание на клиентах, что server1c.mydomain.ru — это внутренний адрес 10.8.0.1. Это неудобно, если сотрудники часто перемещаются между офисом и домом.
  3. Настройка Split-DNS: автоматическая подмена IP-адреса сервера через DNS-сервер внутри туннеля. Это самый элегантный и масштабируемый способ.

Шаг 1: Настройка серверной части OpenVPN

Для начала подготовим конфигурацию server.conf. Нам необходимо убедиться, что сервер корректно инициализирует туннель и передает клиентам нужные настройки DNS. Рассмотрим пример рабочей конфигурации:


port 1194
proto udp
dev tun
user nobody
group nobody
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
dh none
ecdhe-curve prime256v1
tls-crypt tls-crypt.key
ca ca.crt
cert server.crt
key server.key
auth SHA256
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
tls-server
tls-version-min 1.2
client-config-dir /etc/openvpn/ccd
status /var/log/openvpn/status.log
verb 3

Обратите внимание на отсутствие директивы push "redirect-gateway def1". Если мы хотим использовать "раздельное туннелирование" (Split Tunneling), чтобы только трафик к 1С шел через VPN, а интернет-трафик клиента — через его провайдера, эту опцию включать не нужно.

Шаг 2: Решение проблемы DNS через dnsmasq

Выясним причину, по которой 1С не подключается по доменному имени. Когда клиент запрашивает server1c.mydomain.ru, он получает внешний IP сервера. Чтобы клиент "увидел" сервер через туннель, нам нужно, чтобы это имя резолвилось в 10.8.0.1 (внутренний IP VPN-сервера).

Установим и настроим dnsmasq на Linux-сервере. Разберем ключевые параметры в файле /etc/dnsmasq.conf:


# Слушать только на интерфейсе VPN
interface=tun0
# Принудительно отдавать внутренний IP для сервера 1С
address=/server1c.mydomain.ru/10.8.0.1
# Не использовать системный /etc/resolv.conf, чтобы избежать петель
no-resolv
# Указать вышестоящие DNS для всех остальных запросов
server=8.8.8.8
server=1.1.1.1

Теперь в конфигурацию OpenVPN добавим передачу этого DNS-сервера клиенту:

push "dhcp-option DNS 10.8.0.1"

Важный нюанс: как обсуждалось в материалах форума, если dnsmasq ответит Query refused или ошибкой, клиент может не переключиться на вторичный DNS. Поэтому dnsmasq должен уметь разрешать не только внутренние имена, но и пересылать (forward) запросы во внешний мир, чтобы у пользователя продолжал работать интернет.

Шаг 3: Настройка Firewall и маршрутизации

Настроим прохождение трафика. Поскольку сервер 1С находится на той же машине, нам не нужен маскарадинг (NAT) для доступа к нему, но нам нужно разрешить входящие соединения на соответствующие порты 1С (обычно 1540, 1541, 1560-1591).

Проанализируем настройку зон в firewalld. Рекомендуется создать отдельную зону для VPN:


firewall-cmd --permanent --new-zone=openvpn
firewall-cmd --permanent --zone=openvpn --add-interface=tun0
firewall-cmd --permanent --zone=openvpn --add-service=dns
firewall-cmd --permanent --zone=openvpn --add-port=1540-1541/tcp
firewall-cmd --permanent --zone=openvpn --add-port=1560-1591/tcp
firewall-cmd --reload

Если же вы планируете выпускать клиентов через сервер в интернет, необходимо включить IP forwarding и маскарадинг на внешнем интерфейсе:

sysctl -w net.ipv4.ip_forward=1

firewall-cmd --zone=public --add-masquerade --permanent

Оптимизация работы 1С: MTU и производительность

Платформа 1С:Предприятие крайне чувствительна к задержкам и фрагментации пакетов. При использовании VPN размер полезных данных в пакете уменьшается из-за заголовков шифрования. Если стандартный MTU в 1500 байт будет превышен, начнется фрагментация, что приведет к "тормозам" интерфейса 1С.

Рассмотрим добавление следующих параметров в конфиг сервера и клиента:

tun-mtu 1500

mssfix 1450

Это ограничит максимальный размер сегмента TCP так, чтобы пакет с учетом всех заголовков VPN гарантированно пролезал в стандартный кадр Ethernet. Для современных систем также рекомендуется использовать cipher AES-256-GCM, так как он поддерживает аппаратное ускорение на большинстве современных процессоров и работает быстрее старых алгоритмов.

Итоги настройки

Мы проанализировали ситуацию и внедрили решение на базе Split-DNS. Посмотрим, что мы получили в итоге:

Такой подход позволяет динамическим сотрудникам работать из любой точки мира без необходимости ручной правки системных файлов и гарантирует стабильную работу 1С:Предприятия через OpenVPN.

← На главную