Настройка шифрованного туннеля во FreeBSD с использованием IPSEC

Добавил Support
Для ITDoc

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
1,418 Просмотров!

Издано: апреля 23, 2009

Итак. Старая статья устарела :). Да и понадобилось сделать на
6.2,  в отличие от описанной там 4.11, заодно прикрутить сертификаты -
для надёжности. Посему, пишу заново.

Подробности  о  том, как всё сделать “руками”, плюс дополнительные
объяснения  можно  глянуть  в  старой  версии  статьи,  тут будет лишь
описание,  как  сделать  туннели,  и  прочее  по  теме  чисто штатными
средствами (раньше половина подымалась своими скриптами).

Исходные   условия   -   две   машины,   первая  -  217.15.62.49,
192.168.160.254   (via.epia);  вторая  217.15.62.200,  192.168.170.254
(test.lissyara.su), задача - связать сети 192.168.x.x. Предполагается,
что обе машины - default router для своих сетей, иначе придётся внутри
сети рулить пакеты дополнительно.

Поехали. Для начала пересобираем ядро с такими опциями:

# firewall (необязательно, можете загрузить модулем.)
# Однако, сам по себе файрволл всё же нужен, ибо неплохо ограничить
# хосты которые могут коннектится на порты ракона - на всякий случай...
options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=1000
options         TCP_DROP_SYNFIN

# IPSEC
options         IPSEC
options         IPSEC_ESP
options         IPSEC_DEBUG     # необязательно, но облегчит поиск проблем

Пока собирается ядро, обновляем порты такой командой:

test.lissyara.su # csup -g -L 2 -h cvsup5.ru.freebsd.org \
? /usr/share/examples/cvsup/ports-supfile && cd /usr/ports/ \
? && make fetchindex

После обновления ставим racoon, из коллекции ipsec-tools:

/usr/home/lissyara/>cd /usr/ports/security/ipsec-tools/
/usr/ports/security/ipsec-tools/>make install clean

Лезет такое окошко:

+--------------------------------------------------------------------+
|                  Options for ipsec-tools 0.6.6                     |
| +----------------------------------------------------------------+ |
| |[X] DEBUG      enable Debug support                             | |
| |[ ] IPV6       enable IPV6 support                              | |
| |[ ] ADMINPORT  enable Admin port                                | |
| |[ ] STATS      enable Statistics logging function               | |
| |[X] DPD        enable Dead Peer Detection                       | |
| |[ ] NATT       enable NAT-Traversal (kernel-patch required)     | |
| |[ ] NATTF      require NAT-Traversal (fail without kernel-patch)| |
| |[X] FRAG       enable IKE fragmentation payload support         | |
| |[ ] HYBRID     enable Hybrid Mode-cfg and Xauth support         | |
| |[ ] PAM        enable PAM authentication                        | |
| |[ ] GSSAPI     enable GSS-API authentication                    | |
| |[ ] RADIUS     enable Radius authentication                     | |
| |[ ] SAUNSPEC   enable Unspecified SA mode                       | |
| |[ ] RC5        enable RC5 encryption (patented)                 | |
| |[ ] IDEA       enable IDEA encryption (patented)                | |
+-+----------------------------------------------------------------+-+
|                       [  OK  ]       Cancel                        |
+--------------------------------------------------------------------+

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

/usr/home/lissyara/>mkdir -p /usr/local/etc/racoon/cert
/usr/home/lissyara/>cp /usr/local/share/examples/ipsec-tools/racoon.conf /usr/local/etc/racoon/racoon.conf

До рихтовки конфига, надо нагенерить сертификатов. Честно говоря с
OpenSSL  особо не разбирался, сама операция откуда-то чесно дёрнута, и
подрихтована под свои нужды, посему даю как есть:

/usr/home/lissyara/>cd /usr/local/etc/racoon/cert/
/usr/local/etc/racoon/cert/>openssl req -new -nodes -newkey rsa:1024 \
-sha1 -keyform PEM -keyout via.epia.private -outform PEM \
-out via.epia.pem
Generating a 1024 bit RSA private key
..............................++++++
..++++++
writing new private key to 'via.epia.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]:SU
State or Province Name (full name) [Some-State]:USSR
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Home Network
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Alex Keda
Email Address []:admin@lissyara.su

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
/usr/local/etc/racoon/cert/>
/usr/local/etc/racoon/cert/>ll
total 4
-rw-r--r--  1 root  wheel  676 15 мар 14:44 via.epia.pem
-rw-r--r--  1 root  wheel  887 15 мар 14:44 via.epia.private
/usr/local/etc/racoon/cert/>openssl x509 -req -in via.epia.pem -signkey via.epia.private  -out via.epia.public
Signature ok
subject=/C=SU/ST=USSR/L=Moscow/O=Home Network/CN=Alex
Keda/emailAddress=admin@lissyara.su
Getting Private key
/usr/local/etc/racoon/cert/>ll
total 6
-rw-r--r--  1 root  wheel  676 15 мар 14:44 via.epia.pem
-rw-r--r--  1 root  wheel  887 15 мар 14:44 via.epia.private
-rw-r--r--  1 root  wheel  899 15 мар 14:48 via.epia.public
/usr/local/etc/racoon/cert/>

Для второй машины тоже генерируем ключи, и копируем с одной на другую
файлики  *.public.  В принципе, имена ключей неважны, можно называть и
по IP, с соответствующими расширениями.

Далее, рисуем конфиги, для обоих одинаковые, тока меняются местами
все IP и ключи:

/etc/rc.conf

# added by lissyara 2007-03-15 in 14:32
# Включем racoon
racoon_enable="YES"
# создаём gif-интерфейс
cloned_interfaces="gif0"
# пробиваем туннель
gif_interfaces="gif0"
gifconfig_gif0="217.15.62.49 217.15.62.200"
ifconfig_gif0="inet 192.168.160.254 192.168.170.254 netmask 0xffffffff"
# Включаем IPSEC
ipsec_enable="YES"
# вводим статический роутинг
static_routes="RemoteLan"
route_RemoteLan="192.168.170.0/24 -interface gif0"

/etc/ipsec.conf

# тут описывается как шифруется проходящая
# в туннеле инфа. Для второй машины надо просто поменять IP местами
spdadd 217.15.62.49/32 217.15.62.200/32 ipencap -P out ipsec
esp/tunnel/217.15.62.49-217.15.62.200/require;
spdadd 217.15.62.200/32 217.15.62.49/32 ipencap -P in ipsec
esp/tunnel/217.15.62.200-217.15.62.49/require;

/usr/local/etc/racoon/racoon.conf
[cc lang="bash" tab_size="2" lines="-1"]
# $KAME: racoon.conf.sample,v 1.28 2002/10/18 14:33:28 itojun Exp $

# "path" затрагивает директиву "include".  "path" должен быть задан до любых
# директив "include" с относительным путём к файлу.
# Вы можете перезадать директиву "path" впоследствии, однако, это может
# привести большому замешательству.
path include "/usr/local/etc/racoon" ;
#include "remote.conf" ;

# файл должен содержать пару ключей ID/key, для аутентификации по ключам.
#path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;

# racoon будет искать файл сертификата в директории, если передан полезный
# запрос certificate/certificate.
path certificate "/usr/local/etc/racoon/cert/" ;

# "log" определяет уровень логгирования. Он сопровождается одним из
#  "notify", "debug" или "debug2".
log debug2;

# "padding" задаёт некоторые параметры формирования пакетов (если я верно понял)
# Ничего тут не трогайте. (Ага, конечно! - прим. lissyara)
padding
{
maximum_length 20;      # максимальная длинна набивки (?).
randomize off;          # включение случайной длинны.
strict_check off;       # включить строгую проверку.
exclusive_tail off;     # извлекать один последний октет.
}

# если директива listen не задана, racoon слушает все доступные
# адреса интерфейсов.
listen
{
#isakmp ::1 [7000];
isakmp 217.15.62.49 [500];
#admin [7002];          # административный порт для racoonctl.
#strict_address;        # требует что все адреса должны быть ограничены
.
}

# Задание различных дефолтовых таймеров.
[cc lang="bash" tab_size="2" lines="-1"]    timer
{
# Эти значения могут быть изменены удалённым узлом.
counter 5;              # максимальный счётчик попыток отсыла.
interval 20 sec;        # максимальный интерал для повторной посылки.
persend 1;              # число отсылаемых пакетов.

# максимальное время ожидания для завершения каждой фазы.
phase1 30 sec;
phase2 15 sec;
}

# описываем удалённый хост (на второй машине - идентично,
# тока другой IP и ключи)
remote  217.15.62.200
{
exchange_mode aggressive,main;
my_identifier asn1dn;
peers_identifier asn1dn;
# сертификаты этой машины
certificate_type x509 "via.epia.public" "via.epia.private";
# сертификат удлённой машины
peers_certfile x509 "test.lissyara.su.public";
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method rsasig;
dh_group 2 ;
}
}

# Вначале хотел вообще без этой секции,
# но неподнялось, с такой руганью в логах:
# racoon: ERROR: failed to get sainfo.
sainfo anonymous
{
pfs_group 5;
lifetime time 60 min;
encryption_algorithm 3des ;
authentication_algorithm hmac_sha1;
compression_algorithm deflate ;
}

Думается,   к   этому   моменту   ядро   уже   пересобралось,   и
проинсталлилось. Можно перезагружатья. После перезагрузки смотрим:

/usr/home/lissyara/>ifconfig
vr0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.160.254 netmask 0xffffff00 broadcast 192.168.160.255
ether 00:40:63:d8:23:6d
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 217.15.62.49 netmask 0xffffffc0 broadcast 217.15.62.63
ether 00:40:63:d8:23:3c
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.0.0.1 netmask 0xff000000
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
tunnel inet 217.15.62.49 --> 217.15.62.200
inet 192.168.160.254 --> 192.168.170.254 netmask 0xffffffff

/usr/home/lissyara/>
/usr/home/lissyara/>ps -ax | grep racoon
859  ??  Is     0:00,01 /usr/local/sbin/racoon
1091  p0  R+     0:00,01 grep racoon
/usr/home/lissyara/>

Всё  нормально,  все  интерфейсы  создались,  racoon запущен. Надо
заметить,  что  пока  в фаерволле не прокрутили дырки для протоколов и
портов,  по  которым  пашет  туннель,  по  нему  ничё не пойдёт. Также
учтите,  что  ядро собранное с вышеуказанными (которые про firewall, а
не  про  ipsec)  опциями,  включает  файроволл  при загрузке, в режиме
запрета  всего.  Поэтому до перезагрузки лучше настроить файрволл, или
иметь физический доступ к машине.

Настраиваем фаервол:

/usr/home/lissyara/>ipfw show | head -4
00100   48   4032 allow ip from any to any via gif0
00200    2   1656 allow udp from 217.15.62.200 to me dst-port 500
00300   35   5600 allow esp from me to 217.15.62.200
00400   35   5600 allow esp from 217.15.62.200 to me

Ну и пробуем попинговаться:

/usr/home/lissyara/>ping 192.168.170.254
PING 192.168.170.254 (192.168.170.254): 56 data bytes
64 bytes from 192.168.170.254: icmp_seq=4 ttl=64 time=3.160 ms
64 bytes from 192.168.170.254: icmp_seq=5 ttl=64 time=2.355 ms
^C
--- 192.168.170.254 ping statistics ---
6 packets transmitted, 2 packets received, 66% packet loss
round-trip min/avg/max/stddev = 2.355/2.758/3.160/0.402 ms
/usr/home/lissyara/>

Первые  4  пакета  потерялись,  при поднятии туннеля, затем всё забегало.

В  случае  проблем,  смотрим  логи (/var/log/security). У меня там
(/var/log/messages) нашлась интересная строка:

Mar 16 10:51:31 epia kernel: WARNING: pseudo-random number generator
used for IPsec processing

Рыскания  по  инету ни к чему не привели. В  рассылке  lists.freebsd.org
рекомендуют  ставить железный генератор случайных чисел :).

P.S.  Рекомендую  ознакомиться  со старой версией статьи для понимания
происходящего.

автор: <a class="text_link" title="Лужу, паяю, Э-Вэ-эМы починяю..." href="http://www.lissyara.su/?id=1024">lissyara</a>

Популярность: 89% [!]

Tagged with: , , , , , , , ,


Спонсор



 WPSN comments




Да человек я, человек! =)

ITDoc самый Последний