В праздничные дни внезапно упал канал между филиалом и главным офисом. Работать операторы могли через терминальный сервер, однако, несколько спец. программ работают только напрямую. Пришлось поднимать туннель между центральным маршрутизатором (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
Итак, имеем филиальский сервер, который выступает шлюзом в интернет.
$ 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
Комментариев нет:
Отправить комментарий