Имеем следующее:
Есть виртуальная сеть поднятая посредством OpenVPN.
Сеть состоит из 5 серверов:
S1: WIP=1.1.1.1 Головной сервер, на котором стоит MySQL + Freeradius
S2: WIP=2.2.2.2 Рядовой сервер как и оставшиеся три, к ним подключаются клиенты. На борту OpenVPN(tcp + udp)
S3: WIP=3.3.3.3
S4: WIP=4.4.4.4
S5: WIP=5.5.5.5
*WIP - внешний IP сервера
На S1 запущен OpenVPN сервер, к которому подключаются все остальные сервера, подсеть 10.127.0.0/24 назовем её ServiceNet, сам сервер соответственно имеет IP=10.127.0.1, а остальные в соответствии со своим номером: (S2)IP=10.127.0.2; (S3)IP=10.127.0.3; (S4)IP=10.127.0.4; (S5)IP=10.127.0.5
Эта сеть сделана специально для управления серверами, а именно для работы серверов с Radius, сбора информации, и управления подключениями клиентов(а точнее их отключения).
Интерфейсы для ServiceNET на серверах:
S1=tun0
S2=tun0
S3=tun0
S4=tun0
S5=tun0
Для сервера S1 это все,на нем более никаких интерфейсов не будет.
На серверах S2-S5 идет одинаковое распределение интерфейсов под конкретные цели:
- tun1 - OpenVpn сервер по протоколу tcp
- tun2 - OpenVpn сервер по протоколу udp
- tun3 - reserved
- tun4 - reserved
Но у каждого сервера для клиентов своя подсеть:
- S2:
- tun1 - 10.128.2.0/25
- tun2 - 10.128.2.127/25
- S3:
- tun1 - 10.128.3.0/25
- tun2 - 10.128.3.127/25
- S4:
- tun1 - 10.128.4.0/25
- tun2 - 10.128.4.127/25
- S5:
- tun1 - 10.128.5.0/25
- tun2 - 10.128.5.127/25
Как вы наверно заметили третий октет соответствует номеру сервера, это сделано для определения какой клиент с какого сервера. Сразу отмечу что клиенты вынесены в отдельную 12-ти битную подсеть, не спроста, 10.127. нам еще пригодиться чуть ниже.
Корневые сертификаты и клиентский(он один для всех) на всех серверах едины, потому клиент может сам выбирать к какому подключиться, т.к. авторизация идет по Логину/паролю. Radius успешно сверяет данные и создает сессию, а OpenVpn стабильно и послушно отдает данные аккаунтинга Radius серверу, а тот пишет их в базу.
Идем далее... Каждый сервер соединен с другим по типу «звездочка» (или кому понятнее: «каждый к каждому»), назовем эту сеть RouteNet, т.к. это название наиболее полно отражает её предназначение =).
Не буду описывать логику по которой определяется какой сервер к какому подключается, опишу лишь то что считаю нужным.
Соединяются они с помощью OpenVPN типа p2p, что позволяет избавиться от накладных расходов по трафику и авторизации. На каждое такое соединение каждый сервер запускает свою копию OpenVPN (клиент/сервер) с отдельным интерфейсом и отдельными (не пересекающимися адресами). При соединении серверов Sx и Sy, серверу Sx будет присвоен IP=10.127.y.x а серверу Sy будет присвоен IP=10.127.x.y. Тогда при соединении S2 и S3 серверов они получат следующие IP:
- S2(IP)=10.127.3.2
- S3(IP)=10.127.2.3
Тем самым когда вся RouteNet соединиться, получаем удобное распределение адресов для маршрутизации. К примеру чтобы с S2 перенаправить трафик клиента на сервер S4 достаточно будет направить его на IP 10.127.2.4, соответственно для направления на S3 или S5, отправляем на адреса 10.127.2.3 и 10.127.2.5.
Поначалу может показаться сложным, но эту схему главно понять =)
Теперь когда пользователь подключается к сети, специально написанная прога берет из базы маршрут для него и прописывает на необходимые сервера. Опишу как это происходит.
на каждом сервере есть таблица в iproute2 следующего содержания:
ip ru list
0: from all lookup local
32762: from all fwmark 0x5 lookup to_srv5
32763: from all fwmark 0x4 lookup to_srv4
32764: from all fwmark 0x3 lookup to_srv3
32765: from all fwmark 0x2 lookup to_srv2
32766: from all lookup main
32767: from all lookup default
В которой конечно нету правила для самого себя (т.е. на сервере S2 не будет строки from all fwmark 0x2 lookup to_srv2).
ну и для каждой таблицы (to_srv2/to_srv3/etc..) прописан маршрут по умолчанию:
#ip ro ist table to_srv3
default via 10.127.2.3 dev tun7
это все настраивается единожды, при помощи самописного скрипта или ручками, не суть важно.
Теперь лишь остается помечать пакеты, для отправки, пакеты не помеченные шлются в соответствии с адресом назначения по правилам ip ro list
А теперь пояснительный пример:
Клиент user1 подключился к S2 и для него, в базе, записан маршрут S2-S5-S3. Что означает, что его трафик будет перенаправляться с S2 на S5, а с S5 на S3 и только потом выходить к адресу назначения. Обратный путь трафика точно такой же.
После подключения на S2 добавляется правило:
iptables -t mangle -A PREROUTING -s 10.128.2.2/32 -j MARK --set-mark 5
на S5 добавляется два правила:
iptables -t mangle -A PREROUTING -s 10.128.2.2/32 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -d 10.128.2.2/32 -j MARK --set-mark 2
на S3 добавляется одно хитрое правило которое пришлось чуть чуть поискать:
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate SNAT --ctorigsrc 10.128.2.2 -j MARK --set-mark 5
и трафик успешно гуляет от клиента и к клиенту.
таким образом добавляя динамические маршруты, мы гибко рулим трафиком и эффективно используем сеть. Не хватает лишь того из-за чего, я и обратился к вам.
Встала задача, чтоб клиенты могли пользоваться не только OpenVPN, а еще и стандартными средствами в Win/Mac/nix и мобильных устройствах. Я пока что вижу перспективу только у PPTPd или xl2tpd+ipsec, больше ничего не нашел, что может взаимодействовать с этими клиентскими платформами без установки доп.ПО.
Больше волнует следующее:
Пока что не удалось успешно настроить (xl2tpd/l2tpd)+ipsec а тем более подцепить к нему авторизацию Radius, но интересует следующее:
И конечно же выслушаю ваши предложения ПО которое поддерживается клиентскими платформами стандартно и может быть интегрировано в вышеописанную сеть.