среда, 4 мая 2011 г.

Linux IPSec + Cisco. Тунель между Cisco и Linux.

В праздничные дни внезапно упал канал между филиалом и главным офисом. Работать операторы могли через терминальный сервер, однако, несколько спец. программ работают только напрямую. Пришлось поднимать туннель между центральным маршрутизатором (cisco3800) и шлюзом под Linux (Fedora8). Небольшая заметка для себя.
Итак, имеем филиальский сервер, который выступает шлюзом в интернет.
$ rpm -q ipsec-tools
ipsec-tools-0.7-3.fc8
- Подсеть филиала 172.23.0.0/16
- Подсеть главного офиса - 10.0.0.0/8
- Подсеть2 главного офиса - 192.168.0.0/16
Приведенные выше подсети внутри разбиты на части, но с точки зрения маршрутизации, все они находятся за центральным маршрутизатором, так что имеет смысл определить только данные ("крупные") подсети.
- Внешние адреса с обеих сторон (1.1.1.1-linux и 2.2.2.2-cisco)


Конфигурационный файл - racoon.conf
Приведу только несколько измененных директив.

Нужно описать удаленный узел с помощью ключевого слова remote.
Если определено ключевое слово anonymous, то его параметры применяются ко всем удаленным узлам, которые явно не описаны в конфиге.

remote 2.2.2.2
{
# режим проверки подлинности
exchange_mode main,base;

# время жизни безопасного соединения (SA)
lifetime time 8 hour ;

# указываем в случае, если racoon только принимает запросы на соединение, т.е. пассивно ждет пакетов от инициатора. В этом случае, если нет заданных политик в базе данных политик безопасности (SPD — Security Policy Database), racoon выберет первое предложение, переданное инициатором и сгенерирует на его основе новую политику.
generate_policy on;

# пытаться ли участвовать в инициировании соединения или пассивно ждать
passive on ;
# phase 1 proposal (for ISAKMP SA)
proposal {
# Определяем алгоритм шифрования, используемый при проверке подлинности
encryption_algorithm 3des;
# Указываем алгоритм расчёта хэша, используемый на первой фазе согласования между узлами.
hash_algorithm sha1;
# Определяет метод проверки подлинности, используемый при согласовании узлов. В данном случае для проверки подлинности применяются предварительные общие ключи.
authentication_method pre_shared_key;
# Указывает номер группы Диффи-Хелмана для выбора динамически создаваемых ключей сеанса. У меня используется группа из 1024 бит.
dh_group 2 ;
}
}

Поля в sainfo описывают вторую фазу соединения между узлами IPsec — основу IPsec-соединения (включая используемый поддерживаемый алгоритм шифрования) и способ обмена ключами.

sainfo address 172.23.0.0/16 any address 10.0.0.0/8 any
{
# Определяет протокол обмена ключами Диффи-Хелмана, задающий алгоритм, по которому узлы IPsec устанавливают общий временный ключ сеанса для второй фазы соединения IPsec.
pfs_group 2;

# Этот параметр задаёт срок жизни SA и может быть определяться временем или объёмом данных в байтах.
lifetime time 1 hour ;

# Указываем поддерживаемые алгоритмы шифрования для фазы 2
encryption_algorithm 3des, blowfish 448, rijndael ;

# Перечисляем поддерживаемые алгоритмы хэша для проверке подлинности.
authentication_algorithm hmac_sha1, hmac_md5 ;

# Определяем алгоритм сжатия Deflate для поддержки сжатия IP-заголовков (IP Payload Compression, IPCOMP), что может увеличить скорость передачи IP-датаграм по медленным соединениям.
compression_algorithm deflate ;
}

sainfo address 172.23.0.0/16 any address 192.168.0.0/16 any
{
pfs_group 2;
lifetime time 1 hour ;
encryption_algorithm 3des, blowfish 448, rijndael ;
authentication_algorithm hmac_sha1, hmac_md5 ;
compression_algorithm deflate ;
}


Для управления базами безопасных соединений и политик безопасности (SAD/SPD) используется утилита setkey. Более подробное описание можно узнать из man setkey. Я приведу конфигурационный файл, описывающий создание безопасного соединения между подсетями филиала и центрального офиса:

#!/sbin/setkey -f
flush;
spdflush;

spdadd 172.23.0.0/16 10.0.0.0/8 any -P out ipsec esp/tunnel/1.1.1.1-2.2.2.2/require;
spdadd 10.0.0.0/8 172.23.0.0/16 any -P in ipsec esp/tunnel/2.2.2.2-1.1.1.18/require;

spdadd 172.23.0.0/16 192.168.0.0/16 any -P out ipsec esp/tunnel/1.1.1.1-2.2.2.2/require;
spdadd 192.168.0.0/16 172.23.0.0/16 any -P in ipsec esp/tunnel/2.2.2.2-1.1.1.1/require;


Первый запуск:
service racoon start

Смотрим лог в /var/log/racoon.log
Видим первую ошибку
pfkey X_SPDDUMP failed: No such file or directory

# setkey -D 
No SAD entries. 
Создание записей в БД безопасности из файла  
# setkey -f /etc/racoon/ipsec-tools.conf

Удаляем старые маршруты через маршрутизатор c2801:
route del -net 10.0.0.0 netmask 255.0.0.0 gw 172.23.0.1
route del -net 192.168.0.0 netmask 255.255.0.0 gw 172.23.0.1


Настройка iptables:
iptables
*filtet
-A INPUT -p esp -s 2.2.2.2/32 -j ACCEPT
-A INPUT -p udp --dport 500 -s 2.2.2.2/32 -j ACCEPT

*nat
-A POSTROUTING -s 172.23.0.0/16 -d 10.0.0.0/8 -j ACCEPT
-A POSTROUTING -s 172.23.0.0/16 -d 192.168.0.0/16 -j ACCEPT
-A POSTROUTING -s 172.23.0.0/16 -d ! 10.0.0.0/8 -o eth1 -j SNAT --to-source 1.1.1.1
-A POSTROUTING -s 172.23.0.0/16 -d ! 172.23.0.0/16 -o eth1 -j SNAT --to-source 1.1.1.1

service iptables restart


На стороне cisco филиала
удалить маршрутизацию в подсети, оставив маршрут по умолчанию на linux-шлюз.

no ip route 10.0.0.0 255.0.0.0 192.168.255.1
no ip route 192.168.0.0 255.255.0.0 192.168.255.1
ip route 0.0.0.0 0.0.0.0 172.23.1.254


На стороне Cisco в ЦО.
Не забыть применить crypto map на исходящем интерфейсе, а также указать какие интерфейсы участвуют в nat (ip nat inside и ip nat outside)

****
crypto isakmp policy 25
encr 3des
authentication pre-share
group 2
lifetime 3600
****

crypto isakmp key PASSWORD address 1.1.1.1 no-xauth
crypto ipsec transform-set BRANCH esp-3des esp-sha-hmac

crypto map IPSEC_MAP 48 ipsec-isakmp
description tunnel_to_Branch
set peer 1.1.1.1
set transform-set BRANCH
match address BRANCH-1

ip nat inside source list ALLOW_NAT interface GigabitEthernet0/1.40 overload

ip access-list extended BRANCH-1
permit ip 10.0.0.0 0.255.255.255 172.23.0.0 0.0.255.255
permit ip 172.16.0.0 0.15.255.255 172.23.0.0 0.0.255.255
permit ip 192.168.0.0 0.0.255.255 172.23.0.0 0.0.255.255

ip access-list extended ALLOW_NAT
deny ip any 10.0.0.0 0.255.255.255
deny ip any 172.16.0.0 0.15.255.255
deny ip any 192.168.0.0 0.0.255.255
permit ip any host 1.1.1.1
 *****


Литература:
man racoon.conf, man setkey, документация с сайта cisco.com

Комментариев нет:

Отправить комментарий