Соединение нескольких офисов в одну сеть с помощью OpenVPN

()

Итак. Допустим что у некоторой фирмы есть несколько офисов в различных точках города (возможно даже земного шара - не суть важно) и нам нужно обеспечить максимально простой способ взаимодействия локальных сетей различных офисов между собой. Неплохим решением этой задачи будет объединение этих сетей посредством OpenVPN.

Итак. Уточним начальные условия:


Центральный офис (office-0):

Сервер под управлением Ubuntu Linux. Три сетевых интерфейса: eth0, eth1, eth2. Конфигурация следующая:

  • eth0: внешний интерфейс, имеющий реальный ip-адрес a.b.c.d.
  • eth1: первая локальная сеть: 192.168.1.1/24.
  • eth2: вторая локальная сеть: 192.168.2.1/24.

Офис 1 (office-1):

Под управлением Mandriva Linux. Два интерфейса:

  • eth0: внешний интерфейс, имеющий доступ к адресу a.b.c.d (каким либо образом).
  • eth1: локальная сеть: 192.168.3.1/24.

Офис 2 (office-2)

Сервер полностью аналогичен серверу в первом офисе, за исключением eth1: там адрес 192.168.4.1/24.


Объединять мы будем сервера в виртуальную сеть 192.168.10.0/24. Поэтому на всех серверах должен быть настроен NAT не только для "своих" сетей, но и для сети 192.168.10.0/24.

Будем считать что всё это уже сделано. Приступаем к установке и настройке OpenVPN-сервера:

apt-get install openvpn

Создаём файл конфигурации /etc/openvpn/server.conf следующего содержания:

mode server
tls-server
daemon

ifconfig 192.168.10.1 255.255.255.0

port 1194
proto tcp-server
dev tap
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/office-0.crt
key /etc/openvpn/keys/office-0.key
dh /etc/openvpn/keys/dh1024.pem
client-config-dir /etc/openvpn/ccd
push "route 192.168.10.0 255.255.255.0 192.168.10.1"
keepalive 10 120
client-to-client
comp-lzo
persist-key
persist-tun
verb 3
log-append /var/log/openvpn.log

Создаём каталог, в котором будут хранится индивидуальные настройки клиентов:

mkdir /etc/openvpn/ccd

Копируем скрипты для генерации ключей и создаём ключи:

cp -vR /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/
mkdir /etc/openvpn/2.0/keys
ln -s /etc/openvpn/2.0/keys /etc/openvpn/keys
cd /etc/openvpn/2.0/keys
source ./vars
./clean-all
./build-ca
./build-dh

# Ключ для центрального офиса
./build-key-server office-0

# Ключ для первого офиса
./build-key office-1

# Ключ для второго офиса
./build-key office-2

Входе выполнения этих команд будет задан ряд вопросов. Ответы на них вобщем-то очевидны, поэтому заострять на них внимание не будем.

Далее создаём файлы /etc/openvpn/ccd/office-1 и /etc/openvpn/ccd/office-2. Содержание первого:

# приcваиваем ip-адрес
ifconfig-push 192.168.10.101 255.255.255.0

# роутинг на сети центрального офиса
push "route 192.168.1.0 255.255.255.0 192.168.10.1"
push "route 192.168.2.0 255.255.255.0 192.168.10.1"

# роутинг на сеть второго офиса
push "route 192.168.4.0 255.255.255.0 192.168.10.102"

Содержание второго:

# присваиваем ip-адрес
ifconfig-push 192.168.10.102 255.255.255.0

# роутинг на сети центрального офиса
push "route 192.168.1.0 255.255.255.0 192.168.10.1"
push "route 192.168.2.0 255.255.255.0 192.168.10.1"

# роутинг на сеть первого офиса
push "route 192.168.3.0 255.255.255.0 192.168.10.101"

На этом настрока сервера завершена. Перезапускаем его:

/etc/init.d/openvpn restart

Убеждаемся что поднялся интерфейс tap0:

ifconfig tap0

Переходим к настройке офисов. Рассмотрим только один. Второй будет сделан аналогично, за исключением имён сертификатов.

Устанавливаем openvpn:

urpmi openvpn
mkdir /etc/openvpn/keys

Создаём файл конфигурации /etc/openvpn/client.conf:

client
dev tap
proto tcp

# адрес сервера в центрально офисе
remote a.b.c.d 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
ns-cert-type server
ca ca.crt
cert /etc/openvpn/keys/office-1.crt
key /etc/openvpn/keys/office-1.key
log-append /var/log/openvpn.log

Далее нам нужно поместить файлы office-1.* и ca.crt из каталога /etc/openvpn/keys сервера в каталог /etc/openvpn/keys клиента.

После этого запускаем сервис:

chkconfig openvpn on
service openvpn start

Убеждаемся что поднялся интерфейс:

ifconfig tap0

После настройки обоих офисов можно убедиться в работе сети попробовав пинговать из одного офиса какой-нибудь компьютер, расположенный в другом офисе.

На этом всё. Более подробную информацию можно найти в документации по openvpn.

Ключевые слова: openvpn, mandriva, ubuntu.

Комментарии:

bsw_m 2008-01-20 01:50:03 (#)

вобщем неплохо, статейка будет полезна тем, кто ниразу не сталкивался и не настраивал OpenVPN. Единственное что я бы добавилеще - это ping-restart в конфиг, для автоматического востановления кана после разрыва связи

MooSE 2008-01-20 10:46:12 (#)

> ping-restart в конфиг, для автоматического востановления кана после разрыва связи

Оно по умолчанию итак включено и работает. Проверено. :)

2008-01-28 01:30:26 (#)

пробовал в gentoo
строчки /usr/share/doc/openvpn/examples/easy-rsa/2.0 не оказалось, флага doc тоже небыло, зато был examples, в принципе сервак запускается без проблем, надо лишь скопировать примеры ключей в соответствующую папку, дальше пока не ковырялся:))) кстати как генерить ключи без данных скриптов тоже пока не понял...
завтра виртуальную машину настрою, попробую их соеденить:)

MooSE 2008-01-28 12:04:44 (#)

Ты не там ищешь. В генте оно похоже как и в мандриве - /usr/share/openvpn

И ключи из examples используют только самоубийцы:)

2008-01-28 12:17:22 (#)

Упс, точно... мне пока просто интересно запустить его, есть небольшие мысли, хочу попробовать реализовать. Насчет ключей - согласен, но все происходит в домашних условиях, так что пока это не критично для меня, главное потом не забыть их поменять:)

2008-01-29 00:21:41 (#)

Как это не странно звучит, но все работает:)) "Офисом" пока сделал виртуальную машину с кноппиксом:)) встает только один вопрос: почему у меня кривые руки и приходится все проверять по 3 раза? :(((

MooSE 2008-01-29 09:31:12 (#)

ХЗ...:) Все мы ошибаемся...:)

Igron 2009-01-21 14:30:51 (#)

Небольшой вопрос: как быть, если между двумя офисами два канала связи, которые периодически обрываются?

Я подозреваю, что нужно использовать метрики и поднимать два маршрута с разными метриками до офиса. Будет ли автоматически удаляться route на оборванном соединении и восстанавливаться при появлении? Будут ли обрываться уже установленные соединения в момент изменения активного роута?

MooSE 2009-01-21 14:44:22 (#)

нифуя:) всё куда как красивше. набери:

man openvpn


там есть много интересного на эту тему. например как можно указать два разных сервера, чтобы в случае неудачи с первым происходило соединение со вторым.

то есть делаешь так: свой сервер подключаешь обоим каналам и получается что у него два внешних ip. ну и дальше настраиваешь клиентам чтобы он коннектился на ip1 а в случае неудачи уходил на ip2 :)

вот и всё:)

Igron 2009-01-22 05:07:05 (#)

Спасибо, это как-то больше похоже на правильное решение.
Будем шаманить.

MooSE 2009-01-22 17:10:46 (#)

Не забудь рассказать чем кончилось:)

Anonymous 2009-08-23 23:35:56 (#)

Видимо ничем....

Anonymous 2010-10-14 15:36:02 (#)

в настройке клиента тока внеси корретикты:
вместо
ca ca.crt
с путем
ca /etc/openvpn/keys/ca.crt

а то ругается ) а так все ок )
да, и кто юзает фаерволы типа IPTABLES надо разрешить пакетики..
спасибо за статью!

Anonymous 2010-10-14 15:40:12 (#)

и также всем кто будет еще создавать подобное соединение не забывайте давать права на файлики! CHMOD 444 *.*
кстати линк в Мандриве хотя и работает,
ln -s /etc/openvpn/2.0/keys /etc/openvpn/keys
но демон упорно не видит файлы..
вообще не понял зачем такой наворот, просто скорировал в keys
2 тачки 2008.1 Мандривы законнектил - успешно )
для создания файликов в консоли cat >имя_файла
по окончании ввода CTRL+D

Anonymous 2011-05-18 12:02:17 (#)

1)как уже выше написали:
в настройке клиента тока внеси корретикты:
вместо
ca ca.crt
с путем
ca /etc/openvpn/keys/ca.crt

2)зачем нужна эта строка в конфиге server.conf?
push "route 192.168.10.0 255.255.255.0 192.168.10.1"

она же перекрывает действие настройки client-to-client, прописывая еще один маршрут с назначением 192.168.10.0, в результате чего не пингуются клиенты по айпишникам виртуальной сети. Если же убрать эту строку то маршрут выглядит так: 192.168.10.0 255.255.255.0 0.0.0.0 и все машины видят друг друга по виртуальным айпи отлично..

MooSE 2011-05-18 22:51:01 (#)

Цитата:

1)как уже выше написали:
в настройке клиента тока внеси корретикты:
вместо
ca ca.crt
с путем
ca /etc/openvpn/keys/ca.crt

Угу. Правильно.

Цитата:


2)зачем нужна эта строка в конфиге server.conf?
push "route 192.168.10.0 255.255.255.0 192.168.10.1"


Да. Тут либо client-to-client, либо вот эта строчка. Но на самом деле она не мешает если на центральной машине разрешена пересылка пакетов для 192.168.10.0/24 через соответствующий tap-интерфейс. Примерно вот так:
iptables -A FORWARD -s 192.168.10.0/255.255.255.0 -d 192.168.10.0/255.255.255.0 -i tap0 -o tap0 -j ACCEPT

Anonymous 2013-06-27 13:27:31 (#)

спасибо за статью) изложено отлично.
я только не понял почему тут используется TAP , а не TUN ?

tap - если я все верно понимаю для мостов.
но у нас маршрутизация так?

Anonymous 2013-06-28 12:59:25 (#)

Цитата:

спасибо за статью) изложено отлично.
я только не понял почему тут используется TAP , а не TUN ?

tap - если я все верно понимаю для мостов.
но у нас маршрутизация так?


Чем отличаются виртуальные устройства tun и tap?
О. TUN - туннель, соединение по которому указывается по типу: локальный IP < --- > удаленный IP. Например, при явном указании ifconfig:
--ifconfig 10.3.0.2 10.3.0.1
в этом примере 10.3.0.2 - локальный IP, 10.3.0.1 - удаленный IP
TAP - эмулирует виртуальную ethernet карточку, для которой требуется указывать локальный IP и маску подсети. Например:
--ifconfig 10.3.0.2 255.255.255.0

Anonymous 2013-06-28 14:54:46 (#)

Уважаемый Вадим подскажите пожалуйста, как сервер сопоставляет клиентов и сети за ними?
Например серваку пришел пакет для хоста 192.168.3.5
как он понимает, что пакет надо переслать клиенту 192.168.1.101?
Из пересылаемых клиенту данных, тех которые в /ccd/klient?

У уважением, Валерий.

MooSE 2013-07-01 05:02:19 (#)

Цитата:

Уважаемый Вадим подскажите пожалуйста, как сервер сопоставляет клиентов и сети за ними?
Например серваку пришел пакет для хоста 192.168.3.5
как он понимает, что пакет надо переслать клиенту 192.168.1.101?
Из пересылаемых клиенту данных, тех которые в /ccd/klient?

У уважением, Валерий.


openvpn в режиме "dev tap" создаёт сеть представляющую по сути виртуальный ethernet со всеми сопутствующими вещами, включая MAC-адреса. пакеты от клиента к клиенту хотя и идут через сервер, но если смотреть немного выше то пакет с 192.168.10.102 к 192.168.10.101 идёт напрямую, минуя 192.168.10.1.

Поскольку машина 192.168.10.102 знает что маршрутом для 192.168.3.5 является адрес 192.168.10.101, она получает MAC машины 192.168.10.101, и шлёт на него пакет с dstIP=192.168.3.5.

192.168.10.101 получив такой пакет принимает решение о дальнейших действиях руководствуясь своей таблицей маршрутизации.

Сам OpenVPN-сервер в данном примере распоряжается только маршрутизацией на втором уровне (по MAC-адресам).

Вообще рекомендую почитать про маршрутизации подробнее. Например неплохо написано тут

Anonymous 2013-07-02 16:51:04 (#)

спасибо Вам, что так быстро ответили)

Ваш ответ был мне очень полезен.
но возможно я несколько неточно задал вопрос
откуда клиенты берут маршруты я понял.
поясню подробней:
вот допустим хост в первой подсети(192.168.1.5) лезет по ip на шару хосту в 192.168.3.5
пакет с адресом назначения 192,168,3,5 приходит на vpn сервер-> натится попадает в подсеть 192.168.10.0

вот тут я не понимаю как сервер переслав пакет в сеть 192.168.10.0 сопоставляет что 192.168.10.101 шлюз 192.168.3.0?
Что его надо послать именно этому клиенту?
он же не делает широковещательную рассылку?)))

я так понял что на сервер надо прописать
route 192.168.3.0/24 192.168.10.101
route 192.168.4.0/24 192.168.10.102

подправьте если заблуждаюсь.

С уважением Валерий.


MooSE 2013-07-03 23:01:14 (#)

Цитата:


я так понял что на сервер надо прописать
route 192.168.3.0/24 192.168.10.101
route 192.168.4.0/24 192.168.10.102

подправьте если заблуждаюсь.

С уважением Валерий.



это нужно сделать если надо чтобы машины из центрального офиса могли использовать ресурсы из сетей филиалов. во всех остальных случаях будет замечательно работать и без этого:)

Anonymous 2013-07-11 15:49:18 (#)

Не попасть из центральной сети во вторую. Пинги на локальный интерфейс второго сервера проходят. Но не могу попасть на машины во второй сети. А машины из второй сети могут подключаться к компьютерам центрального офиса. Что посмотреть iptables или маршрутизацию?
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE