Организация связи между серверами по OpenVPN на статических ключах

Часто перед системными администраторами возникает задача организовать защищенные каналы связи между серверами или офисами. Одним из наиболее удобных и, при этом, безопасных средств решения данной задачи является OpenVPN. Преимуществ у OpenVPN великое множество, среди которых есть и возможность работы как по UDP так и по TCP, выбрав любой доступный порт. openvpn

OpenVPN поддерживает три режима работы:

  • Сервер — режим, в котором OpenVPN запускается в режиме сервиса и ждет подключений от клиентов. При этом возможно множественное подключение к одному интерфейсу. Хорошо подходит для организации удаленного доступа сотрудников к офисной сети. Параметры адресации и маршрутов передаются клиенту автоматически.
  • Клиент — режим, позволяющий подключиться к серверу OpenVPN, существуют графические реализации для простой и удобной настройки.
  • Site-to-Site (точка-точка) — особенный режим, предназначенный для соединения только между двумя узлами и заранее заданными настройками внутренней адресации на обоих сторонах соединения.

Дополнительно хочу отметить, что для безопасной авторизации пользователей при подключении по клиент-серверной архитектуре следует использовать сертификаты, которые можно сгенерировать, например, с помощью программы XCA. Такой способ авторизации позволит отзывать сертификаты пользователей, которые больше не должны получать доступ к нашему vpn серверу, и, таким образом, гибко управлять доступом к системе.

При подключении же в режиме точка-точка (site-to-site) в большинстве случаев практичнее применять заранее сгенерированные ключи (pre shared keys) в связи с тем, что в таких соединениях, как правило, обе стороны администрируются и обслуживаются одним и тем же лицом и являются доверенными, а генерация и настройка такого соединения займет меньше времени. Давайте рассмотрим настройку такого соединения на примере.

Первым делом нам нужно определить, какие ip адреса будут использоваться для организации защищённого vpn канала (как правило, это публичные ip адреса серверов), какой протокол будет использоваться, какие адреса будут использоваться внутри нашего vpn канала. Выбор протокола между TCP и UDP позволяет использовать преимущества соответствующих протоколов, но они имеют и свои недостатки. В рамках данной статьи не будем вдаваться в подробности, а в большинстве случаев оптимальным будет применение протокола UDP, более того, по умолчанию он и используется в OpenVPN. Пусть, в примере внешние адреса наших узлов будут 1.1.1.1 на server1 и 2.2.2.2 на server2, а внутри туннеля будем использовать адреса 10.99.1.2 для server1 и 10.99.2.1 для server2. Обращу внимание, что для соединения точка-точка могут использоваться любые два адреса, не обязательно принадлежащие одной сети.

И так, с адресами определились, теперь допустим, что подключаться у нас будет второй сервер к первому — не смотря на равноправие, кто то всё же должен инициировать соединение.

Теперь информации достаточно для того, чтобы приступить к установке OpenVPN и настройке соединения. В нашем случае используется дистрибутив Centos 6.6, поэтому будем пользоваться пакетным менеджером yum. Для других дистрибутивов установка может незначительно отличаться. Для сокращения вывода я буду заменять не имеющий значения в рамках статьи вывод на многоточие.

[root@server1 ~]# yum install openvpn
...
Is this ok [y/N]: y
...
 Installing : openvpn-2.3.10-1.el6.x86_64 2/2
...
Complete!
[root@server1 ~]#

Аналогично повторяем установку и на server2. Теперь сгенерируем ключ шифрования для нашего соединения и запишем его в файл myvpn.key.

[root@server1 ~]# openvpn --genkey --secret myvpn.key

Содержимое файла ключа можно посмотреть любым тектовым редактором или отображающей текст утилитой. Например, так:

[root@server1 ~]# cat myvpn.key
#
# 2048 bit OpenVPN static key
#
——BEGIN OpenVPN Static key V1——
2f833e678521f3b74c9bd80c6b5a9947
9fba79967ca80764b968ecf1ac2e6d0e
3d0412ba958eadcc6c0390678b84dcd2
fb54a3d130b8f6cf2cb1bd0028dc7fbf
1fc5e9670dc20bf548d7285deda369a6
09c3a974817b109d5519c8893d8712a5
5809a2bcdc39ef69528f889e1a772efd
7d3fedc71c078c01f28ca1d3c2b5ad15
7b6ec33b340ef5f66030979aea61427b
24215df95f65375dd93d92164835dfbc
f6f61660b09aae94181786263517ff9d
892d61fe5d5a11361a8f660fd7fa096b
443f867377efecdf86de48ec2c9360a1
26bf04b5aaf85a385f88c0448f1498ff
378abc18e3346f688b359df41d24dd5e
d113c77803a9b9ab2ec010e2ca6001c2
——END OpenVPN Static key V1——
[root@server1 ~]#

Далее любым доступным способом нужно скопировать полученный ключ на второй сервер. Очень желательно чтобы канал связи, через который пересылается ключ, был защищенный во избежание заполучения ключа злоумышленниками. Так же можно просто скопировать содержимое файла как текст через ssh, а не перекачивать его именно как файл.

Теперь можно приступить к конфигурированию OpenVPN на обоих сторонах нашего соединения — назовём их условно сервер и клиент (хотя настраиваем мы режим site-to-site, что рассматривалось выше).

Конфигурационные файлы должны находиться в /etc/openvpn. В эту же папку рекомендуется скопировать и ключи. Пример рекомендуемого конфига для server1, являющегося сервером для данного подключения:

[root@server1 ~]# cat /etc/openvpn/myvpn.conf
port 10001
proto udp
dev tun-srv1
ifconfig 10.99.1.2 10.99.2.1
cipher aes-128-cbc
auth sha1
secret /etc/openvpn/myvpn.key
keepalive 10 120
persist-tun

И, соответственно, для server2, являющегося в данном соединении клиентом:

[root@server2 ~]# cat /etc/openvpn/myvpn.conf
port 10001
proto udp
remote 1.1.1.1
dev tun-myvpn
ifconfig 10.99.2.1 10.99.1.2
cipher aes-128-cbc
auth sha1
secret /etc/openvpn/myvpn.key
keepalive 10 120
persist-tun

Теперь необходимо запустить либо перезапустить службу openvpn на обоих сторонах туннеля:

[root@server1 ~]# service openvpn restart

После запуска туннелей должна установиться связь и начать проходить трафик между узлами. Убедиться в этом можно с помощью команды ping:

[root@server1 ~]# ping 10.99.2.1
PING 10.99.2.1 (10.99.2.1) 56(84) bytes of data.
64 bytes from 10.99.2.1: icmp_seq=1 ttl=127 time=1.45 ms
64 bytes from 10.99.2.1: icmp_seq=2 ttl=127 time=1.40 ms
64 bytes from 10.99.2.1: icmp_seq=3 ttl=127 time=1.23 ms
64 bytes from 10.99.2.1: icmp_seq=4 ttl=127 time=1.39 ms
64 bytes from 10.99.2.1: icmp_seq=5 ttl=127 time=1.63 ms
^C
— 10.99.2.1 ping statistics —
5 packets transmitted, 5 received, 0% packet loss, time 4742ms
rtt min/avg/max/mdev = 1.230/1.422/1.634/0.138 ms
[root@server1 ~]#

Если этого не произошло, то скорее всего проблема с настройкой iptables и закрытых портах. Для проверки можно iptables отключить, однако не забудьте обязательно включить его после проверки! Команда для отключения:

[root@server1 ~]# service iptables stop

После успешной проверки работы туннеля стоит добавить сервис openvpn в автозагрузку командой

[root@server1 ~]# chkconfig openvpn on

Всё, настройка завершена! Если вам требуется несколько туннелей — просто создайте необходимое количество конфигурационных файлов в /etc/openvpn. Если после прочтения статьи остались вопросы — я с радостью отвечу на них в комментариях!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *