Dragos Ruiu 2006-02-28
Перевод: Сгибнев Михаил
В этой короткой статье показано, как за 4 минуты поднять полнофункциональный
IPSec VPN между двумя машинами со свежеустановленной ОС OpenBSD.
До недавнего времени установка решений IPSec с открытым исходным кодом была до горечи
сложным и запутанным процессом.
Много людей разочаровались в IPSec после того, как впервые посмотрели на ужасную и сложную
документацию, решив вместо этого установить какой-либо коммерческий SSL VPN, кажущийся намного более простым.
Те, кто боролся с хаосом SA, ESP, AH, SPI, CA, сертификатов, FIFO, IKE и жаргоном описания политик в RFC заработали
немало головных болей. Однако, недавно появился свет в конце тоннеля - настройка IPSec под OpenBSD.
В этой короткой статье показано, как за 4 минуты поднять полнофункциональный
IPSec VPN между двумя машинами со свежеустановленной ОС OpenBSD.
Целью этой статьи, конечно же, заключается не в том, чтобы дать исчерпывающий обзор всех опций,
доступных в IPSec или OpenBSD, а в том, чтобы показать, как быстро и легко мы
можем осуществить то, что у других занимает недели и месяцы.
Введение в ipsecctl OpenBSD
Вы, возможно, не обратили внимание на то, что в OpenBSD 3.8 появилась новая команда:
ipsecctl.
И это действительно замечательно. Эта команда обеспечивает так необходимый уровень абстракции
ко всему очень гибкому, но ужасно запутанному механизму IPSec.
В реальной жизни, большинство людей не нуждается и в половине
конфигурации и опций протокола, обеспечиваемых IPSec, таким образом, необходимость этого уровня абстракции
черезвычайно велика.
Если ваша цель состоит в том, чтобы просто организовать Virtual Private Network (VPN) между
между двумя сайтами (сетями, офисами и т.д),
то конфигурирование, которое необходимо было сделать, было просто ужасным и бутылка пива была необходимой утилитой.
Теперь этих мучений больше нет!
Теперь, с помощью ipsecctl, VPN может быть установлен просто редактируя один файл
конфигурации OpenBSD:
/etc/ipsec.conf.
В качестве тестa, мой коллега Шон Комео и я взяли два, только-только
установленных брандмауэра на базе OpenBSD в конфигурации по умолчанию и редактировали три файла.
Мы изменили в общей сложности семь строк конфигурации на каждой системе,
после чего получили IPSec VPN между нашими двумя сайтами в течение четырех минут после первой начальной загрузки.
Те, кто ранее не сталкивался с процессом установки OpenBSD, найдут его удивительно простым.
Два самых популярных способа - установка в CD-ROM и FTP.
В этой статье мы предположим, что у вас есть две готовые к запуску машины с OpenBSD.
Учтите, что если вы обновили систему через CVS до OpenBSD 3.8-stable или OpenBSD 3.8-current,
обе машины в вашем VPN должны быть одинаковых версий.
Пример IPSec
Обозначим цели, которые мы хотим достигнуть: мы хотим объединить две удаленные сети
через Виртуальную Частную Сеть IPSec (VPN). Обе сети используют
OpenBSD Network Address Translation (NAT).
Сеть А
Внешний IP адрес: 1.2.3.4, диапазон внутренних адресов: 10.1.1.0/24
Сеть В
Внешний IP адрес: 5.6.7.8, диапазон внутренних адресов: 10.2.2.0/24
Файл конфигурации PF, предоставляющего службы
брандмауэра и NAT, называется
/etc/pf.conf.
На обеих системах в этом примере,
pf.conf должен выглядеть следующим образом:
ext_if="fxp0"
int_if="fxp1"
set skip on { lo $int_if }
nat on $ext_if ftom !($ext_if) -> ($ext_if:0)
block in
pass out keep state
На обоих системах включен форвардинг пакетов, расскоментировав
опцию
"net.ip.forwarding=1" в
/etc/sysctl.conf, так как он необходим для функционирования службы NAT.
Теперь, когда у нас есть две должным образом настроенные системы, приступим к настройке VPN.
Шаг 1. конфигурируем IPSec
Добавим следущие строки к файлу
/etc/ipsec.conf на маршрутизаторе А:
ike esp from 10.1.1.0/24 to 10.2.2.0/24 peer 5.6.7.8
ike esp from 1.2.3.4 to 10.2.2.0/24 peer 5.6.7.8
ike esp from 1.2.3.4 to 5.6.7.8
В том же файле на маршрутизаторе В:
ike passive esp from 10.2.2.0/24 to 10.1.1.0/24 peer 1.2.3.4
ike passive esp from 5.6.7.8 to 10.1.1.0/24 peer 1.2.3.4
ike passive esp from 5.6.7.8 to 1.2.3.4
Ключ
passive указывает на то, что маршрутизатор А инициирует соединение, а
маршрутизатор В готовится принять вызов.
Шаг 2. Пропускаем IPSec через брандмауэр
На маршрутизаторе А добавляем следущее в
/etc/pf.conf:
pass quick on $ext_if from 5.6.7.8
И заменяем строку
"set skip" с:
set skip on { lo $int_if }
на:
set skip on { lo $int_if enc0 }
Таким образом мы добвим инкапсулированный интерфейс enc0 в список.
Теперь очередь маршрутизатора В. Добавим следущи строки в
/etc/pf.conf:
pass quick on $ext_if from 1.2.3.4
set skip on { lo $int_if enc0 }
Поскольку мы подготовили firewall/NAT и IPSec, приступим к копированию ключей.
Шаг 3. Копируем ключи isakmpd на каждую машину
На маршрутизатор A (1.2.3.4) копируем /etc/isakmpd/private/local.pub с
маршрутизатора В в /etc/isakmpd/pubkeys/ipv4/5.6.7.8.
Аналогично, на маршрутизатор В (1.2.3.4) копируем /etc/isakmpd/private/local.pub с
маршрутизатора А в /etc/isakmpd/pubkeys/ipv4/1.2.3.4.
Обратите внимание, что хотя в данном примере и использованы IP адреса, можно совершенно
спокойно использовать имена FQDN. При использовании доменных имен храните ключи в
каталоге
/etc/isakmpd/pubkeys/fqdn и ключи
srcid и
dstid в
/etc/ipsec.conf.
Шаг 4. Запуск VPN
Для установления VPN соединения выполните следущие команды:
isakmpd -K
ipsecctl -f /etc/ipsec.conf
Примите наши поздравления, IPSec VPN должен работать.
Вы, наверное будете рады узнать, что ipsecctl самостоятельно сконфигурировало
isakmpd и все его ужасные файлы конфигурации, и выбрало хорошие, понятные и безопасные значения по умолчанию.
Опция
-K указывает
isakmpd не загружать правила конфигурации.
Теперь давайте проверим наш VPN. Вы должны быть в состоянии пинговать узлы из сети
10.2.2.* с узлов сети 10.1.1.* и наоборот. Если связи нет, попробуйте запустить isakmpd с
опцией отладки isakmpd-K-d, чтобы получить больше отладочной информации.
Шаг 5. Автоматический запуск после перезагрузки
Запускаемые при старте системы демоны прописываются в файле
/etc/rc.conf.
Добавьте в него следущие строки:
isakmpd="-K"
PF=YES
Также необходимо убедиться в том, что
ipsecctl тоже запускается при начальной загрузке.
Для этого добавьте следущую строку в
/etc/rc.local:
ipsecctl -f /etc/ipsec.conf
В заключение, можно отредактировать файл
/etc/changelist на обоих маршрутизаторах, для того, чтобы убедиться,
что ваш новый
/etc/ipsec.conf там перечислен. Этот шаг не обязателен, но позволит посылать письма администратору
в случае любых изменений в вашей конфигурации IPSec. Для осуществления этой затеи необходимо указать ваш почтовый
адрес в
/etc/mail/aliases и выполнить команду
newaliases.
Если Вы знакомы с pf и pfctl, ipsecctl будет очень прост и приятен в управлении,
обеспечивая очень подобный интерфейс. Другими словами, вы можете получить состояние потоков ipsec и ca командой:
ipsecctl -sa
И так далее. Удивительно, но потребовалось больше чем десятилетие, для того,
чтобы наконец обеспечить простой и понятный интерфейс конфигурации IPSec.
Теперь этот процесс стал достаточно простым, для того, чтобы рекомендовать его новичкам в IPSec.
Заключение
В этой короткой статье мы рассмотрели, насколько просто установить IPSec VPN между двумя маршрутизаторами OpenBSD.
Мы начали с двух инсталляций по умолчанию и изменили в общей сложности семь строк в файлах конфигурации.
Вместо того, чтобы потратить дни или недели, чтобы IPSec VPN заработал, мы управились приблизительно за четыре минуты.
В качестве своего личного мнения скажу, что я хотел бы видеть,
что другие разработчики *BSD портируют этот инструментарий на свои системы.
Ipsecctl был разработан Matt Sauve-Frankel, программирование осуществлял Hans-Joerg Hoexer.
В настоящее время ipsecctl, кажется, не корректно работает с IPv6, но поддержка этого протокола
планируется в ближайшее время. Также отметьте, что могут быть различия, связанные с тем, что
ipsecctl отличается в CVS версиях 3.8-current и 3.8-stable. Поэтому рекомендуется чтобы обе системы
работали под управлением одинаковой версии OpenBSD.
Покупайте наших слонов!