OpenVPN между двумя офисами: site-to-site на OpenVPN 2.6 и 2.7

OpenVPN между двумя офисами: site-to-site на OpenVPN 2.6 и 2.7

Связать два офиса или офис с ЦОДом так, чтобы компьютеры в обеих сетях видели друг друга, можно обычным OpenVPN. Живы две ветки: 2.7.8 вышла 7 октября 2026 года, 2.6.23 23 сентября, а в списке изменений 2.7 есть пара вещей, из-за которых старые инструкции уже не работают как раньше. Ниже схема site-to-site с сертификатами на Easy-RSA 3, конфиги сервера и клиента и маршруты между сетями.

Схема и адреса

Нужны две машины с Linux, по одной в каждом офисе: это может быть отдельный сервер, виртуалка или роутер с OpenVPN. Одна будет сервером, вторая клиентом. Сети офисов не должны пересекаться, например:

  • Офис A, сервер: 192.168.1.0/24.
  • Офис B, клиент: 192.168.2.0/24.
  • Туннель: 10.8.0.0/24.

У сервера снаружи должен быть открыт порт OpenVPN, обычно 1194/udp. Если в офисе A нет белого IP, сервер удобно поставить на VPS, а оба офиса подключить к нему клиентами.

Установка и сертификаты на Easy-RSA 3

В Ubuntu 24.04 из репозитория ставится OpenVPN 2.6 и Easy-RSA 3.1, в Ubuntu 26.04 уже OpenVPN 2.7 и Easy-RSA 3.2, это видно по пакетам Ubuntu. Старые команды Easy-RSA 2 вроде source vars, ./build-key-server и ./build-dh больше не работают, всё делается одной утилитой easyrsa:

sudo apt update && sudo apt install openvpn easy-rsa
make-cadir ~/openvpn-ca && cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca
./easyrsa build-server-full server nopass
./easyrsa build-client-full office-b nopass
openvpn --genkey tls-crypt ta.key

build-ca создаёт корневой сертификат, build-server-full и build-client-full выпускают ключ и сертификат сервера и клиента. Файлы лежат в pki/ca.crt, pki/issued/ и pki/private/. ta.key это общий ключ для tls-crypt: он шифрует служебный канал и отсекает сканеры ещё до TLS. Файл Diffie-Hellman больше не нужен, в OpenVPN 2.7 dh none стоит по умолчанию, а 2.6 понимает эту опцию сама.

Конфиг сервера

Скопируйте ca.crt, server.crt, server.key и ta.key в /etc/openvpn/server/ и создайте там office.conf:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh none
tls-crypt ta.key
topology subnet
server 10.8.0.0 255.255.255.0
client-config-dir ccd
route 192.168.2.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
keepalive 10 60
persist-key
persist-tun
user nobody
group nogroup
verb 3

Главное для связи сетей три строки. route говорит ядру сервера, что сеть офиса B живёт в туннеле. push route отдаёт клиенту маршрут в сеть офиса A. А client-config-dir подключает отдельный файл для клиента, где OpenVPN узнаёт, за каким именно клиентом стоит сеть B:

sudo mkdir -p /etc/openvpn/server/ccd
echo "iroute 192.168.2.0 255.255.255.0" | sudo tee /etc/openvpn/server/ccd/office-b
sudo systemctl enable --now openvpn-server@office
sudo systemctl status openvpn-server@office

Имя файла в ccd должно совпадать с CN клиентского сертификата, здесь office-b. Без iroute туннель поднимется, но пакеты в сеть B сервер внутри OpenVPN никуда не отправит. Строк cipher и comp-lzo в конфиге нет специально: шифр клиент и сервер договариваются сами, по умолчанию это AES-256-GCM, AES-128-GCM или CHACHA20-POLY1305, а сжатие при отправке в 2.7 убрали совсем.

Конфиг клиента во втором офисе

На машину офиса B перенесите ca.crt, office-b.crt, office-b.key и ta.key в /etc/openvpn/client/ и создайте office.conf:

client
dev tun
proto udp
remote vpn.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
ca ca.crt
cert office-b.crt
key office-b.key
tls-crypt ta.key
verb 3
sudo systemctl enable --now openvpn-client@office

Вместо vpn.example.com подставьте белый адрес или имя сервера. Если у вас осталась старая схема со статическим ключом через secret без сертификатов, в 2.7 она по умолчанию выключена и будет удалена в 2.8, так что самое время переходить на сертификаты.

Маршруты, forwarding и проверка

Чтобы ходили не только сами VPN-машины, а все компьютеры офисов, на обеих сторонах включите пересылку пакетов:

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-openvpn.conf
sudo sysctl --system
  • Если VPN-машина не основной шлюз офиса, добавьте на роутере офиса A статический маршрут 192.168.2.0/24 через её адрес, а в офисе B маршрут 192.168.1.0/24 через свою VPN-машину. Без этого ответы из локальной сети уйдут не в туннель, а в интернет.
  • Если маршрут на роутере поставить нельзя, выручит NAT на VPN-машине: iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE. Но тогда в логах второго офиса все обращения будут с одного адреса.
  • В файрволе разрешите пересылку между tun0 и локальной сетью и откройте наружу только порт OpenVPN.
  • Проверяйте связь с обычного компьютера в сети A до компьютера в сети B и обратно, а не только ping между 10.8.0.x. Маршруты смотрите через ip r, туннель через ip a, логи через journalctl -u openvpn-server@office -f.

Что ещё стоит сделать

  • Держите ключ CA отдельно от сервера, на нём он нужен только для выпуска новых сертификатов.
  • Уволился сотрудник или закрылся филиал: ./easyrsa revoke имя, потом ./easyrsa gen-crl и crl-verify в конфиге сервера.
  • Подключайте третий офис так же: новый сертификат, файл в ccd с iroute, route в server.conf и push route для остальных.

Если хочется, чтобы туннель между офисами поднял и настроил кто-то другой, могу сделать это под ключ. По прайс-листу «Настройка VPS» стоит от 10 000 ₽: Linux, файрвол, SSL, бэкапы и запуск проекта, VPN считается по объёму.

В итоге site-to-site на OpenVPN держится на трёх вещах: сертификаты от Easy-RSA 3 с tls-crypt, согласованные маршруты route, push route и iroute, и включённая пересылка с правилами файрвола. На свежих версиях конфиг стал короче: без dh-файла, без cipher и без сжатия.

Источники и ссылки


Комментарии загружаются…