среда, 13 апреля 2011 г.

Site-to-site IPSec VPN между Cisco и Linux

В этой заметке я приведу пример простейшего Site-to-site (S2S) туннеля между Cisco и Linux с объяснениями.

S2S VPN - это туннель, целью которого является соединение нескольких сетей (в отличие от host-to-host, когда целью является соединение двух хостов).

Итак, у нас имеется 2 роутера:
  • 1.1.1.1 - Linux. За ним находится сеть 192.168.1.0/24
  • 2.2.2.2 - Cisco. За ним находится сеть 192.168.2.0/24

Обязательно уясните, что при использовании IPSec Вы не увидите ни отдельного туннельного интерфейса, ни относящихся к туннелю записей в таблице маршрутизации. В IPSec для определения, какой трафик будет шифроваться и отправляться в туннель, а какой нет, существуют так называемые Security Policies. Они абсолютно статичны и объявляются непосредственно при настройке туннеля.

Итак, начнем с Linux. В нашем примере это будет Debian.
Устанавливаем OpenSWAN. С помощью него мы будет создавать туннели:
apt-get install openswan

Нам потребуются следующие файлы:
  • /etc/ipsec.conf - Собственно файл конфигурации IPSEC
  • /etc/ipsec.secrets - Файл с ключами аутенификации, либо общими ключами (PSK). В данном примере будет использоваться аутенификация по PSK.

Открываем конфигурационный файл /etc/ipsec.conf и в конец добавляем следующий блок (отступы имеют значение):
conn my-test-conn
        type=tunnel
        authby=secret
        left=1.1.1.1
        leftnexthop=%defaultroute
        leftsubnet=192.168.1.0/24
        right=2.2.2.2
        rightsubnet=192.168.2.0/24
        esp=3des-md5-96
        keyexchange=ike
        pfs=no
        auto=start

Небольшое пояснение по описанным параметрам:
  • left - Наш внешний адрес, с которого создаем туннель
  • leftsubnet - Наша локальная сеть, трафик из которой будем заводить в туннель. Это используется для формирования Security Policy, о которой я говорил выше.
  • right - Удаленный маршрутизатор, к которому строим туннель
  • rightsubnet - Сеть за удаленным маршрутизатором, трафик к которой будет шифроваться. Используется для Security Policy
  • esp - параметры шифрования.
Теперь необходимо указать общий ключ PSK. Он указывается в файле /etc/ipsec.secrets. Добавимв этот файл следующую строчку:
1.1.1.1 2.2.2.2 : PSK "mysecretkey"

Внимание! Много людей натыкаются на одну и ту же проблему с симптомами "туннель устанавливается, но трафик не идет". Причина тому - NAT на внешнем интерфейсе. Трафик между сетями, входящими в IPSec, не должен НАТиться! Для этого добавим следующее первое правило в таблицу nat, цепочку POSTROUTING в iptables:
iptables -i nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT

Таким образом, никаких действий с трафиком между нашими сетями происходить не будет. На этом настройка Linux закончена. Применим изменения командой:
/etc/init.d/ipsec restart


Настройка Cisco:
Войдем в режим конфигурирования:
configure terminal

Опишем первую фазу IPSec - политику ISAKMP:
isakmp policy 10 authentication pre-share
isakmp policy 10 encryption 3des
isakmp policy 10 hash md5
isakmp policy 10 group 2
isakmp policy 10 lifetime 3600
После этого опишем PSK, котрый будет использоваться для соединения с Linux:
isakmp key 0 mysecretkey address 1.1.1.1 no-xauth
Политик ISAKMP можно указать несколько. При согласовании соединения будет использоваться сначала политика с наименьшим номером, если удаленная сторона ее отвергнет, то будет использоваться политика с следующим по возрастанию номером. Мы точно знаем, чего хотим, поэтому указываем единственную политику :)

Опишем transform-set. Это определит, как мы будем инкапсулировать и шифровать трафик:
crypto ipsec transform-set myset esp-des esp-md5-hmac
mode tunnel
Настала очередь описать, собственно, наш туннель. В Cisco это называеся crypto map:
crypto map mymap 20 ipsec-isakmp
crypto map mymap 20 match address 120
! Здесь маршрутизатор предупредит нас, что такого acces-list не существует. Ничего страшного
crypto map mymap 20 set peer 1.1.1.1
crypto map mymap 20 set transform-set myset
Опишем access-list с номером 120, который у нас будет исполнять роль Security Policy.
access-list 120 permit ip 192.168.2.0 0.0.0.255 192.168.1.0 0.0.0.255

Как видите, здесь указываются не маски подсети, а wildcard: 255 минус текущее значение маски подсети. То есть, wildcard 0.0.0.255 равем маске 255.255.255.0
Заключительная часть - привязываем crypto map на внешний сетевой интерфейс:
interface fastethernet 0/1
crypto map mymap

Готово. Можно проверять коннект с хоста в одной сети, пропинговав хост в другой сети. Маршрутизаторы друг друга пингоать не будут! Вот такая особенность данной реализации.

Проверено на Debian 6, Cisco серии 800, 2600.

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