IPSec туннель между Racoon (ipsec-tools) и Microsoft Forefront TMG с использованием pre-shared key

Настройка site-to-site vpn с помощью туннеля ipsec между Microsoft Forefront TMG и Racoon (linux) с использованием pre-shared ключа иногда вызывает затруднения. Хочу поделиться своим опытом настройки подобного туннеля.

В этой статье будет рассмотрена только настройка linux-стороны туннеля, на стороне Forefront TMG достаточно выполнить стандартные шаги по настройке туннеля ipsec, указав в качестве алгоритма шифрования в обоих фазах 3DES, и хеш-алгоритм SHA1.

Я использовал операционную систему Gentoo (gentoo-sources-3.6.11, ipsec-tools-0.8.0-r5).

Для работы пакет ipsec-tools требует включить в ядре следующие опции (во время установки производится проверка):

[*] Networking support  --->
  Networking options  --->
    < *> Transformation user configuration interface
    < *> PF_KEY sockets
    [*] TCP/IP networking
       [*] IP: AH transformation
       [*] IP: ESP transformation
       [*] IP: IPComp transformation
       [*] IP: IPsec transport mode
       [*] IP: IPsec tunnel mode
       [*] IP: IPsec BEET mode
    [*] Network packet filtering framework (Netfilter)  --->
       Core Netfilter Configuration  --->
          < *>   IPsec "policy" match support
-*- Cryptographic API  --->
     < *> Null algorithms

Для настройки необходимо знать два IP адреса, между которыми будет установлено соединение и список внутренних подсетей, пакеты которых должны проходить через туннель.

Для определенности адреса, между которыми устанавливается туннель — xx1.xx1.xx1.xx1 (linux) и xx2.xx2.xx2.xx2 (TMG), внутренние подсети yya.yya.yya.yya/24, yyb.yyb.yyb.yyb/25, yyc.yyc.yyc.yyc/24, yyd.yyd.yyd.yyd/26. Подсети с инддексами yya и yyb находятся за адресом xx1.xx1.xx1.xx1, подсети с индексами yyc и yyd — за адресом xx2.xx2.xx2.xx2.

Так же необходимо задать какой-то pre-shared ключ для аутентификации Forefront TMG. Пусть ключем будет фраза $MyPreSharedKey$.

Настройку начнем с файла /etc/racoon/psk.txt, который содержит список pre-shared ключей (в нашем случае ключ один):

xx2.xx2.xx2.xx2  $MyPreSharedKey$

Следующий шаг — настройка файла /etc/racoon/racoon.conf, в котором находятся параметры туннеля:

# Путь до файла с pre-shared ключами
path pre_shared_key "/etc/racoon/psk.txt";

# Задаем режим логирования
log error;

# Указываем адреса, на которых raoon должен ожидать соединения
listen
{
    isakmp xx1.xx1.xx1.xx1 [500];
    isakmp_natt xx1.xx1.xx1.xx1 [4500];
}

remote xx2.xx2.xx2.xx2
{
    exchange_mode main,aggressive;
    # разрешаем работу в режиме NAT traversal
    nat_traversal on;
    # отключаем автоматическую генерацию ACL
    generate_policy off;
    rekey on;
    # разрешаем фрагментацию IKE
    ike_frag on;
    proposal_check claim;
    # режим ожидания входящих соединений
    passive on;
    # область интерпретации
    doi ipsec_doi;
    # идентификатор linux сервера
    my_identifier address xx1.xx1.xx1.xx1;
    # идентификатор TMG сервера
    peers_identifier address xx2.xx2.xx2.xx2;
    verify_identifier on;

    # Параметры для первой фазы
    proposal {
        # алгоритм шифрования
        encryption_algorithm 3des;
        # алгоритм хеширования
        hash_algorithm sha1;
        # метод авторизации
        authentication_method pre_shared_key;
        # Diffie-Hellman группа (2 = 1024 бит)
        dh_group 2;
        lifetime time 28800 sec;
    }
}

sainfo anonymous
{
    # Perfect Forward Secrecy (2 = 1024 бит)
    pfs_group 2;
    # алгоритм шифрования
    encryption_algorithm 3des;
    # алгоритм хеширования
    authentication_algorithm hmac_sha1;
    lifetime time 3600 sec;
    compression_algorithm deflate;
}

Далее задаем список (ACL) подсетей, которые могут общаться через туннель. Файл /etc/ipsec-tools.conf:

#!/usr/sbin/setkey -f

flush;
spdflush;

# Доступ yya.yya.yya.yya/24 -> yyc.yyc.yyc.yyc/24
spdadd yya.yya.yya.yya/24 yyc.yyc.yyc.yyc/24 any -P out ipsec esp/tunnel/xx1.xx1.xx1.xx1-xx2.xx2.xx2.xx2/unique;
# Доступ yyc.yyc.yyc.yyc/24 -> yya.yya.yya.yya/24 (далее по аналогии)
spdadd yyc.yyc.yyc.yyc/24 yya.yya.yya.yya/24 any -P in ipsec esp/tunnel/xx2.xx2.xx2.xx2-xx1.xx1.xx1.xx1/unique;

spdadd yyb.yyb.yyb.yyb/25 yyc.yyc.yyc.yyc/24 any -P out ipsec esp/tunnel/xx1.xx1.xx1.xx1-xx2.xx2.xx2.xx2/unique;
spdadd yyc.yyc.yyc.yyc/24 yyb.yyb.yyb.yyb/25 any -P in ipsec esp/tunnel/xx2.xx2.xx2.xx2-xx1.xx1.xx1.xx1/unique;

spdadd yya.yya.yya.yya/24 yyd.yyd.yyd.yyd/26 any -P out ipsec esp/tunnel/xx1.xx1.xx1.xx1-xx2.xx2.xx2.xx2/unique;
spdadd yyd.yyd.yyd.yyd/26 yya.yya.yya.yya/24 any -P in ipsec esp/tunnel/xx2.xx2.xx2.xx2-xx1.xx1.xx1.xx1/unique;

spdadd yyb.yyb.yyb.yyb/25 yyd.yyd.yyd.yyd/26 any -P out ipsec esp/tunnel/xx1.xx1.xx1.xx1-xx2.xx2.xx2.xx2/unique;
spdadd yyd.yyd.yyd.yyd/26 yyb.yyb.yyb.yyb/25 any -P in ipsec esp/tunnel/xx2.xx2.xx2.xx2-xx1.xx1.xx1.xx1/unique;

Racoon настроен, можно его запустить командой /etc/init.d/racoon start и туннель должен установиться (при наличии сконфигурированного Forefront TMG, конечно же).

Для успешной маршрутизации трафика между внутренними подсетями необходимо дополнительно задать маршуты, направляющие трафик, идущий в подсети за TMG, через реальный IP адрес, с которого установлен туннель (предполагается, что адрес xx1.xx1.xx1.xx1 находится на интерфейсе eth0):

ip r add yyc.yyc.yyc.yyc/24 dev eth0 src xx1.xx1.xx1.xx1
ip r add yyd.yyd.yyd.yyd/26 dev eth0 src xx1.xx1.xx1.xx1

А так же необходимо в iptables добавить правила:

*nat
-A PREROUTING -s yya.yya.yya.yya/24 -d yyc.yyc.yyc.yyc/24 -j ACCEPT
-A PREROUTING -s yyc.yyc.yyc.yyc/24 -d yya.yya.yya.yya/24 -j ACCEPT

-A PREROUTING -s yyb.yyb.yyb.yyb/25 -d yyc.yyc.yyc.yyc/24 -j ACCEPT
-A PREROUTING -s yyc.yyc.yyc.yyc/24 -d yyb.yyb.yyb.yyb/25 -j ACCEPT

-A PREROUTING -s yya.yya.yya.yya/24 -d yyd.yyd.yyd.yyd/26 -j ACCEPT
-A PREROUTING -s yyd.yyd.yyd.yyd/26 -d yya.yya.yya.yya/24 -j ACCEPT

-A PREROUTING -s yyb.yyb.yyb.yyb/25 -d yyd.yyd.yyd.yyd/26 -j ACCEPT
-A PREROUTING -s yyd.yyd.yyd.yyd/26 -d yyb.yyb.yyb.yyb/25 -j ACCEPT

*filter
-A FORWARD -s yya.yya.yya.yya/24 -d yyc.yyc.yyc.yyc/24 -j ACCEPT
-A FORWARD -s yyc.yyc.yyc.yyc/24 -d yya.yya.yya.yya/24 -j ACCEPT

-A FORWARD -s yyb.yyb.yyb.yyb/25 -d yyc.yyc.yyc.yyc/24 -j ACCEPT
-A FORWARD -s yyc.yyc.yyc.yyc/24 -d yyb.yyb.yyb.yyb/25 -j ACCEPT

-A FORWARD -s yya.yya.yya.yya/24 -d yyd.yyd.yyd.yyd/26 -j ACCEPT
-A FORWARD -s yyd.yyd.yyd.yyd/26 -d yya.yya.yya.yya/24 -j ACCEPT

-A FORWARD -s yyb.yyb.yyb.yyb/25 -d yyd.yyd.yyd.yyd/26 -j ACCEPT
-A FORWARD -s yyd.yyd.yyd.yyd/26 -d yyb.yyb.yyb.yyb/25 -j ACCEPT

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

css.php