1. ВведениеВ данном документе описана методика создания и настройки шифрованного туннеля (IPSec) между маршрутизатором Cisco и сервером на базе ОС FreeBSD, соединенных через незащищенную публичную сеть.
Используемое оборудование:
ПК Celeron 366 MHz, 256 MB RAM, ОС FreeBSD 7.0 (далее - PC)
Маршрутизатор CISCO 2821 (далее - Cisco)
Схема организации связи и IP-адресации приведена на рис.1.
рис. 1
В рассматриваемой схеме защищенный туннель устанавливается между внешними IP-адресами PC (10.40.248.2) и Cisco (192.168.50.2). Шифрованию подлежит весь IP-трафик между локальными сетями 10.5.3.0/24, 10.5.4.0/24, с одной стороны, и сетью 10.11.16.0/23, с другой стороны.
2. Краткая теория IPSec
Напомним, что IPSec - набор протоколов сетевого уровня, предназначенных для шифрования и проверки подлинности IP-пакетов, а также для безопасного обмена ключами аутентификации.
Установление защищенных соединений, или туннелей является функцией протокола IKE (Internet key exchange) и выполняется в две фазы.
В первой фазе (IKE Phase 1) устанавливается защищенное соединение, предназначенное для обмена параметрами, необходимыми для установления фазы 2 туннеля. Аутентификация ответной стороны может осуществляться как по заранее заданному ключу (одинаковому на обеих сторонах - preshared key), так и с использованием алгоритма RSA (rsa signature). В настоящей статье используется аутентификация методом preshared key.
Существуют два ключевых протокола, связанных со второй фазой SA: AH (Authentication header) и ESP (Encapsulating Security Payload). Первый обеспечивает только проверку подлинности, но не шифрование данных; второй выполняет обе указанные операции. В настоящей статье рассматривается протокол ESP.
IPSec может работать в одном из двух режимов: транспортном (transport) или туннельном (tunnel). В первом случае шифруется и/или аутентифицируется только содержимое (payload) IP-пакета, а заголовок остается нетронутым. Во втором случае исходный IP-пакет шифруется и/или аутентифицируется целиком, и к нему добавляется новый заголовок. В настоящей статье рассматривается только туннельный режим IPSec.
В качестве методов шифрования могут быть использованы блочные алгоритмы такие, как DES, 3DES, AES, blowfish и др.
3. Настройка PC
В качестве шлюза под управлением FreeBSD используется операционная система со специально пересобранным ядром. Для этого при сборке в директории /usr/src/sys/i386/conf в файле конфигурации ядра следует отметить опции:
options IPSEC
options IPSEC_DEBUG
Сборка ядра осуществляется следующим образом:
cd /usr/src
make buildkernel KERNCONF=name
make buildworld KERNCONF=name
После данных операций в системе загружается ядро с поддержкой IPSEC протоколов. По желанию, можно пересобрать и «мир» (предварительно обновив через csup), но это дело вкуса и значимости сервера.
Далее, необходимо собрать приложение racoon, обеспечивающее функционал IKE Phase 1 (см. раздел 2). Для упрощения задачи применяется метод аутентификации preshare key (далее обозначается psk).
Осуществляем сборку приложения racoon:
cd /usr/ports/*/racoon
make
В появившемся окне следует отключить опцию NATT (Nat traversal) - механизм обеспечения прохождения IPSec-пакетов через NAT. Далее,
make install
После сборки racoon необходимо отредактировать (или создать, если он не существует) конфигурационный файл /usr/local/etc/racoon/racoon.conf
со следующим содержимым:
# $KAME: racoon.conf.in,v 1.18 2001/08/16 06:33:40 itojun Exp $
path include "/usr/local/etc/racoon" ;
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
#path pre_shared_key "/etc/psk.txt" ;
# "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;
randomize off;
strict_check off;
exclusive_tail off;
}
# if no listen directive is specified, racoon will listen to all
# available interface addresses.
listen
{
isakmp 10.2.8.2 [500];
}
# 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 10.8.50.2 #Внешний IP адрес удаленной стороны
{
exchange_mode main; #Не все IOS поддерживают агрессивное согласование в две фазы
#exchange_mode aggressive;
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 60 min;
initial_contact on;
support_proxy on;
proposal_check obey;# obey, strict or claim
proposal {
encryption_algorithm 3des; #Алгоритм шифрования
hash_algorithm sha1; #Метод хеширования
authentication_method pre_shared_key; #Метод аутентификации на общем ключе
dh_group 2; #Длина ключа Диффи-Хеллмана (группа 2 - 1024 бит)
}
}
sainfo subnet 10.5.3.0/24 any address 10.11.16.0/23 any {
#В данном случае это означает, что пакеты из сети 10.5.3.0/24 в сеть 10.11.16.0/24 попадают в обработку. Первое значение своя сеть, второе – удаленная. Any означает "любой порт".
pfs_group 2;
lifetime time 24 hour;
encryption_algorithm aes;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}
sainfo subnet 10.5.4.0/24 any address 10.11.16.0/23 any {
#Аналогично, для второй подсети:
pfs_group 2;
lifetime time 24 hour;
encryption_algorithm aes;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}
Следует иметь ввиду, что параметры pfs_group, encryption_algorithm, authentication_algorithm, compression_algorithm на локальной и удаленной сторонах должны быть идентичными. Времена жизни (lifetime) могут различаться, при этом фактическое время жизни определится как меньшее из двух.
Затем следует создать файл для хранения ключей (тех самых preshared keys):
cd /usr/local/etc/racoon
touch psk.txt
chmod 600 psk.txt
chown root:wheel psk.txt
Содержимое файла psk.txt должно быть следующим:
10.8.50.2 key12345
На этом настройка racoon закончена.
Далее, необходимо указать ядру параметры ожидаемых SA, для чего следует создать файл /etc/ipsec.conf следующего содержания:
flush;
spdflush;
#Правила для исходящего трафика ESP из подсети 10.5.3.0/24:
spdadd 10.5.3.0/24 10.11.16.0/23 any -P out ipsec esp/tunnel/10.2.8.2-10.8.50.2/unique;
#Правила для входящего трафика ESP в подсеть 10.5.3.0/24:
spdadd 10.11.16.0/23 10.5.3.0/24 any -P in ipsec esp/tunnel/10.2.8.2-10.8.50.2/unique;
#Правила для исходящего трафика ESP из подсети 10.5.4.0/24:
spdadd 10.5.4.0/24 10.11.16.0/23 any -P out ipsec esp/tunnel/10.2.8.2-10.8.50.2/unique;
#Правила для входящего трафика ESP в подсеть 10.5.4.0/24:
spdadd 10.11.16.0/23 10.5.4.0/24 any -P in ipsec esp/tunnel/10.2.8.2-10.8.50.2/unique;
Ну, и напоследок активируем ipsec и racoon в /etc/rc.conf :
racoon_flags="-l /var/log/racoon.log"
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
Всё, со стороны FreeBSD больше настроек не требуется. Перезагружаем сервер.
4. Настройка Cisco
Создаем isakmp-политику. О совпадении значений параметров с ответной стороной сказано в разделе 3, при описании sainfo subnet.
crypto isakmp policy 20
encr 3des
authentication pre-share
group 2
lifetime 3600
crypto isakmp identity address
crypto isakmp key key12345 address 10.2.8.2
Создаем transform-set:
crypto ipsec transform-set MY_MAP esp-aes esp-sha-hmac
Создаем CryptoMap:
crypto map MY_MAP 1 ipsec-isakmp
set peer 10.2.8.2
set security-association lifetime seconds 86400
set transform-set MY_MAP
set pfs group2
match address 150
Описываем "интересный" трафик, подлежащий шифрованию. В контексте crypto ACL "permit" означает "шифровать", а "deny" - "не шифровать".
access-list 150 permit ip 10.11.16.0 0.0.1.255 10.5.3.0 0.0.0.255
access-list 150 permit ip 10.11.16.0 0.0.1.255 10.5.4.0 0.0.0.255
Ну, и привязываем CryptoMap к интерфейсу:
interface Vlan10
description ---
ip address 10.8.50.2 255.255.255.252
no ip redirects
no ip unreachables
no ip proxy-arp
crypto map MY_MAP
5. Проверка правильности настроек
После первого же пинга должна установиться фаза IKE1. Со стороны Cisco, её состояние можно определить командой:
show crypto isakmp sa
Ожидаемый вывод:
dst src state conn-id slot status
192.168.50.2 10.2.8.2 QM_IDLE 3 0 ACTIVE
Если фаза IKE1 установилась, проверяем состояние IPSec SA:
show crypto ipsec sa interface Vlan10
Ожидаемый вывод:
interface: Vlan10
Crypto map tag: MY_MAP, local addr10.8.50.2
protected vrf: (none)
local ident (addr/mask/prot/port): (172.21.16.0/255.255.254.0/0/0)
remote ident (addr/mask/prot/port): (10.250.30.0/255.255.255.0/0/0)
current_peer10.2.8.2 port 500
PERMIT, flags={origin_is_acl,ipsec_sa_request_sent}
#pkts encaps: 1, #pkts encrypt: 1, #pkts digest: 1
#pkts decaps: 1, #pkts decrypt: 1, #pkts verify: 1
#pkts compressed: 0, #pkts decompressed: 0
#pkts not compressed: 0, #pkts compr. failed: 0
#pkts not decompressed: 0, #pkts decompress failed: 0
#send errors 1, #recv errors 0
local crypto endpt.:10.8.50.2, remote crypto endpt.:10.2.8.2
path mtu 1500, ip mtu 1500, ip mtu idb Vlan10
current outbound spi: 0xC29EA2C(204073516)
inbound esp sas:
spi: 0x43CF5008(1137659912)
transform: esp-aes esp-sha-hmac ,
in use settings ={Tunnel, }
conn id: 3001, flow_id: NETGX:1, crypto map: MY_MAP
sa timing: remaining key lifetime (k/sec): (4595528/86385)
IV size: 16 bytes
replay detection support: Y
Status: ACTIVE
inbound ah sas:
inbound pcp sas:
outbound esp sas:
spi: 0xC29EA2C(204073516)
transform: esp-aes esp-sha-hmac ,
in use settings ={Tunnel, }
conn id: 3012, flow_id: NETGX:12, crypto map: MY_MAP
sa timing: remaining key lifetime (k/sec): (4595528/86385)
IV size: 16 bytes
replay detection support: Y
Status: ACTIVE
outbound ah sas:
outbound pcp sas:
...откуда видно, что SA назначены, активны, и соответствуют ACL.
Проверяем корректность работы IPSec-туннеля со стороны FreeBSD:
setkey -D
Ожидаемый вывод:
10.2.8.2 10.8.50.2
esp mode=tunnel spi=1137659912(0x43cf5008) reqid=16385(0x00004001)
E: rijndael-cbc ac144569 a67b16b0 eade4bac 429d4f08
A: hmac-sha1 d62d63e9 eb08e6d8 5302bb00 e76432a5 f32c10b7
seq=0x00000001 replay=4 flags=0x00000000 state=mature
created: Oct 15 15:50:35 2008 current: Oct 15 16:10:17 2008
diff: 1182(s) hard: 86400(s) soft: 86400(s)
last: Oct 15 15:50:39 2008 hard: 0(s) soft: 0(s)
current: 120(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 1 hard: 0 soft: 0
sadb_seq=7 pid=1036 refcnt=2
10.2.8.2 10.8.50.2
esp mode=tunnel spi=204073516(0x0c29ea2c) reqid=16386(0x00004002)
E: rijndael-cbc 9f96cb23 6628fd08 dfa56c63 37410a4b
A: hmac-sha1 ded12d87 993b05aa 2884b12e 6d336cfe 72d50d39
seq=0x00000001 replay=4 flags=0x00000000 state=mature
created: Oct 15 15:50:35 2008 current: Oct 15 16:10:17 2008
diff: 1182(s) hard: 86400(s) soft: 86400(s)
last: Oct 15 15:50:39 2008 hard: 0(s) soft: 0(s)
current: 80(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 1 hard: 0 soft: 0
sadb_seq=6 pid=1036 refcnt=1
После этого можно проверять связность сетей 10.5.3.0/23 и 10.11.16.0/23.
7. Ссылки
- http://netbsd.gw.com/cgi-bin/man-cgi?racoon.conf+5+NetBSD-current
- http://netbsd.gw.com/cgi-bin/man-cgi/man?ipsec_set_policy+3+NetBSD-current
- http://dreamcatcher.ru/docs/ipsec_netbsd.html#top3
- http://xgu.ru/wiki/IPsec_в_Cisco
- http://www.cisco.com/en/US/tech/tk583/tk372/technologies_tech_note09186a0080094203.shtml
- http://www.cisco.com/en/US/docs/ios/12_1/security/configuration/guide/scdike.html
- http://www.cisco.com/en/US/docs/ios/12_1/security/configuration/guide/scdipsec.html
Общая матчасть:
- http://ru.wikipedia.org/wiki/Diffie-Hellman
- http://ru.wikipedia.org/wiki/IPSEC