Создание IPSec VPN туннеля между Linux и Cisco PIX

Создание IPSEC VPN туннеля на основе pre-shared keys между linux 2.6 ipsec-tools(racoon) и cisco PIX firewall 5xx

Введение:

Термин VPN (Virtual Private Network) переводится как «виртуальная частная сеть».

Этот сервис предоставляющий безопасную (защищенную шифрованием), надежную связь на основе уже существующего подключения к общей сети internet, например тем кому необходимо соединить удаленную локальную сеть или удаленный офис в единую сеть с обеспечением безопастности передаваемых данных.

В моем примере будет создаваться защищенный IPSEC канал между двумя сетевыми устройствами, первое это Cisco PIX firewall — аппаратный фаервол от известного производителя и второе компьютер, работающий в качестве шлюза под управлением OS Linux. IPSEC стандарт разработанный и принятый к реализации, для повышения безопасности используемого IP протокола (см. http://www.rfc-editor.org/ RFC 2401 — IPSec) Ниже приводится небольшая схема поясняющая устанавливаемое соединение.

Схема соединения :

( office_1 )--[ pix ] ~~ internet ~~ [ linux ]--( office_2 )

сети и интерфейсы :

сеть office_1 — 10.0.0.0/24
сеть office_2 — 192.168.0.0/24

pix_int — 10.0.0.1/24 (внутренний интерфейс, office_1)
pix_ext — 172.16.1.1 (внешний интерфейс)

linux_ext — 172.16.2.1 (внешний интерфейс)
linux_int — 192.168.0.1/24 (внутренний интерфейс, office_2)

Настраиваем pix (у меня был 506E):

! общая настройка, у вас она уже по всей видимости выполнена
! и необходимости тут настраивать что-либо еще нет.
interface ethernet0 auto
interface ethernet1 auto
nameif ethernet0 outside security0
nameif ethernet1 inside security100
mtu outside 1500
mtu inside 1500
ip address outside 172.16.1.1 255.255.255.0
ip address inside 10.0.0.1 255.255.255.0
route outside 0.0.0.0 0.0.0.0 172.16.1.254 1
! настройка ipsec_acl для разрешения доступа сетям
access-list ipsec_acl permit ip 10.0.0.1 255.255.255.0 192.168.0.0 255.255.255.0
access-list ipsec_acl permit ip 192.168.0.0 255.255.255.0 10.0.0.0 255.255.255.0
! исключение ipsec_acl из NAT
nat (inside) 0 access-list ipsec_acl
! The "sysopt connection permit-ipsec" command enables packets that have
! been processed by IPSec to bypass access list checks.
sysopt connection permit-ipsec
! определение политики IPSec
! определение протоколов для шифрации трафика
crypto ipsec transform-set myset1 esp-3des esp-sha-hmac
! определение номера последовательности и имени IPSec ISAKMP
crypto map toOFFICE2 20 ipsec-isakmp
! определение perfect forward secrecy (PFS) группы 2 (1024-bit Diffie-Hellman)
crypto map toOFFICE2 20 set pfs group2
! Трафик определенный нашим ACL который будет шифроватся через туннель
crypto map toOFFICE2 20 match address ipsec_acl
! кто будет принимать наше VPN соединение и терминировать его
crypto map toOFFICE2 20 set peer 172.16.2.1
! устанавливаем нашу схему шифрования трафика
crypto map toOFFICE2 20 set transform-set myset1
! данный туннель устанавливается на outside интерфейсе
crypto map toOFFICE2 interface outside
! задание параметров и политики IKE
! IKE будет работать на внешнем интерфейсе
isakmp enable outside
! secretkeyx - pre-shared key для шифрования с нашим удаленным peer'ом
isakmp key secretkeyx address 172.16.2.1 netmask 255.255.255.255
! использовать свой адрес для IKE идентификации с удаленным хостом
isakmp identity address
! метод аутентификации, по исвестному ключу
isakmp policy 9 authentication pre-share
! шифрование 3des
isakmp policy 9 encryption 3des
! hash алгоритм sha
isakmp policy 9 hash sha
! использование Diffie-Hellman группы 2
isakmp policy 9 group 2
! время жизни SA (security association) в секундах, 86400 = 24 часа
isakmp policy 9 lifetime 86400
! keepalive для соединения, 120 seconds = 2 минуты
isakmp keepalive 120

На этом настройка PIX закончена. Для обьяснения большинства параметров указанных выше, смотрите документацию.

Настройка Linux, на примере SLES-9 :

Использовалось стандартное ядро, поставляемое с SLES-9:

srv1:/etc/racoon # uname -a
Linux srv1 2.6.5-7.97-bigsmp #1 SMP Fri Jul 2 14:21:59 UTC 2004 i686 i686 i386 GNU/Linux
srv1:/etc/racoon # rpm -qf /boot/vmlinuz-2.6.5-7.97-bigsmp
kernel-bigsmp-2.6.5-7.97

Опции ядра linux для пересборки, если у вас ядро не поддерживает IPSEC,
необходимые для поддержки IPSEC.

-> Networking
-> Networking support (NET [=y])
-> Networking options
-> TCP/IP networking

CONFIG_INET_AH=m (IP: AH transformation)
CONFIG_INET_ESP=m (IP: ESP transformation)
CONFIG_INET_IPCOMP=m (IP: IPComp transformation)
CONFIG_INET_TUNNEL=m (IP: tunnel transformation)

-> Cryptographic options
-> Cryptographic API

включить все пункты модулями

CONFIG_CRYPTO=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_TEST=m

далее пересобираете ядро и перезагружаетесь в него.

Для установления соединения были использованы ipsec-tools-0.3.3-1.3 идущие в поставке SLES.

На момент написания статьи на сайте http://ipsec-tools.sf.net/ была доступна версия IPsec-tools 0.6.1

Настройка конфигурационных файлов /etc/racoon/ :

в файл psk.txt вы записываете ваши секретные ключи для нашего примера в данный файл необходимо добавить следующую запись:

172.16.1.1 secretkeyx

в файле setkey.conf определяются SA/SP базы (man setkey)

Содержимое:

flush;
spdflush;

# важно!
# не перепутайте направление трафика (IP адреса сетей и маршрутизаторов)
# для исходящего трафика
spdadd 192.168.0.0/24 10.0.0.0/24 any -P out ipsec esp/tunnel/172.16.2.1-172.16.1.1/require;
# для входящего трафика
spdadd 10.0.0.0/24 192.168.0.0/24 any -P in ipsec esp/tunnel/172.16.1.1-172.16.2.1/require;

конфигурационный файл для racoon — racoon.conf :

path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/cert";
log notify;
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.
}
listen
{
isakmp 172.16.2.1 [500];
}
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;
}

## IKE phase 1
remote 172.16.1.1
{
exchange_mode main,aggressive;
doi ipsec_doi;
situation identity_only;

my_identifier address 172.16.2.1;

nonce_size 16;
lifetime time 24 hour;
initial_contact on;
proposal_check obey; # obey, strict or claim

proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key ;
dh_group 2 ;
}
}

## IKE phase 2
sainfo address 192.168.0.0/24 any address 10.0.0.0/24 any {
pfs_group 2; # pfs_group modp768;
encryption_algorithm 3des;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}

Далее запускаем racoon через /etc/rc.d/init.d/racoon start или руками

# racoon -f /etc/racoon/racoon.conf

и при наличии трафика в тунеле, в логах вы увидите что-то похожее на :

Sep 21 22:07:16 sles9 racoon: INFO: respond new phase 1 negotiation: 172.16.2.1[500]<=>172.16.1.1[500]
Sep 21 22:07:16 sles9 racoon: INFO: begin Identity Protection mode.
Sep 21 22:07:16 sles9 racoon: INFO: ISAKMP-SA established 172.16.2.1[500]-172.16.1.1[500] spi:93b2202c65692650:247ac3da3bb61f85
Sep 21 22:07:16 sles9 racoon: INFO: respond new phase 2 negotiation: 172.16.2.1[0]<=>172.16.1.1[0]
Sep 21 22:07:16 sles9 racoon: INFO: IPsec-SA established: ESP/Tunnel 172.16.1.1->172.16.2.1 spi=182739187(0xae460f3)
Sep 21 22:07:16 sles9 racoon: INFO: IPsec-SA established: ESP/Tunnel 172.16.2.1->172.16.1.1 spi=14128346(0xd794da)

для проверки, на linux сервере можете подать команду :

$ ping -I 192.168.0.1 10.0.0.xx

где xx IP из офисной сети 1, любой адрес (внутренний интерфейс pix’a пинговатся не будет)

Решение проблем:

просмотр текущего состояния тунеля на PIX’e осуществляется двумя командами:

show isakmp sa
show crypto sa

 

При перезапуске или даже остановке racoon у вас возможно все-еще будет работать IPSEC VPN туннель так как используется реализация на уровне Linux ядра.

Для того чтобы перезапустить туннель на стороне PIX’a, необходимо выполнить 2 команды в _режиме конфигурации_ (conf t):

clear isakmp sa
clear crypto sa

Как только появится трафик совпадающий по ipsec acl или при его наличии, туннель должен поднятся.

Настройка Cisco Easy VPN с использованием IPSec Dynamic Virtual Tunnel Interface (DVTI)

Тема неоднократно рассмотренная, но не потерявшая своей актуальности. В случае, если организация обладает разветвленной сетью мини-офисов, число сотрудников в которых не превышает 5-10 человек, а единственно доступным (по цене, в том числе) является только канал Интернет, то для организации защищенных каналов связи весьма удобно использовать технологию Cisco Easy VPN.

В отличие от NHRP/mGRE, технологию Cisco Easy VPN поддерживают все модели маршрутизаторов Cisco. При использовании бюджетных маршрутизаторов (85х, 86х и т.д.) мы также ограничены и в выборе протокола динамической маршрутизации.

В данном примере у нас имеется Hub, осуществляющий прием подключений от региональных офисов и Spoke, на котором организован туннель к Hub. Маршрутизация осуществляется по протоколу RIP (ODR не работает в Easy VPN), при этом к Spoke отдается маршрут по умолчанию, а от него принимается маршрут к его локальной сети.

Конфигурация Hub:

!
version 12.4
service tcp-keepalives-in
service tcp-keepalives-out
service timestamps debug datetime msec localtime
service timestamps log datetime msec localtime
service password-encryption
service sequence-numbers
!
hostname lab
!
boot-start-marker
boot-end-marker
!
enable secret cisco
!
aaa new-model
!
!
aaa authentication login default local
aaa authorization network default local
!
aaa session-id common
!
resource policy
!
clock timezone MSK 3
clock summer-time MSD recurring last Sun Mar 2:00 last Sun Oct 3:00
no network-clock-participate slot 1
ip cef
!
!
!
no ip domain lookup
ip domain name dreamcatcher.ru
!
!
username cisco privilege 15 secret cisco
!
!
policy-map Minibranch_TraffShape
class class-default
shape average 2560000
!
!
crypto keyring Minibranch
pre-shared-key address 0.0.0.0 0.0.0.0 key MegaKey
!
crypto isakmp policy 10
encr aes 256
authentication pre-share
group 2
crypto isakmp invalid-spi-recovery
crypto isakmp keepalive 120 20 periodic
crypto isakmp nat keepalive 20
crypto isakmp profile Minibranch
keyring Minibranch
match identity address 0.0.0.0
virtual-template 1
!
!
crypto ipsec transform-set Minibranch esp-aes 256 esp-sha-hmac
!
crypto ipsec profile Minibranch
set transform-set Minibranch
set pfs group2
!
!
interface FastEthernet0/0
description --- To Inet ---
ip address 192.168.100.2 255.255.255.0
duplex auto
speed auto
!
interface FastEthernet1/0
description --- LAN ---
ip address 192.168.1.1 255.255.255.0
duplex auto
speed auto
!
interface Virtual-Template1 type tunnel
description --- Minibranch ---
bandwidth 256
ip unnumbered FastEthernet1/0
tunnel source FastEthernet0/0
tunnel mode ipsec ipv4
tunnel protection ipsec profile Minibranch
service-policy output Minibranch_TraffShape
!
router rip
version 2
passive-interface default
no passive-interface Virtual-Template1
network 192.168.1.0
default-information originate
distribute-list prefix DEF out
distribute-list prefix RIP in
no auto-summary
!
ip route 0.0.0.0 0.0.0.0 192.168.100.1
!
ip prefix-list DEF seq 5 permit 0.0.0.0/0
!
ip prefix-list RIP seq 5 permit 192.168.0.0/16 le 24
!
control-plane
!
line con 0
line aux 0
line vty 0 4
!
!
end
[/cc]

Конфигурация Spoke:

[cc lang="bash"]
version 15.1
no service pad
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
!
hostname branch
!
boot-start-marker
boot-end-marker
!
!
logging buffered 51200 warnings
enable secret cisco
!
no aaa new-model
memory-size iomem 10
crypto pki token default removal timeout 0
!
!
ip source-route
!
ip cef
no ip domain lookup
ip domain name dreamcatcher.ru
!
username cisco privilege 15 secret cisco
!
crypto keyring Minibranch
pre-shared-key address 0.0.0.0 0.0.0.0 key MegaKey
!
crypto isakmp policy 10
encr aes 256
authentication pre-share
group 2
crypto isakmp invalid-spi-recovery
crypto isakmp keepalive 120 20
crypto isakmp nat keepalive 20
crypto isakmp profile Minibranch
keyring Minibranch
match identity address 0.0.0.0
virtual-template 1
!
!
crypto ipsec transform-set Minibranch esp-aes 256 esp-sha-hmac
!
crypto ipsec profile Minibranch
set transform-set Minibranch
set pfs group2
!
interface Tunnel0
description --- To GW ---
ip unnumbered Vlan1
ip virtual-reassembly in
tunnel source FastEthernet4
tunnel mode ipsec ipv4
tunnel destination 192.168.100.2
tunnel protection ipsec profile Minibranch
!
interface FastEthernet4
description --- WAN ---
ip address 192.168.101.2 255.255.255.0
duplex auto
speed auto
!
interface Vlan1
description --- LAN ---
ip address 192.168.2.1 255.255.255.0
ip tcp adjust-mss 1452
!
router rip
version 2
passive-interface default
no passive-interface Tunnel0
network 192.168.2.0
distribute-list prefix RIP out
no auto-summary
!
ip route 0.0.0.0 0.0.0.0 192.168.101.1
!
!
ip prefix-list RIP seq 5 permit 192.168.0.0/16 le 24
!
line con 0
login local
no modem enable
line aux 0
line vty 0 4
privilege level 15
login local
transport input telnet ssh
!
end

Используемая литература:

Configuration Examples and TechNotes

Автор: Сгибнев Михаил