Организация удаленного доступа к 1С через VPN — стандартная задача для системного администратора. Однако часто возникает ситуация, когда VPN-сервер и сервер 1С:Предприятие развернуты на одной физической или виртуальной машине с одним внешним IP-адресом. В этом случае попытка завернуть весь трафик в туннель или добавить маршрут до внешнего IP сервера приводит к обрыву связи. Рассмотрим подробно, как решить эту проблему с помощью OpenVPN и dnsmasq.
Разберем классическую ситуацию: у вас есть сервер с внешним адресом (WAN) и установленным OpenVPN. Вы хотите, чтобы клиенты подключались по VPN и работали с базой 1С. Если вы попытаетесь прописать на клиенте маршрут к внешнему IP-адресу сервера через туннель tun0, возникнет рекурсия. OpenVPN-пакет, содержащий внутри себя данные для 1С, попытается выйти через туннель, который сам же и создает. Это приведет к немедленной потере связи с сервером.
Проанализируем основные способы решения этой задачи:
server1c.mydomain.ru — это внутренний адрес 10.8.0.1. Это неудобно, если сотрудники часто перемещаются между офисом и домом.Для начала подготовим конфигурацию 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, а интернет-трафик клиента — через его провайдера, эту опцию включать не нужно.
Выясним причину, по которой 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) запросы во внешний мир, чтобы у пользователя продолжал работать интернет.
Настроим прохождение трафика. Поскольку сервер 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С:Предприятие крайне чувствительна к задержкам и фрагментации пакетов. При использовании VPN размер полезных данных в пакете уменьшается из-за заголовков шифрования. Если стандартный MTU в 1500 байт будет превышен, начнется фрагментация, что приведет к "тормозам" интерфейса 1С.
Рассмотрим добавление следующих параметров в конфиг сервера и клиента:
tun-mtu 1500
mssfix 1450
Это ограничит максимальный размер сегмента TCP так, чтобы пакет с учетом всех заголовков VPN гарантированно пролезал в стандартный кадр Ethernet. Для современных систем также рекомендуется использовать cipher AES-256-GCM, так как он поддерживает аппаратное ускорение на большинстве современных процессоров и работает быстрее старых алгоритмов.
Мы проанализировали ситуацию и внедрили решение на базе Split-DNS. Посмотрим, что мы получили в итоге:
vpn.mydomain.ru (внешний IP).10.8.0.1.server1c.mydomain.ru и мгновенно получает 10.8.0.1.Такой подход позволяет динамическим сотрудникам работать из любой точки мира без необходимости ручной правки системных файлов и гарантирует стабильную работу 1С:Предприятия через OpenVPN.