Построение шифрованного канала между тонким сервером Favourite IS (FreeBSD) и маршрутизатором CISCO

Авторы статьи объясняют, как настроить безопасный зашифрованный канал между двумя узлами сети, один из которых является маршрутизатором CISCO, а другой - специализированным устройством с Favourite IS

["Ниеншанц-Телеком" (http://is.nnz.ru)]

Построение шифрованного канала между тонким сервером Favourite IS (FreeBSD) и маршрутизатором CISCO

Вступление

Шифрованный виртуальный канал строится на основе IPSec -протокола с целью обеспечить безопасную передачу данных по общедоступной (незащищенной) сети. Более подробно про IPSec можно почитать на www.securityfocus.com. Защита данных обеспечивается между двумя узлами сети. Зачастую она необходима для обмена информации между офисами одной компании . С подобной проблемой нам пришлось не раз столкнуться, и теперь хотим поделиться собственным опытом.


Принцип работы шифрованного канала


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 instll (?.....)

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 "sakane@kame.net";
peers_identifier user_fqdn "sakane@kame.net";
#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 (они должны совпадать).
.
Ссылки



Данная статья была любезно предоставлена компанией "Ниеншанц-Телеком", производителем компактного сервера Favourite IS на основе ОС UNIX, для предоставления Интернет-доступа и Интернет-сервисов. Взять сервер Favourite IS на тестирование можно, отправив запрос на адрес: Boginsky AT nnz.ru

[ опубликовано 26/04/2005 ]

"Ниеншанц-Телеком" (http://is.nnz.ru) - Построение шифрованного канала между тонким сервером Favourite IS (FreeBSD) и маршрутизатором CISCO   Версия для печати