При использовании сервера OpenVPN TUN (уровень 3) с client-to-client
отключен, мои клиенты все еще могут разговаривать друг с другом.
Конфигурация клиент-клиент должна предотвратить это согласно документации:
Раскомментируйте директиву client-to-client, если вы хотите, чтобы клиенты могли связываться друг с другом через VPN. По умолчанию клиенты смогут подключиться только к серверу.
Почему клиенты могут продолжать общаться друг с другом, когда эта опция отключена?
Вот моя конфигурация сервера:
port 443
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh4096.pem
topology subnet
server 10.10.201.0 255.255.255.128
ifconfig-pool-persist ipp.txt
crl-verify /etc/openvpn/keys/crl.pem
push "route [omitted]"
push "dhcp-option DNS [omitted]"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
cipher AES-256-CBC
tls-auth /etc/openvpn/keys/pfs.key 0
verb 4
Если client-to-client
является включен, VPN-сервер пересылает пакеты клиент-клиент внутри себя, не отправляя их на IP-уровень хоста (то есть в ядро). Сетевой стек хоста вообще не видит эти пакеты.
.-------------------.
| IP Layer |
'-------------------'
.-------------------.
| TUN device (tun0) |
'-------------------'
.-------------------.
| OpenVPN server |
'-------------------'
^ |
1 | | 2
| v
.----------------. .----------------.
| Client a | | Client b |
'----------------' '----------------'
Если client-to-client
является отключенпакеты от клиента к другому клиенту проходят через уровень IP хоста (iptables, таблица маршрутизации и т. д.) машины, на которой размещен VPN-сервер: если IP-переадресация включена, хост может переслать пакет (используя свою таблицу маршрутизации) снова на интерфейс TUN, и демон VPN перешлет пакет правильному клиенту внутри туннеля.
.-------------------.
| IP Layer | (4) routing, firewall, NAT, etc.
'-------------------' (iptables, nftables, conntrack, tc, etc.)
^ |
3 | | 5
| v
.-------------------.
| TUN device (tun0) |
'-------------------'
^ |
2 | | 6
| v
.-------------------.
| OpenVPN server |
'-------------------'
^ |
1 | | 7
| v
.----------------. .----------------.
| Client a | | Client b |
'----------------' '----------------'
В таком случае (client-to-client
отключено), вы можете заблокировать пакеты клиент-клиент с помощью iptables:
iptables -A FORWARD -i tun0 -o tun0 -j DROP
где tun0
это ваш интерфейс VPN.
Вам нужно сделать больше, чем просто комментировать директиву, как она говорит Вот:
Раскомментируйте эту директиву, чтобы разные клиенты могли «видеть» друг друга. По умолчанию клиенты будут видеть только сервер. Чтобы заставить клиентов видеть только сервер, вам также необходимо соответствующим образом настроить брандмауэр интерфейса TUN / TAP сервера.
Поэтому вы можете настроить отдельную политику IP-адресов для каждого клиента. См. Раздел Настройка клиентских правил и политик доступа Вот: https://openvpn.net/index.php/open-source/documentation/howto.html. и тут: https://www.sbarjatiya.com/notes_wiki/index.php/Configuring_separate_IP_and_firewall_rule_for_each_openvpn_client.
Следующий абзац справочной страницы для openvpn
отвечает на этот вопрос, хотя при первом чтении это не обязательно ясно:
Поскольку режим сервера OpenVPN обрабатывает несколько клиентов через один интерфейс tun или tap, это фактически маршрутизатор. В
--client-to-client
flag указывает OpenVPN внутреннюю маршрутизацию межклиентского трафика, а не проталкивание всего исходящего от клиента трафика на интерфейс TUN / TAP.Когда используется эта опция, каждый клиент будет «видеть» других клиентов, которые в данный момент подключены. В противном случае каждый клиент будет видеть только сервер. Не используйте эту опцию, если вы хотите туннелировать трафик межсетевого экрана с использованием настраиваемых правил для каждого клиента.
В client-to-client
опция закорачивает обычные таблицы маршрутизации на сервере. Его удаление не мешает клиентам использовать таблицы маршрутизации сервера. Если эти таблицы маршрутизации - и конфигурация брандмауэра сервера - позволяют клиентам видеть друг друга, они смогут это сделать.