Ключевые слова:freebsd, cisco, ipsec, tunnel, crypt, (найти похожие документы)
From: ЗАО "Ниеншанц <dmn[at]nnz[dot]ru>
Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC)
Newsgroups: http://www.nnz.ru/Subject: Шифрованный канал между тонким сервером Favourite IS (FreeBSD) и Cisco
Оригинал: http://is.nnz.ru/html/recipe/is-cisco.html
Построение шифрованного канала между тонким сервером Favourite IS (FreeBSD) и
маршрутизатором CISCO
Вступление
----------
Шифрованный виртуальный канал строится на основе IPSec -протокола с
целью обеспечить безопасную передачу данных по общедоступной
(незащищенной) сети. Более подробно про IPSec можно почитать на
http://www.securityfocus.com/infocus/1616 . Защита данных
обеспечивается между двумя узлами сети. Зачастую она необходима для
обмена информации между офисами одной компании . С подобной проблемой
нам пришлось не раз столкнуться, и теперь хотим поделиться
собственным опытом.
Принцип работы шифрованного канала
----------------------------------
1) Аутентификация хостов (подтверждение, что это действительно те
хосты, которые надо, а не подставные) на основе preshared key - ключа,
который заранее был прописан в конфигурации этих хостов.
2) Формирование на каждом хосте пары ключей (открытый-закрытый), обмен
открытыми ключами.
3) Шифрация исходящего траффика - открытым ключом удалённого хоста, и
дешифрация - своим закрытым ключом (технология шифрации данных на
основе открытых ключей (RSA)), шифрование осуществляется 56-битным
ключом по методу encryption_algorithm des.
Принцип аутентификации и обмена открытыми ключами, которыми будет
шифроваться траффик:
1.C1 посылает С2 сообщение, содержащее открытый ключ С1 и набор
алгоритмов шифрования.
2.С2 посылает сообщение, которое содержит открытый ключ С2 вместе с
выбранным алгоритмом и подтверждением идентификации.
3.С1 посылает третье сообщение с подтверждением идентификации.
Затем все новые сообщения между С1 и С2 шифруются по установленному
алгоритму.
Задача
------
Перед нами стоит задача построить шифрованный канал между сервером
Favourite IS (ОС FreeBSD) и маршрутизатором Cisco. Для этого
настраивается поддержка протокола IPSec. Задаются правила, по которым
исходящие пакеты шифровать, а входящие - дешифровать. Затем
устанавливается сервер обмена ключами raacoon.
Решение
-------
Шаг 1.
------
На FreeBSD (Favourite IS) делаем нижеследующие действия:
1.Добавляем (если нет) поддержку gif в ядро. На версиях до 4.4R надо
указывать количество устройств, которое необходимо.
pseudo-device dgif [количество]
С версии 4.4R в этом нет необходимости, поэтому пишем pseudo-device gif
Пересобираем ядро -
config newKernel; make depend; make; make install
2.В rc.conf добавляем строку
gif_interfeces="gif0 gif1 gif[и так далее]" (Сколько нам надо).
3.В rc.conf добавляем на каждый нужный нам gif следующую строку:
gifconfig_gif[номер]="[realip.address.source.tunnel][realip.address.destination.tunnel]"
Тем самым задаём начальный и конечный реальные адреса тунеля, т.е.
пакет идущий по тунелю на самом деле будет пересылаться от ip адреса
realip.address.source.tunnel к up адресу
realip.address.destination.tunnel и обратно.
Примечание.
Здесь и далее принято FreeBSD - source, Cisco destination, т.е.
realip.address.destanation tunnel - реальный ip адрес тунеля на cisco
Ip.address.source.tunnel - виртуальный ip адрес тунеля на FreeBSD.
Примечание.
Важно, чтобы эти оба адреса были видны в сети, именно на них мы будем
"приземлять" сам туннель, т.е. они должны друг друга пинговать.
4. В rc.conf теперь добавляем уже сам туннель.
ifconfig_gif[номер]="inet [ip.address.source.tunnel] netmask 255.255.255.252"
Здесь мы задаём виртуальные адреса тунеля, т.е. адреса используемые
при маршрутизации траффика через тунель. Их выбирают из несуществующих
сетей 192.168/16, 10/8 и т.д., например 192.168.1.1 и 192.168.1.2.
5. Дбавляем маршрутизацию.
route add [сеть за cisco] [ip.address.destanation.tunnel
Шаг 2.
------
На стороне Сisco делается следующее:
Interface tunnel[число]
description [текстовое описание для удобства понимания конфигурацинных файлов]
ip address [ip.address.destanation.tunnel] 255.255.255.252
tunnel source [realip.address.destanation.tunnel]
tunnel destination [realip.address.source.tunnel]
tunnel mode ipip
Теперь в этот туннель с любого из концов его можно заворачивать
трафик. Например со стороны FreeBSD:
route add [сеть за cisco] [ip.address.destanation.tunnel]
На данный момент нешифрованный тунель между Cisco и FreeBSD должен
работать, т.е. на cisco должен выполняться ping ip.address.source.tunnel и,
соответсвенно, на FreeBSD ping ip.address.destanation.tunnel
Шаг 3.
------
Теперь шифруем туннель, т.е. настраиваем IPSec.
1.На FreeBSD в опции ядра необходимо добавить
options IPSEC
options IPSEC_ESP
options IPSEC_DEBUG
и пересобрать ядро (это можно было сделать при добавлении gif
устройств).
Для обмена ключами на FreeBSD ставим racoon- сервер работающий по
протоколу IKE, на cisco он встроен.
На cisco нужен IOS который поддерживает IPSec.
2.Конфигурация ipsec на cisco:
crypto isakmp policy 1 (или другой номер)
hash md5
authentication pre-share
lifetime 3600
crypto isakmp key [секретная фраза] address [realip.address.source.tunnel]
crypto ipsec transform-set [имя transform-а] esp-des esp-md5-mac
mode transport
crypto map [имя map] 1 (или другой номер) ipsec-isakmp
set peer [realip.address.source.tunnel]
set transform-set [имя transform-а]
set pfs group1
match address [номер access-list-а]
access-list [номер access-list-а] permit ip host [realip.address.source.tunnel] \
host [realip.address.destination.tunnel]
2.На нужные нам интерфейсы пишем:
crypto map [имя map] (произвольно выбираемое название из английских букв-цифр)
Это должен быть сам туннель и физический интерфейс, через который этот
туннель работает.
3.Начинаем настраивать FreeBSD.
Сначала делаем записи в rc.conf
ipsec_enable="YES"
И создаем файл в каталоге /etc с именем ipsec.conf. Пишем туда:
flush;
spdflush;
spdadd [realip.address.source.tunnel] [realip.address.destination.tunnel] any -P \
out ipsec esp/transport/[realip.address.source.tunnel]-[realip.address.destination.tunnel]/require;
spdadd [realip.address.destination.tunnel] [ralip.address.source.tunnel] any -P \
in ipsec esp/transport/[realip.address.destination.tunnel]-[realip.address.source.tunnel]/require;
Так мы определяем какой траффик шифровать. В данном случае мы
настраиваем шифрацию траффика между реальными ip адресами тунеля, т.е.
шифроваться будет только траффик идущий от
realip.address.source.tunnel к realip.address.destanation.tunnel. Это
соединение <<конечных машин>>.
В случае объединения сетей нужно добавлять
spdadd one.network second.network any -P out esp/transport//[realip.address.source.tunnel]-[realip.address.destination.tunnel]/require
и обратно (in).
Затем ставим из /usr/ports/secure - racoon. И настраиваем его.
Прописываем в /usr/local/etc/racoon/psk.txt
[ip.addrees.peer] [секретная фраза]
А файл конфигурации racoon.conf делаем приблизительно такого вида:
(в основном идут настройки по умолчанию)
------------------------------------------------------------------
# "path" must be placed before it should be used.
# You can overwrite which you defined, but it should not use due to
confusing.
path include "/usr/local/etc/racoon" ;
#include "remote.conf" ;
# search this file for pre_shared_key with various ID key.
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
# racoon will look for certificate file in the directory,
# if the certificate/certificate request payload is received.
#path certificate "/usr/local/etc/cert" ;
# "log" specifies logging level. It is followed by either "notify","debug"
# or "debug2".
log notify;
# "padding" defines some parameter of padding. You should not touch these.
padding
{
maximum_length 20; # maximum padding length.
randomize off; # enable randomize length.
strict_check off; # enable strict check.
exclusive_tail off; # extract last one octet.
}
(с каких адресов <<слушать>> запросы на обмен ключами или по умолчанию
все доступные интерфейсы)
# if no listen directive is specified, racoon will listen to all
# available interface addresses.
listen
{
#isakmp ::1 [7000];
#isakmp 202.249.11.124 [500];
#admin [7002]; # administrative's port by kmpstat.
#strict_address; # required all addresses must be bound.
}
# Specification of default various timer.
timer
{
# These value can be changed per remote node.
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend.
persend 1; # the number of packets per a send.
# timer for waiting to complete each phase.
phase1 30 sec;
phase2 15 sec;
}
remote anonymous
{
exchange_mode main,aggressive;
#exchange_mode aggressive,main;
doi ipsec_doi;
situation identity_only;
#my_identifier address;
my_identifier user_fqdn "[email protected]";
peers_identifier user_fqdn "[email protected]";
#certificate_type x509 "mycert" "mypriv";
nonce_size 16;
lifetime time 1 min; # sec,min,hour
initial_contact on;
support_mip6 on;
proposal_check obey; # obey, strict or claim
Важно!!! Здесь задаются парамтры шифрации и аутентификации. Они должны
соответсвовать тому, что написано на cisco.
proposal {
lifetime time 3600 sec; # sec,min,hour
encryption_algorithm des;
hash_algorithm md5;
authentication_method pre_shared_key ;
dh_group 1 ;
}
}
Важно!!! Здесь задаются парамтры шифрации и аутентификации. Они должны
соответсвовать тому, что написано на cisco.
sainfo anonymous
{
pfs_group 1;
lifetime time 3600 sec;
encryption_algorithm des ;
# authentication_algorithm hmac_md5;
authentication_algorithm non_auth;
compression_algorithm deflate ;
}
-------------------------------------------------------------------
4.Теперь перегружаем машину, предварительно убедившись, что racoon.sh
живет в /usr/local/etc/rc.d.
5.Делаем trace или ping с адреса сети, который должен шифроваться на
аналогичный адрес другой сети.
Обычно, если не идут пинги -это означает наличие какой - то проблемы с
шифрацией. Racoon тогда можно запустить в режиме foreground, повысив
denug leve (raccoon -F -dd)
Все должно состояться. Если не работает следует смотреть racoon.conf и
debug crypto isakmp
debug crypto ipsec
до того как оно заработает.
Там следует смотреть:
Если не поднимается phase 1, то значит, что могут быть проблемы с
отсуствием тунеля
(ip адреса не пингуются), не заданы или заданы с ошибками ключи
(preshared key) и ip адреса обменивающихся хостов.
Если не поднимается phase 2, то нужно сравнить настроеки шифрования и
режим шифрации transport/tunnel (они должны совпадать).
.
Ссылки
* http://www.opennet.me/base/net/ipsec_cisco.txt.html
* http://www.securityfocus.com/infocus/1616