05 April 2006 @ 04:14 pm
VPN на IPsec в FreeBSD  
Задача построить VPN между двумя шлюзами FreeBSD решается следующим образом.

Исходные данные: две локальные сети, глобальная сеть; надо соединить локальные сети через глобальную. Шифрование — IPsec. Обмен ключами — racoon, которому скормили сертификаты. Сертификаты — самоподписанные X.509. Инфраструктуру обмена ключами с поднятием собственного CA городить не стал: зачем песцу аккордеон.

Лучшими источниками информации оказались, как и ожидалось, man ipsec, man racoon.conf, man setkey, man ifconfig. Кроме того, тут — ясно и четко про racoon и сертификаты, а вот про туннель в разных источниках по-разному, и не всегда работает.

Выбор алгоритмов шифрования, аутентификации и контроля целостности — дело вкуса. Сеансовые ключи генерируются по Диффи-Хеллману на основе сертификатов, то есть с помощью закрытого и открытого ключей RSA.



Более конкретно по всяким косякам.

Ядро надо пересобрать, чтобы работал IPsec, и включить поддержку IPsec и ссылку на его конфиг в /etc/rc.conf. Тут даже без комментариев.

Как делать туннель. Создается виртуальный интерфейс (ifconfig create gif0) на обеих машинах. Создается туннель (ifconfig gif0 tunnel A B) между внешними адресами двух шлюзов, привязанный к этому интерфейсу. Наконец, интерфейсу присваивается (ifconfig inet A B netmask) свой адрес и адрес соседа (как в p2p). Эти адреса могут быть фиктивными, а могут быть реальными. Похоже, эти присвоенные адреса — чисто для наглядности и отчетности.

Команда setkey spdadd, которая определяет ПБ (политику безопасности) IPsec, принимает две пары IP-адресов. Первая пара — адреса или сети, между которыми устанавливается защищенное соединение. Вторая пара в туннельном режиме определяет конечные точки SA (контекста безопасности), то есть «отрезок» сети, к которому будет применяться этот самый контекст безопасности. В моем случае первая пара — диапазоны внутренних адресов каждого шлюза, вторая пара — их же внешние адреса. В этом случае и шлюзы, и лежащие за ними сети видят друг друга. Если указать обе пары как внешние адреса, будет чепуха с редиректом и “TTL exceeded”. Если указать обе пары как внутренние, будет тоже чепуха: пакет наружу не вырвется. Если в первой паре указать не диапазоны, а просто IP-адреса, то шлюзы будут видеть друг друга, а сети, которые за шлюзами, видеть друг друга не будут, что вполне ожидаемо и логично.

Маршрут на соседскую локальную сеть задается на собственный локальный адрес сервера. Это чтобы ПБ и SA вообще были задействованы (см. выше). Маршрут не тупиковый: ПБ позаботится о том, чтобы пакет прошел куда следует.

На каталог с сертификатами надо накинуть права 0700, а на сами сертификаты — права 0400. Владелец и того, и другого — root/wheel. Иначе не будет никакого сала, причем без всяких сообщений об ошибке.

В racoon.conf надо прописать “my_identifier asn1dn” и “peers_identifier asn1dn”. Это значит, что racoon будет идентифицировать себя и своего соседа по отличительному имени из самого сертификата (ASN.1 Distinguishing Name). Иначе будет ошибка “failed to get subjectAltName”.

Кажется, всё.

P.S. Неделю подряд снились одни сертификаты и алгоритм шифрования DES. Сегодня наконец-то приснилась какая-то девица. Аж две. :)
 
 
( Post a new comment )
imp_27197[info]isatys@lj on April 5th, 2006 - 09:37 am
Да-да, вот сейчас этим и пытаюсь заниматься. :) MPD ковыряю. Впечатления постараюсь подробно описать, когда расковыряю до дна. :)
(Reply) (Parent) (Link)