Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Построение VPN с IPSEC.

Рубрика: Безопасность -> Топология сети
Метки: | |
Среда, 4 марта 2009 г.
Просмотров: 7623

VPN - это метод, дающий возможность двум сетям безопасно обмениваться данными друг с другом через третью, небезопасную, сеть. VPN может применяться, как гарантия обмена информацией между двумя частными локальными сетями (в частности, сетями офисов большой компании, которые находятся на больших расстояниях друг от друга). 

     Так как прокладка выделенной линии - это очень дорогое удовольствие, то для передачи данных используется дешевая и небезопасная среда - Интернет.

     VPN снимает проблему перехвата данных, которые посылаются через Интернет, организуя виртуальный защищенный канал между двумя сетями. При этом создается впечатление, как будто эти две сети непосредственно соединены между собой. Здесь Интернет служит в роли большого участка Ethernet-кабеля, по которому пересылаются данные компьютеров этих двух сетей.


     На рисунке - VPN, соединяющая две локальные сети. От единого адресного пространства во внутренних сетях лучше отказаться, чтобы не было проблем маршрутизации и конфликтов IP-адресов. Например, сеть А использует сетевой адрес 192.168.0.0, а сеть В - 10.0.9.0.

     Безопасное тунеллирование данных (создается виртуальный канал, по которому данные передаются в зашифрованном виде) поддерживает протокол IPsec. Конечными точками туннеля являются граничные маршрутизаторы обеих сетей. Трафик шифруется только при его передаче через Интернет, при передаче информации внутри каждой локальной сети шифрование трафика не производится. Оба маршрутизатора (шлюза) должны поддерживать IPsec.

     Реализация.

     В Linux-ядрах 2.2 и 2.4 IPsec не включен в состав ядра. Там он настраивается с помощью пакета FreeS/WAN, в составе которого есть пользовательские утилиты и утилиты уровня ядра. В ядре 2.6 IP­sec встроен в само ядро и поддерживается им. В нем FreeS/WAN больше не нужен, хотя есть и портированная на ядро 2.6 версия FreeS/WAN.

     Реализация IPsec в ядре 2.6 похожа на BSD-реализацию IPsec (например, в FreeBSD или OpenBSD). В качестве пользовательских утилит применяется пакет ipsec-tools.

     Установка.

     В пакете ipsec-tools (Можно загрузить отсюда: http://sourceforge.net/projects/ipsec-tools/) доступны три программы:

  1. Libipsec - С-библиотека Ipsec;
  2. Setkey - применяется для создания и управления SA;
  3. Raccoon - IKE-демон.

     Компиляция и установка этих утилит проходит в стандартной последовательности, используются команды: ./configure; make; make install.

     Сертификаты X.509.

     Для автоматического обмена ключами и сертифицированной аутентифика­ции с помощью IKE нужно сгенерировать сертификаты Х.509 для каждого узла:

# openssl req -new -nodes -newkey rsa:1024 -sha1 -keyform PEM -keyout komp1.private -outform PEM -out otvet.pem

Generating a 1024 bit RSA private key

..++++++

.++++++

writing new private key to 'komp1.private'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:RU

State or Province Name (full name) [Some-State]:none

Locality Name (eg, city) []:Moskow

Organization Name (eg, company) [Internet Widgits Pty Ltd]:test.ru

Organizational Unit Name (eg, section) []:test

Common Name (eg, YOUR name) []:root

Email Address []:root@test.ru

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []: secreta

An optional company name []:

     Теперь подпишем ключ сами себе:

# openssl x509 -req -in otvet.pem -signkey komp1.private -out komp1.public

Signature ok

subject=/C=RU/ST=none/L=Moskow/O=test.ru/OU=test/CN=root/emailAddress=root@test.ru

Getting Private key

    Эти действия нужно проделать для каждого шлюза, которому нужен ключ. Сгенерированные частные и открытые ключи помещаем в ка­талог, где будет установлен Raccon(например, /usr/local/etc/raccoon/certs). Открытые ключи копируем на другие шлюзы. Например, каталог /usr/local/etc/raccoon/certs на шлюзе komp1 содержит файлы:

  • komp1.private;
  • komp1.public;
  • komp2.public;

     На шлюзе komp2 будут такие файлы:

  • komp2.private;
  • komp2.public;
  • komp1.public;

     Для всех ключей устанавливаем права доступа 700:

chmod 700 (владелец ключа - root).

     Конфигурация Raccon.

     Файл конфигурации демона Racoon расположен в каталоге /usr/local/etc/racoon.conf . На шлюзе komp1 добавляем такие строчки в конфигурационный файл:

Path certificate "/usr/local/etc/raccoon/certs";

remote 192.168.0.1 {

exchange_mode main;

my_identifier asnldn;

peers_identifier asnldn;

certificate_type x509 "komp2.public" "komp1.private";

peers_certificate "komp1.public";

proposal {

     encryption_algorithm 3des;

     hash_algorithm shal;

     authentication_method rsasig;

     dh_group 2; }

} 

     На шлюзе komp2 конфигурация следующая:

path certificate "/usr/local/etc/raccoon/certs";

remote 10.0.0.1 {

exchange_mode main;

my_identifier asnldn;

peers_identifier asnldn;

certificate_type x509 "komp1.public" "komp2.private";

peers_certificate "komp2.public";

proposal {

     encryption_algorithm 3des;

     hash_algorithm shal;

     authentication_method rsasig;

     dh_group 2; }

}

     Политики безопасности.

     Теперь нужно установить политики для туннеля. На komp1 создадим и выполним такой сценарий:

#!/sbin/setkey -f

flush;

spdflush;

spdadd 192.168.0.0/24 10.0.0/16 any -P in ipsec esp/tunnel/192.168.0.1-10.0.0.1/require;

spdadd 10.0.0/16 192.168.0.0/24 any -P out ipsec esp/tunnel/10.0.0.1-192.168.0.1/require;

     На шлюзе komp2 создадим похожий сценарий и также выполним его:

#!/sbin/setkey -f

flush;

spdflush;

spdadd 10.0.0/16 192.168.0.0/24 any -P in ipsec esp/tunnel/10.0.0.1-192.168.0.1/require;

spdadd 192.168.0.0/24 10.0.0/16 any -P out ipsec esp/tunnel/192.168.0.1-10.0.0.1/require;

     Присвоим этим сценариям подходящие имена и пропишем их в сценариях загрузки системы. После запуска этих сценариев на обоих шлю­зах между локальными сетями будет создан защищенный канал. Убедиться в этом можно с помощью снифферов пакетов tcpdump или ethereal.