Ключевые слова:bsd, ipsec, crypt, tunnel, vpn, cisco, (найти похожие документы)
Date: Thu, 2 Jul 2002 12:54:01 +0000 (UTC)
From: Shevtsov P. <paul@dongorbank.com>
Subject: Настройка IPSec между FreeBSD и Cisco
--------------------------------------------------------------
Настройка IPSec между FreeBSD и cisco
--------------------------------------------------------------
Организация IPSec tunnel's между FreeBSD - FreeBSD и
FreeBSD - Cisco.
Используем на FreeBSD gif интерфейс, на cisco tunnel ipip.
Для это на FreeBSD делаем нижеследующие действия
1. Добавляем (если нет) поддержку gif я ядро. Примечание: на версиях до 4.4R надо было
указывать количество устройств, которое необходимо.
pseudo-device dif [количество]
С версии 4.4R в этом нет необходимости.
pseudo-device gif
2. В rc.conf добавляем строку
gif_interfeces="gif0 gif1 gif[и так далее]"
(Сколько нам надо).
3. В rc.conf добавляем на каждый нужный нам gif следующую строку
gifconfig_gif[номер]="[realip.address.source.tunnel] [realip.address.destination.tunnel]"
Примечание: важно чтобы эти оба адреса были видны в сети, именно на них мы будем "приземлять"
сам туннель. Т.е. они должны друг друга пинговать (другими словами).
4. В rc.conf теперь добавляем уже сам tunnel
ifconfig_gif[номер]="inet [ip.address.source.tunnel] \
[ip.address.destination.tunnel] netmask 255.255.255.252"
Внимание! Обратим внимание, что здесь поднимается по сути дела просто
point-to-point. Т.е. сеть размера /30 в CIDR нотации. Почему так. Ведь даже
на daemonnews приводят примеры, где маска берется 255.255.255.0 (по CIDR /24),
правда, там же сетуют, что таким образом можно объединять только сети
одинакового размера.
Еще один нюанс при этом в их примерах ip source и destination в туннеле берутся
прямо из сети, которая сидит на втором ethetrnet-е. А зачем?
А если у нас нет
второго интерфейса вообще на одном конце? Мы ведь все равно делаем свою
приватную сеть (как правило), так выделим тогда хоть, сколько адресов
специально для создания point-to-point туннелей, а в них будем раутить чего
хотим. На мой взгляд, так логичнее.
5. Собственно теперь в этот туннель с любого из концов его можно заворачивать
трафик.
С помощью gated в static это выглядит приблизительно так:
[ip.address.network.s] masklen [size] gw [ip.address.destination.tunnel] retain;
На стороне cisco все еще проще
Interface tunnel[число]
description [бла бла бла]
ip address [ip.address.source.tunnel] 255.255.255.252
tunnel source [realip.address.source.tunnel]
tunnel destination [realip.address.destination.tunnel]
tunnel mode ipip
Ну и трафик в него заворачивать
[ip.address.network.s] [netmask] tunnel[номер]
Или в ip адрес
[ip.address.network.s] [netmask] [ip.address.destination.tunnel]
Теперь поднимаем IPSec между cisco и FreeBSD.
На cisco нужен IOS который поддерживает IPSec.
На FreeBSD в опции ядра добавить
options IPSEC
options IPSEC_ESP
options IPSEC_DEBUG
Для обмена ключами на FreeBSD ставим racoon.
Конфигурация ipsec на cisco:
crypto isakmp policy 1 (или другой номер)
hash md5
authentication pre-share
lifetime 3600
crypto isakmp key [секретная фраза] address [realip.address.destination.tunnel]
crypto ipsec transform-set [имя transform-а] esp-des esp-md5-mac
mode transport
crypto map [имя map] 1 (или другой номер) ipsec-isakmp
set peer [realip.address.destination.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]
И на нужные нам интерфейсы говорим
crypto map [имя map]
(Это должен быть сам туннель и физический интерфейс, через который этот
туннель работает).
После этого начинаем настраивать 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;
Затем ставим из /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
proposal {
lifetime time 3600 sec; # sec,min,hour
encryption_algorithm des;
hash_algorithm md5;
authentication_method pre_shared_key ;
dh_group 1 ;
}
}
sainfo anonymous
{
pfs_group 1;
lifetime time 3600 sec;
encryption_algorithm des ;
# authentication_algorithm hmac_md5;
authentication_algorithm non_auth;
compression_algorithm deflate ;
}
-------------------------------------------------------------------
Теперь перегружаем машину (предварительно убедившись, что racoon.sh живет в /usr/local/etc/rc.d).
И делаем trace или ping с адреса сети, который должен шифроваться на аналогичный адрес другой сети.
Все должно состояться. Если не работает смотреть racoon.conf и debug crypto isakmp
debug crypto ipsec.
До того как оно заработает. IPSec между FreeBSD - FreeBSD поднимается аналогично.
P.S. Отдельная благодарность yk@donbass.net за потраченое время. :)
-----------------------------------------------------
1. Добавляем (если нет) поддержку gif я ядро. Примечание: на версиях до 4.4R надо было
указывать количество устройств, которое необходимо.
pseudo-device dif [количество]
С версии 4.4R в этом нет необходимости.
pseudo-device gif
-------------------------------------------
То что у тебя dif и gif это опечатки или так и надо?