Вопрос или проблема
У меня проблема с коммуникацией между двумя клиентами на моем сервере OpenVPN, который был настроен с помощью этого руководства.
На сервере OpenVPN в tun0 (172.16.0.0/24) есть три клиента:
- client1: 172.16.0.11
- client2: 172.16.0.10
- client3: 172.16.0.12
Директива “client-to-client” отключена, чтобы предотвратить общение клиентов друг с другом.
Моя цель – создать “группы”, чтобы позволить client1 и client2 общаться, но без возможности общения с ними client3.
Добавление правил iptables не приводит к разрешению коммуникации:
Цепочка FORWARD (политика DROP 7 пакетов, 364 байта)
pkts bytes target prot opt in out source destination
0 0 ACCEPT 0 -- tun0 tun0 172.16.0.10 172.16.0.11
0 0 ACCEPT 0 -- tun0 tun0 172.16.0.11 172.16.0.10
Однако включение “client-to-client” работает.
Я не знаю, связано ли это с тем, что мои правила iptables плохо настроены, или с какой-то настройкой в server.conf или конфигурации клиента.
Соответствующее правило в цепочке FORWARD
таблицы filter
не запускает переадресацию, оно только разрешает её.
Обычно, когда client-to-client
включен, маршрутизацию клиентов фактически выполняет процесс сервера openvpn. Маршрутизация операционной системой не задействована. Это связано с тем, что с точки зрения ОС все пакеты в VPN воспринимаются как приходящие из интерфейса tun*
или tap*
.
Возможно, имеется решение вашей проблемы, которое использует правила цепочки PREROUTING
в таблицах nat
или raw
, и/или используя хостовые маршруты, но без возможности экспериментов с ними я не уверен, что это за решение.
Вместо этого, позвольте мне предложить рассмотреть влан-тегирование. Ознакомьтесь с опцией сервера --vlan-tagging
, и опцией клиента --vlan-pvid
. Клиенты с одинаковым PVID смогут видеть друг друга, но клиенты с разным или отсутствующим/по умолчанию PVID не смогут. Учтите, что это требует использования устройства tap
вместо tun
, и может быть небезопасно (если вы не можете обеспечить выполнение каждого клиента значения PVID).
.
Ответ или решение
Для разрешения коммуникации между клиентами OpenVPN без использования директивы client-to-client
, необходимо учитывать несколько важных аспектов настройки IP-маршрутизации и правил брандмауэра. Данная задача предполагает наличие сети с адресами в диапазоне 172.16.0.0/24 и существующий запрет на прямую коммуникацию между всеми клиентами. Основная цель — обеспечить взаимодействие только между client1 и client2 (IP-адреса 172.16.0.11 и 172.16.0.10) с возможностью изоляции client3 (172.16.0.12). Разберем, как этого добиться, применяя подходы, не связанные с непосредственным включением client-to-client
.
Теория
По умолчанию, директива client-to-client
позволяет всем клиентам OpenVPN взаимодействовать между собой через сервер, маршрутизируя трафик между клиентами. Отключение этой опции требует альтернативных решений, таких как настройка правил фильтрации в iptables, использование устройств типа tun
и tap
, а также применение технологии VLAN.
Маршрутизация и IPtables
-
Маршрутизация и Forwarding: Сначала необходимо включить возможность пересылки пакетов на уровне ядра операционной системы. Это выполняется установкой параметра
net.ipv4.ip_forward=1
. Без этого изменения пакеты не будут пересылаться системой, независимо от правил iptables. -
Настройка IPTables: Правила iptables должны не только разрешать связи, но и правильно учитывать цепочки и таблицы, задействованные в маршрутизации. Правила в цепочке
FORWARD
только разрешают пересылку, но не инициируют её. Это значит, что для работы iptables вам нужно дополнительно указать корректные правила маршрутизации. Пример:sysctl -w net.ipv4.ip_forward=1 iptables -A FORWARD -i tun0 -s 172.16.0.10 -d 172.16.0.11 -j ACCEPT iptables -A FORWARD -i tun0 -s 172.16.0.11 -d 172.16.0.10 -j ACCEPT iptables -A FORWARD -i tun0 -s 172.16.0.0/24 -d 172.16.0.0/24 -j DROP
-
RAW и NAT: Иногда для более сложной настройки маршрутизации можно задействовать таблицы
nat
иraw
, например, цепочкаPREROUTING
может использоваться для изменений в ходе обработки пакетов перед их передачей в пользовательское пространство.
VLAN Тегирование
-
Использование VLAN: Возможность использования VLAN-тегирования в OpenVPN позволяет группировать клиенты, предоставляя каждому клиенту идентификатор VLAN (PVID), который группирует клиентов с одинаковыми PVID в одну логическую сеть. Это требует перехода с использования устройства типа
tun
наtap
.Конфигурация на стороне сервера может выглядеть так:
server-bridge --vlan-tagging
Клиенты настраиваются с указанием данного конфигурационного параметра:
--vlan-pvid 10 # для client1 и client2
Таким образом, хотя данный подход производит более изолированную среду для взаимодействия, он может быть восприимчив к злоупотреблениям, если не контролировать PVID для каждого из клиентов.
Применение
На практике, реализация антитрадиционных решений (без директивы client-to-client
) может быть технически сложной и сопряжена с необходимостью настройки маршрутизации на уровне системы, а также более продвинутых правил iptables. В данном случае требуется:
- Включить пересылку IP-пакетов на сервере, что является стандартной практикой для обеспечения корректной работы VPN-сетей.
- Создать индивидуальные правила в iptables для контроля над тем, какие клиенты имеют доступ друг к другу.
- Рассмотреть возможность использования VLAN для изоляции трафика между различными группами клиентов.
- Обеспечить, чтобы каждая конфигурация проходила тщательное тестирование, чтобы избежать нарушений в безопасности сети.
Эти шаги помогут достичь необходимой конфигурации, обеспечивая требуемую изоляцию клиентов и контролируемую возможность их взаимодействия внутри одной сети OpenVPN.