- Одновременное использование нескольких OpenVPN на одном сервере
- 1. Службы OpenVPN должны использовать разные порты
- 2. Диапазон адресов виртуальной частной сети
- 3. Маршрутизация трафика для всех виртуальных частных сетей
- 4. Настройка локальных статичных адресов
- 5. Запуск и добавление второй и последующих служб OpenVPN в автозагрузку
- Несколько подключений OpenVPN на Ubuntu.
- Как настроить два openvpn клиента, чтобы они работали параллельно?
- OpenVPN: Как запретить/разрешить несколько подключений с одним сертификатом
Одновременное использование нескольких 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 адресов для виртуальной частной сети, например:
В дополнительных экземплярах службы OpenVPN должны использоваться другие диапазоны. Например, для второй службы можно указать следующий диапазон:
Для третьей службы можно указать следующий диапазон IP адресов и так далее:
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 '')" 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 '')" 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 выполните команду
4. Настройка локальных статичных адресов
Если вы использовали раздел «Как сделать статичные IP для клиентов OpenVPN» и добавляли записи вида «ifconfig-push 10.8.0.10 255.255.255.0» в файл «/etc/openvpn/ccd/client1», то вам нужно использовать другие имена клиентов для второй и последующих сетей OpenVPN, поскольку они используют другие диапазоны IP адресов виртуальной частной сети.
5. Запуск и добавление второй и последующих служб OpenVPN в автозагрузку
Обратите внимание, что с systemctl можно использовать команду вида
где — это файл конфигурации, который лежит в папке /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
Смотрите также:
Несколько подключений OpenVPN на Ubuntu.
В общем, возникла задача организовать несколько клиентов OpenVPN работающие параллельно. Опыта у меня не так много, поэтому тема мне не помогла.
Конфиг первого соединения:
client #connect to VPN server remote XX.XX.XX.XX 443 proto tcp #DNS server to use dhcp-option DNS 8.8.8.8 #remove to use your ISP's gateway redirect-gateway def1 #your access keys ca /etc/openvpn/first_ca.crt cert /etc/openvpn/first.crt key /etc/openvpn/first.key ns-cert-type server #use virtual interface 'tap' dev tap #keep trying indefinitely to resolve the host name of the OpenVPN server. resolv-retry infinite #most clients don't need to bind to a specific local port number. nobind #try to preserve some state across restarts persist-key persist-tun #enable compression on the VPN link comp-lzo #set log file verbosity. verb 4 #silence repeating messages mute 20
Конфиг первого соединения:
client #connect to VPN server remote YY.YY.YY.YY 443 proto tcp #DNS server to use dhcp-option DNS 8.8.8.8 #remove to use your ISP's gateway redirect-gateway def1 #your access keys ca /etc/openvpn/second_ca.crt cert /etc/openvpn/second.crt key /etc/openvpn/second.key ns-cert-type server #use virtual interface 'tap' dev tap #keep trying indefinitely to resolve the host name of the OpenVPN server. resolv-retry infinite #most clients don't need to bind to a specific local port number. nobind #try to preserve some state across restarts persist-key persist-tun #enable compression on the VPN link comp-lzo #set log file verbosity. verb 4 #silence repeating messages mute 20
Первое соединение запускается без проблем, а вот при запуске второго командой
openvpn —config client2.ovpn —writepid /var/run/openvpn/client2.pid
в консоле проскакивает следующее:
Fri Nov 14 04:08:42 2014 us=513310 ERROR: Linux route add command failed: external program exited with error status: 2 Fri Nov 14 04:08:42 2014 us=514053 Initialization Sequence Completed
Fri Nov 14 04:08:42 2014 us=499865 /sbin/ip addr add dev tap1 10.113.196.181/11 broadcast 10.127.255.255 Fri Nov 14 04:08:42 2014 us=503509 /sbin/ip route add 185.29.8.155/32 via 192.168.9.2 Fri Nov 14 04:08:42 2014 us=507119 /sbin/ip route add 0.0.0.0/1 via 10.113.192.1 RTNETLINK answers: File exists
Причём, если второе соединение будет UDP (порт 1194), то всё равно не поднимется. Как собственно правильно поднимать последующие соединения? Заранее благодарен за помощь.
Как настроить два openvpn клиента, чтобы они работали параллельно?
У меня есть два клиента openvpn которые я беру с ресурса VpnGate. Они выглядят примерно следующем образом:
;http-proxy-retry
;http-proxy [proxy server] [proxy port]
cipher AES-128-CBC
auth SHA1
resolv-retry infinite
nobind
persist-key
persist-tun
client
verb 3
;http-proxy-retry
;http-proxy [proxy server] [proxy port]
cipher AES-128-CBC
auth SHA1
resolv-retry infinite
nobind
persist-key
persist-tun
client
verb 3
Когда я запускаю tun1, то весь трафик идет через tun0 (т.к. он был первым запущен). ip route глядит вот так:
- 0.0.0.0/1 via 10.237.25.78 dev tun0
- default via 192.168.0.1 dev enp4s0f1 proto dhcp metric 100
- 10.237.25.78 dev tun0 proto kernel scope link src 10.237.25.77
- 10.243.75.138 dev tun1 proto kernel scope link src 10.243.75.137
- 128.0.0.0/1 via 10.237.25.78 dev tun0
- 169.254.0.0/16 dev enp4s0f1 scope link metric 1000
- 192.168.0.0/24 dev enp4s0f1 proto kernel scope link src 192.168.0.180 metric 100
- 219.100.37.73 via 192.168.0.1 dev enp4s0f1
- 219.100.37.169 via 192.168.0.1 dev enp4s0f1
Я добавляла выдуманные подсети по типу 0.0.0.0/2 для tun1, или 127.255.255.255 (тоже для tun1). Но и сама понимаю, что такое подобное делать, скорее всего, глупо. Что нужно сделать, чтобы решить мою проблему? Мой преподаватель по компьютерным сетям мне не отвечает( Возможно, это нужно сделать при помощи iptables
OpenVPN: Как запретить/разрешить несколько подключений с одним сертификатом
OpenVPN позволяет разрешить конкурентные (одновременные) подключения пользователей с одним сертификатом. Для этого в конфигурационном файле server.conf используется опция duplicate-cn.
Если к серверу без опции duplicate-cn подключился второй пользователе с тем же сертификатом, то сессия первого пользователя будет отключена. Благодаря опции duplicate-cn ваш OpenVPN сервер сможет поддерживать несколько активных подключений с одним сертификатом. Количество таких одновременных сессий можно ограничить скриптом.
Сертификаты клиентов OpenVPN, настроенных по TCP, конфликтуют друг с другом, если несколько устройств подключены с одним и тем же сертификатом. При использовании UDP протокол в качестве транспорта OpenVPN, одинаковые сертификаты не вызывают конфликта.
Рассмотрим, как разрешить конкурентные подключения на сервере OpenVPN и ограничить их количество.
Добавьте следующе параметры в конфигурационный файл сервера:
duplicate-cn script-security 2 up /etc/openvpn/connection_sript.sh client-connect /etc/openvpn/connection_sript.sh client-disconnect /etc/openvpn/connection_sript.sh
- duplicate-cn — разрешает одновременные подключения
- script-security 2 — разрешает запуск внешних скриптов
- up, client-connect, client-disconnect — переменные окружения для передачи в скрипт
Создайте файл скрипта /etc/openvpn/connection_sript.sh со следующим кодом:
#!/bin/bash PERSIST_DIR=/tmp/open mkdir -p $PERSIST_DIR # владелицам $PERSIST_DIR должен быть пользователь, от которого запущен OpenVPN chown nobody:nobody $PERSIST_DIR function handle_connect < CLIENTFILE=$PERSIST_DIR/$common_name if [ -e "$CLIENTFILE" ]; then NUMCONN=$(cat $CLIENTFILE) NEWCONN=$(expr $NUMCONN + 1) # разрешить не более одного одновременного подключения с одним сертификатом if [ $NEWCONN -gt 1 ]; then exit 1; fi echo $NEWCONN >$CLIENTFILE else echo 1 >$CLIENTFILE fi > function handle_disconnect < CLIENTFILE=$PERSIST_DIR/$common_name if [ -e "$CLIENTFILE" ]; then NUMCONN=$(cat $CLIENTFILE) NEWCONN=$(expr $NUMCONN - 1) echo $NEWCONN >$CLIENTFILE fi > case "$script_type" in up) rm -f $PERSIST_DIR/$common_name ;; client-connect) "handle_connect" ;; client-disconnect) "handle_disconnect" ;; esac
Затем задайте права на скрипт:
chown nobody:nobody connectScript.sh
chmod 755 connectScript.sh
Выполните валидацию конфигурации и перезапустите сервис:
openvpn —config openvpn.conf
service openvpn restart
Добавьте в конфигурационный файл на стороне клиентов OpenVPN параметр:
Данный параметр заставляет клиента уведомлять сервер OpenVPN о разъединении сессии.