Настройка VPN IPsec сервиса на базе Openswan

Иногда появляется необходимость организовать соединение vpn типа site-to-site с использованием vpn-сервера под управлением GNU/Linux и аппаратных vpn-клиентов Cisco (например Cisco 871 или Cisco 1841 и пр.). Решить подобную задачу можно с помощью двух инструментов: racoon из пакета ipsec-tools и openswan.

Я попробовал оба инструмента и остановился на openswan, так как racoon при прочих равных условиях периодически, почему-то, разрывает соединение. И, на мой взгляд, менее удобен в работе.

Итак, задача: организовать ipsec vpn туннели с пятью региональными офисами компании для обеспечения их прозрачной работы с внутренними сетевыми ресурсами центрального офиса. В наличии имеется сервер под управлением Gentoo Linux и клиенты Cisco, уже установленные в каждом из офисов.

Настройка сервера vpn:

Прежде всего, необходимо включить в ядре Linux необходимые для работы ipsec опции (описано в статье Настройка VPN сервиса на основе L2TP+IPsec).
Затем следует установить openswan. Я использовал openswan-2.6.38 с ключами:

USE="extra-algorithms nocrypto-algorithms pam ssl weak-algorithms -caps -curl -ldap -ms-bad-proposal -nss"

Следующий шаг — создание конфигурационного файла. Так как региональных офисов пять штук, я принял решение вынести конфигурации для каждого из офисов в отдельные файлы. В итоге я получил следующий набор конфигурационных файлов:

  • /etc/ipsec.conf — основной конфигурационный файл openswan.
  • /etc/ipsec.secrets — файл, содержащий Preshared Keys.
  • /etc/ipsec.d/include — директория с конфигурационными файлами для каждого из региональных офисов.

Файл /etc/ipsec.conf

version 2.0

config setup
    dumpdir=/var/run/pluto/
    nat_traversal=yes
    protostack=auto
    plutostderrlog=/var/log/pluto.log
    fragicmp=yes

include /etc/ipsec.d/include/*.conf

Файл /etc/ipsec.secrets

Формат записей при использовании Preshared Key имеет следующий вид:

vpn_server_ip vpn_client_ip: PSK "secret key"

Таким образом, содержимое файла ipsec.secrets следующее:

xxx.xxx.xxx.xxx yy1.yy1.yy1.yy1: PSK "SECRET_PSK_KEY"
xxx.xxx.xxx.xxx yy2.yy2.yy2.yy2: PSK "SECRET_PSK_KEY"
...
xxx.xxx.xxx.xxx yy5.yy5.yy5.yy5: PSK "SECRET_PSK_KEY"

Где xxx.xxx.xxx.xxx — ip адрес vpn сервера, с которым будет устанавливаться соединение,
yyN,yyN,yyN,yyN — ip адреса vpn клиентов, с которых будет устанавливаться соединение.

Файл /etc/ipsec.d/office1.conf

Содержимое конфигурационного файла для первого из пяти офисов office1 (для остальных офисов настройки отличаются только ip адресом клиента Cisco и внутренней подсетью регионального офиса).
nnn.nnn.nnn.nnn — маска подсети.

# Доступ в первую внутреннюю подсеть центрального офиса 10.0.0.0/16
conn OFFICE1-sub1
    leftsubnet=10.0.0.0/16
    rekey=yes
    auto=start
    also=OFFICE1

# Доступ во вторую внутреннюю подсеть центрального офиса 10.1.0.0/16
conn OFFICE1-sub2
    leftsubnet=10.1.0.0/16
    rekey=yes
    auto=start
    also=OFFICE1

conn OFFICE1
    type=tunnel
    aggrmode=no
    authby=secret
    compress=no
    # IP адрес vpn сервера, к которому будут подключаться vpn клиенты
    left=xxx.xxx.xxx.xxx
    # leftsourceip необходим, если default gateway на vpn сервере 
    # отличается от ip адреса, к которому будут подключаться vpn клиенты.
    # У меня leftsourceip = left
    leftsourceip=xxx.xxx.xxx.xxx
    # IP адрес vpn клиента Cisco
    right=yy1.yy1.yy1.yy1
    # Внутренняя подсеть регионального офиса
    rightsubnet=10.100.1.0/24
    keyexchange=ike
    pfs=yes
    ikelifetime=28800s
    ikev2=permit
    ike=des-md5-modp1024
    phase2alg=des-md5
    dpddelay=30
    dpdtimeout=120
    pdaction=restart

Настройка клиентов Cisco

В приведенном ниже примере опущены части, не относящиеся напрямую к настройке vpn соединения.

Настройка первой фазы ipsec

crypto isakmp policy 10
  hash md5
  authentication pre-share
  group 2
  lifetime 28800

Снимаем бит «не фрагментировать» и задаем Preshared key

crypto isakmp key SECRET_PSK_KEY address xxx.xxx.xxx.xxx no-xauth
crypto ipsec df-bit clear

Настройка второй фазы ipsec

crypto map office 10 ipsec-isakmp 
  set peer xxx.xxx.xxx.xxx
  set transform-set notstrong 
  set pfs group2
  match address vpn_to_OFFICE

Внешний интерфейс: уменьшаем mss, чтобы пакеты проходили через туннель

interface FastEthernet0
  ip address yy1.yy1.yy1.yy1 nnn.nnn.nnn.nnn
  ip nat outside
  ip virtual-reassembly
  ip tcp adjust-mss 1372
  speed auto
  full-duplex
  no cdp enable
  crypto map office

Внутренний интерфейс

interface FastEthernet1
  ip address 10.100.1.1 255.255.255.0
  ip nat inside
  ip virtual-reassembly

Доступ в интернет из внутренней подсети

ip access-list extended access_to_inet
  deny   ip 10.100.1.0 0.0.0.255 10.0.0.0 0.0.255.255
  deny   ip 10.100.1.0 0.0.0.255 10.1.0.0 0.0.255.255
  permit ip 10.100.1.0 0.0.0.255 any

Доступ к подсетям центрального офиса через vpn канал

ip access-list extended vpn_to_OFFICE
  permit ip 10.100.1.0 0.0.0.255 10.0.0.0 0.0.255.255
  permit ip 10.100.1.0 0.0.0.255 10.1.0.0 0.0.255.255

Разрешаем NAT

route-map NAT permit 10
  match ip address access_to_inet

Запуск туннеля

Для установки туннеля необходимо запустить openswan командой

/etc/init.d/ipsec start

Требуемые для работы канала маршруты openswan создаст (и при выключении удалит) автоматически.
На клиенте Cisco дополнительно можно выполнить команду

clear crypto isakmp
css.php