OpenVPN: частный случай p2p соединения

Рассмотрим весьма частный случай применения OpenVPN.

<a href="http://www.linuxetc.ru/?p=21" class="forlinuxetc">(Оригинал написан для linuxetc.ru)</a> Рассмотрим весьма частный случай применения OpenVPN.

Конфигурация сети:

<ol>
<li> Диспетчер, он же центральный хаб "звезды", он же VPN-сервер в стандартной схеме "клиент-сервер".
<li> Client1, по отношению к диспетчеру -- клиент.
<li> Client2, по отношению к диспетчеру -- клиент.
<li> Предполагается, что впоследствии появятся ещё Client3, ..., ClientN, и все они по отношению к диспетчеру будут суть клиенты.
</ol>

Считается, что VPN между диспетчером и каждым из клиентов уже настроен, то есть классическая "звезда" уже работает.

Требуется обеспечить симметричный p2p VPN-линк между Client1 и Client2. Другими словами, превратить "звезду" в полносвязку.

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

Так как Client1 и Client2 -- это равноправные сервера, делать кого-то формальным сервером не было ни желания, ни особого смысла. С учётом же возможности пояления Client3, ..., ClientN заводить N формальных серверов -- это неизбежно запутаться во всех них.
<!--break-->
Внимательное перечитывание man openvpn ("читайте доки -- они рулез!") привело к следующим двум отрывкам:

<pre>
Example 1: A simple tunnel without security
On may:

openvpn --remote june.kg --dev tun1 --ifconfig 10.4.0.1 10.4.0.2
--verb 9

On june:

openvpn --remote may.kg --dev tun1 --ifconfig 10.4.0.2 10.4.0.1
--verb 9
</pre>

и чуть ниже:

<pre>
Example 3: A tunnel with full TLS-based security
For this test, we will designate may as the TLS client and june as the
TLS server. Note that client or server designation only has meaning
for the TLS subsystem. It has no bearing on OpenVPN's peer-to-peer,
UDP-based communication model.

</pre>

Когда я понял, что OpenVPN по сути своей совершенно не требует клиент-серверной архитектуры, все дальнейшие действия стали ясны и понятны.

<b>Обратите внимание:</b> в дальнейших примерах части конфигов и имена файлов, уникальные для Client1 и Client2, выделены <i>курсивом</i>

<h3>Для Client1:</h3>

Создаём файл секретного ключа /etc/openvpn/client1_client2.key:

<pre>
сd /etc/openvpn
openvpn --genkey --secret client1_client2.key
</pre>

затем пишем файл <i>/etc/openvpn/client1_to_client2.conf</i>:

<blockquote>
<i>remote client2 1234</i>
port 1234
proto udp
ping 10

dev tun
<i>ifconfig 10.10.99.1 10.10.99.2</i>
secret client1_client2.key
comp-lzo

persist-key
persist-tun
verb 3
</blockquote>

и добавляем скрипт <i>/etc/init.d/openvpn.client1_to_client2</i> для запуска нового экземпляра openvpn (для Gentoo);

<pre>
cd /etc/init.d
ln -s openvpn openvpn.client1_to_client2
</pre>

<h3>Для Client2:</h3>

Файл /etc/openvpn/client1_client2.key берём с Client1.

Файл <i>/etc/openvpn/client2_to_client1.conf</i>:

<blockquote>
<i>remote client1 1234</i>
port 1234
proto udp
ping 10

dev tun
<i>ifconfig 10.10.99.1 10.10.99.2</i>
secret client1_client2.key
comp-lzo

persist-key
persist-tun
verb 3
</blockquote>

Скрипт <i>/etc/init.d/openvpn.client2_to_client1</i> для запуска нового экземпляра openvpn (опять же для Gentoo);

<pre>
cd /etc/init.d
ln -s openvpn openvpn.client2_to_client1
</pre>

<hr>

Несколько комментариев напоследок:

<ol>
<li>Для <b>данного</b> соединения выбран порт 1234. Для связи другой пары узлов в этой же полносвязке потребуется, очевидно, другой порт.
<li>В параметрах ifconfig указаны адреса, отсутствующие в местных сетях как Client1, так и Client2. Для связи другой пары узлов в этой же полносвязке потребуется другая пара адресов. Вероятно, имеет смысл брать адреса из одной и той же приватной подсети, например, 10.10.99.0/24 -- их хватит на полносвязку из 126 машин.
<li>Для идентификации выбран способ секретного ключа, чтобы не путаться в сертификатах.
</ol>

Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.