zaLinux.ru

Одновременное использование нескольких OpenVPN на одном сервере


Вы можете одновременно использовать сразу несколько OpenVPN процессов на одном сервере, при этом они будут работать на разных портах и предоставлять отдельные виртуальные частные сети, не пересекающиеся друг с другом.

Работа нескольких экземпляров OpenVPN предусмотрена из коробки, но требуется дополнительная настройка.

1. Службы OpenVPN должны использовать разные порты

Все OpenVPN службы должны использовать свободный порт. Помните, что одинаковые номера портов UDP и TCP являются разными портами, то есть, можно использовать одинаковый номер порта в двух экземплярах OpenVPN при условии, что один из них является UDP портом, а другой TCP портом.

Если две службы OpenVPN используют одинаковый порт, то запускаемый первый экземпляр OpenVPN будет работать без ошибок, а второй экземпляр не запустится из-за ошибки «TCP/UDP: Socket bind failed on local address [AF_INET][undef]:…: Address already in use (errno=98)», например::

2021-11-02 09:26:50 us=736094 TCP/UDP: Socket bind failed on local address [AF_INET][undef]:53: Address already in use (errno=98)
2021-11-02 09:26:50 us=736216 Exiting due to fatal error

2. Диапазон адресов виртуальной частной сети

По умолчанию в конфигурационном файле сервера указывается диапазон IP адресов для виртуальной частной сети, например:

server 10.8.0.0 255.255.255.0

В дополнительных экземплярах службы OpenVPN должны использоваться другие диапазоны. Например, для второй службы можно указать следующий диапазон:

server 10.8.1.0 255.255.255.0

Для третьей службы можно указать следующий диапазон IP адресов и так далее:

server 10.8.2.0 255.255.255.0

3. Маршрутизация трафика для всех виртуальных частных сетей

В разделе «Включение маршрутизации трафика на OpenVPN сервере» показано как включить NAT для трафика виртуальных частных сетей, чтобы они могли делать подключения в сеть Интернет. В примере из указанного раздела показана настройка маршрутизации для трафика из подсети 10.8.1.0/24. Поскольку для дополнительных экземпляров службы OpenVPN используются другие подсети (например, 10.8.1.0/24), то для того, чтобы клиенты данных виртуальных сетей могли выходить в Интернет, необходимо настроить маршрутизацию для каждой из данных сетей.

Пример исходного содержимого файла /root/bin/vpn_route.sh:


#!/bin/sh
 
# укажите имя интерфейса, иначе скрипт попытается выбрать его автоматически
#DEV='eth0'
DEV='ens3'
PRIVATE=10.8.0.0/24
 
if [ -z "$DEV" ]; then
	DEV="$(ip route | grep default | head -n 1 | awk '{print $5}')"
fi
# Включаем форвардинг пакетов, чтобы из туннельного интерфейса
# они попадали на внешний интерфейс
sysctl net.ipv4.ip_forward=1
# Убеждаемся, что iptables не блокируют перенаправляемый трафик:
iptables -I FORWARD -j ACCEPT
# Преобразование адресов (NAT) для приходящих из туннеля пакетов
# При включенной пересылке пакеты по умолчанию перенаправляются 
# с исходным адресом без изменений, то есть в нашем случае 10.8.0.*
# такие пакеты либо удаляются на шлюзе ISP, либо даже если они
# отправляются в пункт назначения, ответ никогда не находит обратного пути.
# Эти частные адреса не маршрутизируются в Интернете.
#
# Решением является преобразование адресов (NAT) исходящего трафика, 
# то есть заменить частный 10.8.0.* адрес общедоступным IP адресом VPN-сервера. 
# Это позволит ответам достичь VPN-сервера, 
# и там они будут отправлены обратно в туннель.
iptables -t nat -I POSTROUTING -s $PRIVATE -o $DEV -j MASQUERADE

Файл /root/bin/vpn_route.sh в который добавлен NAT для подсетей 10.8.1.0/24 и 10.8.2.0/24:

#!/bin/sh
 
DEV='ens3'
PRIVATE=10.8.0.0/24
 
if [ -z "$DEV" ]; then
	DEV="$(ip route | grep default | head -n 1 | awk '{print $5}')"
fi

sysctl net.ipv4.ip_forward=1

iptables -I FORWARD -j ACCEPT

iptables -t nat -I POSTROUTING -s $PRIVATE -o $DEV -j MASQUERADE

iptables -t nat -I POSTROUTING -s 10.8.1.0/24 -o $DEV -j MASQUERADE

iptables -t nat -I POSTROUTING -s 10.8.2.0/24 -o $DEV -j MASQUERADE

Чтобы проверить настройки NAT выполните команду

iptables -L -t nat

4. Настройка локальных статичных адресов

Если вы использовали раздел «Как сделать статичные IP для клиентов OpenVPN» и добавляли записи вида «ifconfig-push 10.8.0.10 255.255.255.0» в файл «/etc/openvpn/ccd/client1», то вам нужно использовать другие имена клиентов для второй и последующих сетей OpenVPN, поскольку они используют другие диапазоны IP адресов виртуальной частной сети.

5. Запуск и добавление второй и последующих служб OpenVPN в автозагрузку

Обратите внимание, что с systemctl можно использовать команду вида

openvpn-server@<configuration>.service

где <configuration> - это файл конфигурации, который лежит в папке /etc/openvpn/server/, но без расширения .conf

К примеру, вторая настройки для второго экземпляра службы OpenVPN помещены в файл /etc/openvpn/server/server-tcp.conf, тогда программа для запуска службы следующая:

sudo systemctl start openvpn-server@server-tcp.service

Проверка статуса службы с конфигурационным файлом server-tcp.conf:

systemctl status openvpn-server@server-tcp.service

Просмотр ошибок службы OpenVPN с конфигурационным файлом server-tcp.conf:

journalctl -xeu openvpn-server@server-tcp.service

Добавление службы в автозагрузку:

sudo systemctl enable openvpn-server@server-tcp.service

Смотрите также:



Рекомендуемые статьи:

2 Комментарии

  1. Евгений

    Options error: In [CMD-LINE]:1: Error opening configuration file: server.conf

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

    1. Alexey (Автор записи)

      А у меня работает одновременно сразу три службы OpenVPN, настроенных по этой инструкции:

      Не знаю, что ещё сказать на ваше неинформативное сообщение.

      Хотя бы написали, это сообщение выдаёт второй или первый экземпляр. Судя по сообщению, не получается открыть конфигурационный файл server.conf. То есть вы или переименовали файл server.conf, либо он у вас помещён в неправильную папку, либо установлены неправильные права доступа или что-то ещё похожее.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *