Иногда бывает что на сервере приходится запускать по несколько инстансов openvpn-сервера. Бывает это чаще всего из-за того что один инстанс не умеет биндиться сразу на разных портах либо сразу на разных протоколах (TCP и UDP), поэтому приходится копировать конфиг и заменять в нем параметры port nnn или proto yyy, ну и подсети server x.x.x.x (Подразумивается что мы используем topology subnet, остальные параметры как правило не конфликтуют но бывают исключения). Новый конфиг приводит к созданию нового инстанса и нового интерфейса. Но что если вам нужно что бы узлы сетей OpenVPN могли работать друг с другом.

 

Итак есть 2 инстанса OpenVPN :

  1. Клиенты первого в подсети 10.8.0.0/24
  2. Второго в 10.8.1.0/24. 
  3. Айпи серверов 10.8.0.1 (интерфейс tun0) и 10.8.1.1(tun1) соответственно.
  4. В каждой подсети по клиенту 10.8.0.2 и 10.8.1.2.


Наша задача организовать между клиентами 10.8.1.2 на 10.8.0.2.

Маршруты

Самое главное на обоих клиентах мы должны добавить маршруты (роуты).

Например на 10.8.1.2 мы должны создать маршрут на сеть 10.8.0.0/24 через айпи 10.8.1.1 благодаря чему ОС будет знать что пакеты с адресом назначения 10.8.0.ххх надо на самом деле отправить на 10.8.1.1, таким образом они попадут на сервер и там появятся на интерфейсе tun1.

Вообще это можно делать вручную. Например на Windows так (проверить потом можно в route print):

route -p add 10.8.0.0 mask 255.255.255.0 10.8.1.1

На втором клиенте нужно все сделать по аналогии, допустим там у нас linux:

route add -net 10.8.1.0 netmask 255.255.255.0 gw 10.8.0.1

При ребуте клиентов эти настройки исчезнут если не принять мер.

Автонастрйка при подключении

На самом же деле настраивать все вручную далеко не обязательно - можно в настройку конфига просто добавить опцию push "route х.х.х.х маска". Это намного удобней.

Например для конфига нашей сети 10.8.1.0/24 это будет:

push "route 10.8.0.0 255.255.255.0"

Таким образом при переподключении мы получим такой же результат как и при ручной настройки.

IP Forward в sysctl

Изначально ядро не может в принципе бросать пакеты между интерфейсами. Что бы позволить ему это нужно в /etc/sysctl.conf нужно прописать или раскомментрировать:

net.ipv4.ip_forward=1

Ну и перечитать его:

sysctl --system

Настриваем iptables

 Ну и последнее добавляем правила фаервола на сервере:

iptables -A FORWARD -i tun1 -o tun0 -s 10.8.1.0/24 -d 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -i tun0 -o tun1 -s 10.8.0.0/24 -d 10.8.1.0/24 -j ACCEPT

С сохранением правил думаю вы справитесь.

English version of this post: https://maketips.net/tip/56/network-between-2-instances-of-openvpn