Задача построить 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. Сегодня наконец-то приснилась какая-то девица. Аж две. :)
Исходные данные: две локальные сети, глобальная сеть; надо соединить локальные сети через глобальную. Шифрование — 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. Сегодня наконец-то приснилась какая-то девица. Аж две. :)
2 комментария | Оставить комментарий