# Интеграция FreeBSD IPsec и Check Point VPN-1╝/Firewall-1╝

### Jon Orbeton

`<jono@securityreports.com>`

### Matt Hite

`<mhite@hotmail.com>`

Copyright ╘ 2001, 2002, 2003 Jon Orbeton

$FreeBSD: doc/ru_RU.KOI8-R/articles/checkpoint/article.sgml,v 1.7 2010/07/05 08:46:34 taras Exp $

Распространение и использование исходных (SGML DocBook) и ''скомпилированных'' форм (SGML, HTML, PDF, PostScript, RTF и прочих) с модификацией или без оной, разрешены при соблюдении следующих соглашений:

1. Распространяемые копии исходного кода (SGML DocBook) должны сохранять вышеупомянутые объявления copyright, этот список положений и следующий отказ от ответственности в первых строках этого файла в неизменном виде.

2. Распространяемые копии скомпилированных форм (преобразованные в другие DTD, конвертированные в PDF, PostScript, RTF и другие форматы) должны повторять вышеупомянутые объявления copyright, этот список положений и следующий отказ от ответственности в документации и/или других материалах, поставляемых с дистрибьюцией.

> Важно: ЭТА ДОКУМЕНТАЦИЯ ПОСТАВЛЯЕТСЯ ПРОЕКТОМ ДОКУМЕНТАЦИИ FREEBSD "КАК ЕСТЬ" И ЛЮБЫЕ ЯВНЫЕ ИЛИ НЕЯВНЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ НЕЯВНЫМИ ГАРАНТИЯМИ, КОММЕРЧЕСКОЙ ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ ПРИ КАКИХ УСЛОВИЯХ ПРОЕКТ ДОКУМЕНТИРОВАНИЯ FREEBSD НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБОЙ ПРЯМОЙ, КОСВЕННЫЙ, СЛУЧАЙНЫЙ, СПЕЦИАЛЬНЫЙ, ОБРАЗЦОВЫЙ ИЛИ ПОСЛЕДУЮЩИЙ УЩЕРБЫ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОСТАВКОЙ ТОВАРОВ ЗАМЕНЫ ИЛИ УСЛУГ; ПОТЕРЮ ДАННЫХ ИЛИ ИХ НЕПРАВИЛЬНУЮ ПЕРЕДАЧУ ИЛИ ПОТЕРИ; ПРИОСТАНОВЛЕНИЕ БИЗНЕСА), И ТЕМ НЕ МЕНЕЕ ВЫЗВАННЫЕ И В ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ КОНТРАКТНОЙ, СТРОГОЙ ОТВЕТСТВЕННОСТИ, ИЛИ ПРАВОНАРУШЕНИИ (ВКЛЮЧАЯ ХАЛАТНОСТЬ ИЛИ ИНЫМ СПОСОБОМ), ВОЗНИКШЕМ ЛЮБЫМ ПУТЕМ ПРИ ИСПОЛЬЗОВАНИИ ЭТОЙ ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ БЫ БЫЛО СООБЩЕНО О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.

FreeBSD это зарегистрированная торговая марка FreeBSD Foundation.

Check Point, Firewall-1, и VPN-1 это торговые марки Check Point Software Technologies Ltd.

Многие из обозначений, используемые производителями и продавцами для обозначения своих продуктов, заявляются в качестве торговых марок. Когда такие обозначения появляются в этом документе, и Проекту FreeBSD известно о торговой марке, к обозначению добавляется знак ''"'' или ''╝''.

В этом документе описывается, как настроить VPN-туннелирование между FreeBSD и VPN-1╝/ Firewall-1╝ компании Check Point. В других имеющихся публикациях даётся такая информация, но в ней не содержатся инструкции, специфичные для VPN-1/Firewall-1 и его интеграции с FreeBSD. Они перечислены в завершающей части этой работы для дальнейшего изучения.

[ По разделам / Одним файлом ]

## 1. Исходные данные

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

Шлюз GW на основе FreeBSD выступает в качестве межсетевого экрана и NAT-устройства для ''внутренних сетей.''

Ядро FreeBSD должно быть построено с поддержкой IPsec. Для включения IPsec в вашем ядре используйте следующие параметры ядра:

    options         IPSEC
    options         IPSEC_ESP
    options         IPSEC_DEBUG

Для получения информации по построению нестандартного ядра, обратитесь к Руководству по FreeBSD. Пожалуйста, заметьте, что между хостами Firewall-1 и GW с FreeBSD должны быть разрешены соединения IP protocol═50 (ESP) и UDP port═`500`.

Кроме того, для поддержки обмена ключами должен быть установлен пакет racoon. Racoon является частью коллекции портов FreeBSD и находится в пакадже `security/racoon`. Файл конфигурации racoon будет описан ниже в этом документе.

## 2. Настройка сетевых объектов в Firewall-1

Начните с настройки политики Firewall-1. Откройте редактор политик Policy Editor на сервере управления Firewall-1 и создайте новый сетевой объект (Network Object) типа ''Workstation'', который будет представлять машину GW с FreeBSD.

    General Tab:
    		Set name and IP address

    VPN Tab:
    		Encryption Schemes Defined:             IKE               ---> Edit

    IKE Properties:
    		Key Negotiation Encryption Methods:     3DES

    Authentication Method:
    		Pre-Shared Secret ---> Edit

Выберите Firewall Object и установите заранее известный пароль. (Не используйте его из нашего примера.)

    Support Aggressive Mode:                 Checked
    Supports Subnets:                      Checked

После установки известного пароля в определении сетевого объекта Firewall-1, укажите этот пароль в файле `/usr/local/etc/racoon/psk.txt` в системе FreeBSD на GW. Формат файла `psk.txt` таков:

    208.229.100.6          rUac0wtoo?

## 3. Конфигурация VPN-правила в Firewall-1

Теперь создайте в Firewall-1 правило, включающее шифрование между машиной GW с FreeBSD и сетью, защищённой Firewall-1. В этом правиле должны быть заданы сетевые сервисы, разрешённые к работе через VPN.

    Source            | Destination        | Service      | Action  | Track
    ------------------------------------------------------------------------
    FreeBSD GW        | FW-1 Protected Net | VPN services | Encrypt | Long
    FW-1 Protected Net| FreeBSD GW         |              |         |

''VPN-сервисами'' являются любые сервисы (то есть `telnet`, SSH, NTP и так далее), к которым разрешён доступ удалённому хосту через VPN. Будьте внимательны при включении сервисов; хосты, подключаемые через VPN, продолжают представлять потенциальную опасность. Шифрование трафика между двумя сетями даёт слабую защиту, если любой из хостов на обеих сторонах туннеля был взломан.

После настройки правила шифрования данных между машиной GW с FreeBSD и сетью, защищённой Firewall-1, просмотрите настройки ''Action Encrypt''.

    Encryption Schemes Defined:     IKE ---> Edit
    Transform:                      Encryption + Data Integrity (ESP)
    Encryption Algorithm:           3DES
    Data Integrity:                 MD5
    Allowed Peer Gateway:           Any or Firewall Object
    Use Perfect Forward Secrecy:    Checked

Использование технологии Perfect Forward Secrecy (PFS) является необязательным. Включение PFS добавит ещё один уровень безопасности на уровне шифрования данных, однако приведёт к увеличению нагрузки на CPU. Если PFS не используется, то выключите флаг выше и закомментируйте строчку `pfs_group═1` в файле `racoon.conf` на машине GW с FreeBSD. Пример файла `racoon.conf` дан в этом дальше.

## 4. Конфигурация политики VPN во FreeBSD

На этом этапе должна быть задана политика VPN на машине GW с FreeBSD. Эту функцию выполняет утилита setkey(8).

Ниже даётся пример скрипта командного процессора, который сбрасывает setkey(8) и добавляет ваши правила политики VPN.

    #
    # /etc/vpn1-ipsec.sh
    #
    # IP addresses
    #
    #     External Interface                    External Interface
    #       208.229.100.6                       216.218.197.2
    #                   |                       |
    #        +--> Firewall-1 <--> Internet <--> FreeBSD GW <--+
    #        |                                                |
    # FW-1 Protected Nets                              Internal Nets
    #    199.208.192.0/24                                  192.168.10.0/24
    #
    # Flush the policy
    #
    setkey -FP
    setkey -F
    #
    # Configure the Policy
    #
    setkey -c << END
    spdadd 216.218.197.2/32 199.208.192.0/24 any -P out ipsec
    esp/tunnel/216.218.197.2-208.229.100.6/require;
    spdadd 199.208.192.0/24 216.218.197.2/32 any -P in ipsec
    esp/tunnel/208.229.100.6-216.218.197.2/require;
    END
    #

Выполните команды setkey(8):

    # sh /etc/vpn1-ipsec.sh

## 5. Конфигурация Racoon во FreeBSD

Для обеспечения согласования ключей IPsec на машине GW с FreeBSD, необходимо установить и сконфигурировать порт `security/racoon`.

Далее приводится файл конфигурации racoon, который подходит для использования с примерами, описанными в этом документе. Пожалуйста, перед его использованием в реальной эксплуатации убедитесь, что полностью понимаете его назначение.

    # racoon.conf for use with Check Point VPN-1/Firewall-1
    #
    # search this file for pre_shared_key with various ID key.
    #
            path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
            log debug;
    #
    # "padding" defines some parameter of padding.  You should not touch these.
    #
            padding
          {
            maximum_length 20;      # maximum padding length.
            randomize off;          # enable randomize length.
            strict_check off;       # enable strict check.
            exclusive_tail off;     # extract last one octet.
          }

            listen
          {
            #isakmp ::1 [7000];
            #isakmp 0.0.0.0 [500];
            #admin [7002];          # administrative port by kmpstat.
            #strict_address;        # required all addresses must be bound.
          }
    #
    # Specification of default various timers.
    #
            timer
          {
    #
    # These values can be changed per remote node.
    #
            counter 5;              # maximum trying count to send.
            interval 20 sec;        # maximum interval to resend.
            persend 1;              # the number of packets per a send.
    #
    # timer for waiting to complete each phase.
    #
            phase1 30 sec;
            phase2 15 sec;
          }

            remote anonymous
          {
            exchange_mode aggressive,main; # For Firewall-1 Aggressive mode

            #my_identifier address;
            #my_identifier user_fqdn "";
            #my_identifier address "";
            #peers_identifier address "";
            #certificate_type x509 "" "";

            nonce_size 16;
            lifetime time 10 min;   # sec,min,hour
            lifetime byte 5 MB;     # B,KB,GB
            initial_contact on;
            support_mip6 on;
            proposal_check obey;    # obey, strict or claim

            proposal {
                    encryption_algorithm 3des;
                    hash_algorithm md5;
                    authentication_method pre_shared_key;
                    dh_group 2 ;
            }
          }

            sainfo anonymous
          {
            pfs_group 1;
            lifetime time 10 min;
            lifetime byte 50000 KB;
            encryption_algorithm 3des;
            authentication_algorithm hmac_md5;
            compression_algorithm deflate ;
          }

Проверьте, что файл `/usr/local/etc/racoon/psk.txt` содержит тот же самый заранее известный пароль, что настраивался при помощи раздела ''Настройка сетевых объектов в Firewall-1'' этого документа, и имеет режим доступа `600`.

    # chmod 600 /usr/local/etc/racoon/psk.txt

## 6. Запуск VPN в работу

Теперь вы готовы к запуску racoon и тестированию туннеля VPN. Для целей отладки откройте Log Viewer на Firewall-1 и задайте фильтр протоколирования для выделения записей, относящихся к машине GW с FreeBSD. Вам может также пригодиться просмотр журнала racoon при помощи команды tail(1):

    # tail -f /var/log/racoon.log

Запустите racoon посредством следующей команды:

    # /usr/local/sbin/racoon -f /usr/local/etc/racoon/racoon.conf

После запуска racoon выполните подключение по telnet(1) к хосту в сети, защищённой Firewall-1.

    # telnet -s 192.168.10.3 199.208.192.66 22

По этой команде выполняется попытка подключения к ssh(1)-порту машины `199.208.192.66`, той, что находится в сети, защищённой Firewall-1. Параметр `-s` задаёт используемый интерфейс в исходящем соединении. Это, в частности, важно при использовании на машине GW с FreeBSD технологий NAT и IPFW. Использование `-s` и явное задание исходящего адреса не позволит NAT подменять пакеты перед туннелированием.

При успешном обмене ключами racoon выдаст в файл протокола `racoon.log` следующее:

    pfkey UPDATE succeeded: ESP/Tunnel 216.218.197.2->208.229.100.6
    pk_recvupdate(): IPSec-SA established: ESP/Tunnel 216.218.197.2->208.229.100.6
    get pfkey ADD message IPsec-SA established: ESP/Tunnel 208.229.100.6->216.218.197.2

После того, как обмен ключами будет завершён (что занимает несколько секунд), будет выдана заставка ssh(1). Если всё прошло нормально, в средстве Log Viewer на Firewall-1 будет зафиксировано два сообщения ''Key Install''.

    Action      |  Source        |  Dest.             | Info.
    Key Install |  216.218.197.2 |  208.229.100.6     | IKE Log: Phase 1 (aggressive) completion.
    Key Install |  216.218.197.2 |  208.229.100.6     | scheme: IKE methods

В информационной колонке подробный протокол будет выглядеть так:

    IKE Log: Phase 1 (aggressive) completion. 3DES/MD5/Pre shared secrets Negotiation Id:
    scheme: IKE methods: Combined ESP: 3DES + MD5 + PFS (phase 2 completion) for host:

## 7. Ссылки

- Руководство FreeBSD: VPN через IPsec ../../../../doc/ru_RU.KOI8-R/books/handbook/ipsec.html

- Проект KAME http://www.kame.net

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.