Виртуальная частная сеть (часть I).
О-о, это странное место Камчатка,
О-о, это сладкое слово "Камчатка".
В. Цой.
О-о, это сладкое слово "Камчатка".
В. Цой.
Введение.
VPN (Virtual Private Network — виртуальная частная сеть) — название семейства технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например, Интернет). В зависимости от применяемых протоколов и назначения, VPN может обеспечивать соединения трёх видов: узел-узел, узел-сеть и сеть-сеть.
Материал из Википедии — свободной энциклопедии.
В статье будем рассматривать практическое применение данной технологии на основе набора протоколов IPsec.
Краткий обзор IPsec.
IPsec (IP Security) – это расширение протокола IPv4, которое предоставляет шифрование и аутентификацию в сети. Изначально IPsec был разработан для IPv6 и является неотъемлемой его частью. IPsec работает на сетевом уровне модели OSI, что дает возможность реализовать прозрачную работу для пользователей и приложений.
IPsec состоит из протоколов для инкапсуляции, аутентификации, шифрования и обмена ключами AH (Authentication Header – Заголовок Аутентификации), ESP (Encapsulating Security Payload – Инкапсулированные Защищенные Данные) и IKE (Internet Key Exchange – Обмен Ключами через Интернет).
AH несет аутентификационную информацию, обычно это ключи в MD5 или SHA. AH используется только для аутентификации и проверяет, что отправители действительно те, за кого себя выдают. AH не производит шифрования.
ESP может использоваться как для шифрования, так и для аутентификации. Он может использоваться как с AH, так и без него (лучше без него). Обычно шифрование происходит с использованием блочного шифра (симметричный или раздельно-ключевой шифр, состоящий из текстовых блоков фиксированного размера) и 3DES.
IKE устанавливает параметры соединения, включая инициализацию, обработку и обновление ключей шифрования. Аутентификация производится с использованием общих секретов (например, секретных фраз) или криптографических RSA ключей, которые гарантируют идентичность обеих частей.
Различают два режима применения ESP и AH (а также их комбинации) - транспортный и туннельный.
Транспортный режим используется для шифрования поля данных IP пакета, содержащего протоколы транспортного уровня (TCP, UDP, ICMP), который, в свою очередь, содержит информацию прикладных служб. Примером применения транспортного режима является передача электронной почты. Все промежуточные узлы на маршруте пакета от отправителя к получателю используют только открытую информацию сетевого уровня и, возможно, некоторые опциональные заголовки пакета (в IPv6). Недостатком транспортного режима является отсутствие механизмов скрытия конкретных отправителя и получателя пакета, а также возможность проведения анализа трафика. Результатом такого анализа может стать информация об объемах и направлениях передачи информации, области интересов абонентов, расположение руководителей.
Туннельный режим предполагает шифрование всего пакета, включая заголовок сетевого уровня. Туннельный режим применяется в случае необходимости скрытия информационного обмена организации с внешним миром. При этом, адресные поля заголовка сетевого уровня пакета, использующего туннельный режим, заполняются межсетевым экраном организации и не содержат информации о конкретном отправителе пакета. При передаче информации из внешнего мира в локальную сеть организации в качестве адреса назначения используется сетевой адрес межсетевого экрана. После расшифровки межсетевым экраном начального заголовка сетевого уровня пакет направляется получателю.
Для работы IPsec использует так называемые Security Associations (Ассоциации Безопасности) и Security Policy (Политики Безопасности). Для практической части этой статьи нам необходимо иметь базовое представление о них.
Security Associations (SA). Для возможности проводить инкапсуляцию/декапсуляцию стороны участвующие в процессе обмена должны иметь возможность хранить секретные ключи, алгоритмы и IP адреса. Вся эта информация хранится в Ассоциациях Безопасности (SA), SA в свою очередь хранятся в Базе данных Ассоциаций Безопасности (SAD).
Security Policy (SP) - политика безопасности, хранится в SPD (База данных политик безопасности). SA специфицирует, как IPsec предполагает защищать трафик, SPD в свою очередь хранит дополнительную информацию, необходимую для определения какой именно трафик защищать и когда.
На этом, обзор технологии закончим, за дополнительной информацией обращайтесь к литературе.
Тип соединения «сеть-сеть».
Логическая схема.
Начнём с наиболее подходящей (на мой взгляд) интерпретации хитрой аббревиатуры VPN, то есть соединение «сеть-сеть».
На рис. выше отображена виртуальная сеть 10.0.0.0/8 состоящая из трёх удалённых друг от друга департамента. Сплошной линией обозначено физические сетевые подключения, точечной линией обозначено виртуальные соединения (туннельный режим IPsec). Желтое облако – локальная сеть (все соединения внутри доверенные). Серое облако – внешняя сеть Internet (небезопасная сеть). Синий цилиндр – маршрутизатор (также выполняет функцию IPsec маршрутизатора). Кирпичная стена – брандмауэр (независимое устройство, либо программный процесс на маршрутизаторе).
Давайте подробно рассмотрим сеть.
Локальная сеть с маршрутизатором “AIR” – сеть класса B с адресом 10.10.0.0/16. В сети машины взаимодействуют между собой, любое внешнее соединение проходит через маршрутизатор. При поступлении IP пакета на маршрутизатор будет проверен адрес назначения:
- пункт назначения одна из сетей маршрутизатора (внешняя или
внутренняя) – поиск аппаратного адреса получателя и отправка (также
обработка пакета SNAT, если требуется);
- пункт назначения одна из сопряжённых виртуальных сетей (10.20.0.0/16
или 10.30.0.0/16) – создание туннеля (если до этого туннеля не было) и
отправка пакета в криптованный туннель;
- пункт назначения внешний адрес – обработка пакета SNAT и отправка на маршрутизатор провайдера.
Упрощённая схема взаимодействия на рисунке ниже.
Искренне надеюсь, что сейчас я смог передать идею. Ведь пора перейти к практическим действиям.
Конфигурация.
Приведённая ниже конфигурация применима для соединения локальных сетей в одну виртуальную частную сеть. Пример реализации будет основан на двух сетях с маршрутизаторами AIR и WATER, третий (четвёртый, пятый...) настраивается по образу и подобию. Требования к окружению следующие:
- маршрутизаторы настроены для базового предоставления сервиса шлюза своим локальным сетям (имеют минимум 2 сетевых интерфейса, включена функция форвардинга и NATа)
- «внешний» сетевой интерфейс маршрутизаторов имеет статический, публичный (не находится за NATом) IP-адрес.
- Операционная система GNU/Linux (kernel >= 2.6.10). Для настройки «по шагам» требуется Debian GNU/Linux или Ubuntu. (между прочим: при написании статьи для AIR использовалась Ubuntu8.04, для WATER - Debian5.0).
Для работы нам необходимы пакеты ipsec-tools и racoon.
ipsec-tools — утилиты конфигурирования ассоциаций и политик безопасности ядра linux (да-да IPsec встроен в ядро).
racoon — даемон обмена ключами. Ведет «переговоры» между сопряжёнными сетями устанавливая ассоциации безопасности первой (для себя ISAKMP SA) и второй (IPsec SA) фазы.
Устанавливаем
$ sudo apt-get update
$ sudo apt-get install racoon // ipsec-tools указан в зависимостях, можно явно не указывать
Во время установки ракун (racoon) потребует первоначальной конфигурации
Выбираем «Редактирование вручную» (в английской консоли «direct»).
Маршрутизатор AIR:
Учитывайте, что внешний адрес для AIR я пишу как 93.x.x.x, для WATER 94.x.x.x. Вы же используйте свои адреса.
Политики безопасности находятся в конфигурационном файле /etc/ipsec-tools.conf
Пропишем их:
flush; #сбросить ассоциации безопасности (SAD)
spdflush; # сбросить политики безопасности (SPD)
spdadd 10.10.0.0/16 10.20.0.0/16 any -P out ipsec
esp/tunnel/93.x.x.x-94.x.x.x/require; # добавление (SPD), исходящий трафик
spdadd 10.20.0.0/16 10.10.0.0/16 any -P in ipsec
esp/tunnel/94.x.x.x-93.x.x.x/require; # добавление (SPD), входящий трафик
Ассоциации безопасности генерируются автоматически в процессе переговоров участвующих сторон даемоном racoon, конфигурационный файл racoon /etc/racoon/racoon.conf
path pre_shared_key "/etc/racoon/psk.txt"; # путь к файлу содержащему шаренные ключи
path certificate "/etc/racoon/certs"; # путь к директории с сертификатами
listen {
isakmp 93.x.x.x[500]; # установка прослушивания даемона ip[port]
#isakmp_natt 93.x.x.x[4500]; # установка прослушивания используя NAT-T
strict_address;
}
remote 94.x.x.x { # IP нашего пира, тоесть публичный адрес маршрутизатора WATER
exchange_mode main,aggressive; # режим обмена, main - более безопасный
lifetime time 24 hour; # время жизни первой фазы
proposal { # секция определения предложений
encryption_algorithm 3des; # алгоритм криптования
hash_algorithm sha1; # алгоритм хеширования
authentication_method pre_shared_key; #метод аутентификации, у нас - шаренные ключи
dh_group modp1024; # группа Диффи-Хеллмана
}
generate_policy off; # отключаем генерацию политик безопасности
#nat_traversal (on | off | force); # пример использования nat-traversal
nat_traversal off; # отключаем nat-traversal
#ike_frag on; # фрагментация ike, используется для NAT-T, неиспользуем.
#esp_frag 552; # фрагментация esp пакета, используется для NAT-T, неиспользуем.
}
sainfo address 10.10.0.0/16 any address 10.20.0.0/16 any { # IPSEC SA
#pfs_group modp768;
pfs_group modp1024; # группа Диффи-Хеллмана
lifetime time 1 hour; # время жизни второй фазы
#lifetime time 5 min;
encryption_algorithm 3des; # алгоритм криптования
#authentication_algorithm hmac_md5;
authentication_algorithm hmac_sha1; # алгоритм аутентификации
compression_algorithm deflate; # алгоритм компрессии
}
Создаём шаренный ключ
$ dd if=/dev/urandom count=16 bs=1| xxd -ps
e2c1f209d41b9beb44e5a176af9eab41
Ключ необходимо прописать в файл /etc/racoon/psk.txt следующим образом:
94.x.x.x e2c1f209d41b9beb44e5a176af9eab41 # ip нашего пира (другой стороны)
Ключи указанные для примера в файле закомментируйте. Для своих конфигураций генерируйте свой ключ, не используйте приведённый здесь.
Маршрутизатор WATER:
/etc/ipsec-tools.conf:
flush; #сбросить ассоциации безопасности (SAD)
spdflush; # сбросить политики безопасности (SPD)
spdadd 10.20.0.0/16 10.10.0.0/16 any -P out ipsec
esp/tunnel/94.x.x.x-93.x.x.x/require;
spdadd 10.10.0.0/16 10.20.0.0/16 any -P in ipsec
esp/tunnel/93.x.x.x-94.x.x.x/require;
/etc/racoon/racoon.conf:
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";
listen {
isakmp 94.x.x.x[500];
#isakmp_natt 94.x.x.x[4500];
strict_address;
}
remote 93.x.x.x {
exchange_mode main,aggressive;
lifetime time 24 hour;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group modp1024;
}
generate_policy off;
nat_traversal off;
#ike_frag on;
#esp_frag 552;
}
sainfo address 10.20.0.0/16 any address 10.10.0.0/16 any {
#pfs_group modp768;
pfs_group modp1024;
lifetime time 1 hour;
#lifetime time 5 min;
encryption_algorithm 3des;
#authentication_algorithm hmac_md5;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}
/etc/racoon/psk.txt:
93.x.x.x e2c1f209d41b9beb44e5a176af9eab41
Настройки туннелей закончены, перезапускаем сервисы на сопряжённых маршрутизаторах:
$ sudo /etc/init.d/setkey restart
$ sudo /etc/init.d/racoon restart
Настройка IP-таблиц.
Добавьте в iptables следующие правила, ай-пи адреса и внешний сетевой интерфейс (eth0) измените на свои:
AIR
-A INPUT -i eth0 -s 94.x.x.x -p udp --sport 500 --dport 500 -j ACCEPT
-A INPUT -s 94.x.x.x -p esp -j ACCEPT
-A INPUT -s 10.20.0.0/16 -d 10.10.3.254 -m policy --dir in --pol ipsec --proto esp --mode tunnel --tunnel-src 94.x.x.x -j ACCEPT
-A FORWARD -s 10.20.0.0/16 -d 10.10.0.0/16 -m policy --dir in --pol
ipsec --proto esp --mode tunnel --tunnel-src 94.x.x.x -j ACCEPT
-A FORWARD -s 10.10.0.0/16 -d 10.20.0.0/16 -m policy --dir out --pol
ipsec --proto esp --mode tunnel --tunnel-dst 94.x.x.x -j ACCEPT
Если используете политику по умолчанию DROP в цепочке OUTPUT, то необходимы дополнительные правила:
-A OUTPUT -o eth0 -d 94.x.x.x -p udp --sport 500 --dport 500 -j ACCEPT
-A OUTPUT -d 94.x.x.x -p esp -j ACCEPT
-A OUTPUT -s 10.10.3.254 -d 10.20.0.0/16 -m policy --dir out --pol ipsec
--proto esp --mode tunnel --tunnel-dst 94.x.x.x -j ACCEPT
WATER
-A INPUT -i eth0 -s 93.x.x.x -p udp --sport 500 --dport 500 -j ACCEPT
-A INPUT -s 93.x.x.x -p esp -j ACCEPT
-A INPUT -s 10.10.0.0/16 -d 10.20.3.254 -m policy --dir in --pol ipsec --proto esp --mode tunnel --tunnel-src 93.x.x.x -j ACCEPT
-A FORWARD -s 10.10.0.0/16 -d 10.20.0.0/16 -m policy --dir in --pol
ipsec --proto esp --mode tunnel --tunnel-src 93.x.x.x -j ACCEPT
-A FORWARD -s 10.20.0.0/16 -d 10.10.0.0/16 -m policy --dir out --pol
ipsec --proto esp --mode tunnel --tunnel-dst 93.x.x.x -j ACCEPT
Для политики по умолчанию DROP в цепочке OUTPUT:
-A OUTPUT -o eth0 -d 93.x.x.x -p udp --sport 500 --dport 500 -j ACCEPT
-A OUTPUT -d 93.x.x.x -p esp -j ACCEPT
-A OUTPUT -s 10.20.3.254 -d 10.10.0.0/16 -m policy --dir out --pol ipsec
--proto esp --mode tunnel --tunnel-dst 93.x.x.x -j ACCEPT
Оба сервера скорей всего предоставляют сервис шлюза во внешнюю сеть Internet, и используют трансляцию адресов. Для туннелей трансляцию необходимо запретить, например:
-t nat -A POSTROUTING -o eth0 -s 10.10.0.0/16 -d ! 10.20.0.0/16 -j SNAT --to-source 93.x.x.x
для конкретного туннеля, или для всех
-t nat -I POSTROUTING 1 -p esp -j ACCEPT
Перезагрузите iptables.
За информацией по поводу настройки iptables можете обратиться к статьям «Брандмауэр - внешняя защита компьютера (iptables)» и «Брандмауэр - шлюз в интернет для локальной сети (iptables)» либо к исчерпывающей документации по ай-пи таблицам «Руководство по iptables».
Маршрутизация.
Связь по туннелю между маршрутизаторами не работает. Обусловлено это тем, что адрес отправителя не соответствует политикам безопасности (SP). Решается добавлением правила в таблицу маршрутизации следующего вида:
$sudo ip route add 10.20.0.0/16 dev eth0 src 10.10.3.254 # для AIR
$sudo ip route add 10.10.0.0/16 dev eth0 src 10.20.3.254 # для WATER
Для добавления правила при загрузке системы пропишите его в /etc/rc.local:
/sbin/ip route add 10.20.0.0/16 dev eth0 src 10.10.3.254 # для AIR
/sbin/ip route add 10.10.0.0/16 dev eth0 src 10.20.3.254 # для WATER
Тестирование.
Конфигурация виртуальной сети окончена, теперь можете проверить что у Вас получилось. Самое элементарное — пинг. Попробуйте пинг из одной сети в другую, с одного маршрутизатора на другой. Перезапустите racoon и setkey, теперь проделайте пинги в обратном направлении. Если где-то проблемы, очень важно определить при каких условиях они проявляются, это поможет сэкономить много времени.
Если Вы увидели «радостные ответы», хорошо. Нет, тоже не плохо.
Racoon ведёт логи в файле /var/log/daemon.log, смотрите его, там может быть ответ если проблемы. Также доступны две утилиты для IPsec setkey и racoonctl предоставляющие схожий функционал.
Коротко о setkey:
$sudo setket -D # будет выведен список текущих IPSEC SA (до поднятия туннеля ассоциаций не будет)
$sudo setket -DP # будет выведен список текущих IPSEC SP
Дополнительная информация man setkey, man racoonctl.
Технология NAT-Traversal.
В начале раздела "Конфигурация", в требованиях к окружению написано, что внешний интерфейс маршрутизатора обязан иметь публичный ip адрес. Это не совсем так, есть возможность использовать "серый" адрес используя технологию NAT-Traversal. Для включения технологии внесите следующие изменения в конфигурацию:
- в файле racoon.conf обоих маршрутизаторов раскомментируйте строки
isakmp_natt 93.x.x.x[4500];
ike_frag on;
включите NAT-T изменив строку
nat_traversal off; на nat_traversal on;
- в конфигурационных файлах найдите все пиры (внешние ip адреса маршрутизаторов) и измените соответственно Вашим "серым" адресам
- добавьте правила в iptables для порта 4500/udp
Если с первого раза не заработает, и Вы уверены что ошибок нет, не отчаивайтесь. Раскомментируйте esp_frag 552; - эта опция позволяет проходить самые "замысловатые" NATы и фаерволы. Увеличение размера фрагмента увеличивает производительность туннелей - пробуйте.
Примечание: использовать NAT-T с шаренными ключами небезопасно, необходима конфигурация с сертификатами (сертификаты рассмотрим во второй части статьи).
Право.
В некоторых государствах (Китай, Индия...) существуют правовые ограничения по использованию криптостойких алгоритмов. Перед использованием любых систем шифрования необходимо выяснить правомочность использования того или иного алгоритма в своей стране.
В нашем случае, было бы благоразумно использовать в качестве encryption_algorithm des, hash_algorithm md5, и для authentication_algorithm des при построении туннеля с Шеньженем. Считать сеть 10.30.0.0/16 частично-доверенной и ограничить доступ в/из этой сети только к действительно необходимым ей ресурсам средствами политик безопасности либо/и фаерволом.
Что будет дальше?
Во второй части планирую рассмотреть сертификаты, соединения типа "узел-сеть" и "узел-узел", компрессию трафика, конфигурацию RoadWarrior.
Приложение.
Приложение к статье содержит контрольный лист для проверки созданной конфигурации, либо шпаргалку для быстрой настройки не вникая в подробности. Приложение находится здесь.
Литература.
1. http://www.ipsec-howto.org
2. http://www.ixbt.com/comm/ipsecure.shtml
3. http://www.securitylab.ru/analytics/216242.php
4. http://www.opennet.ru/base/net/vpn_netbsd.txt.html
5. http://www.ciscolab.ru/2007/01/07/chto_takoe_ipsec.html
6. http://www.lacave.net/~fred/racoon/config.html
P.S: Рекомендации приведены в надежде, что они будут полезными, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
Немає коментарів:
Дописати коментар
Примітка: лише член цього блогу може опублікувати коментар.