Итак. Старая статья устарела :). Да и понадобилось сделать на
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 # необязательно, но облегчит поиск проблем
Пока собирается ядро, обновляем порты такой командой:
+--------------------------------------------------------------------+ | 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 |
+--------------------------------------------------------------------+
Опции, которые я выбрал - указаны. После инсталляции, идём
создавать директории (странно, но хотя стартовые скрипты инсталлялся,
директории которые требуются - не создаются, хотя в этих самых
скриптах они указаны), заодно копируем дефолтовый конфиг, который тоже
не инсталлится куда положено:
До рихтовки конфига, надо нагенерить сертификатов. Честно говоря с
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 67615 мар 14:44 via.epia.pem
-rw-r--r-- 1 root wheel 88715 мар 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 67615 мар 14:44 via.epia.pem
-rw-r--r-- 1 root wheel 88715 мар 14:44 via.epia.private
-rw-r--r-- 1 root wheel 89915 мар 14:48 via.epia.public /usr/local/etc/racoon/cert/>
Для второй машины тоже генерируем ключи, и копируем с одной на другую
файлики *.public. В принципе, имена ключей неважны, можно называть и
по IP, с соответствующими расширениями.
Далее, рисуем конфиги, для обоих одинаковые, тока меняются местами
все IP и ключи:
# тут описывается как шифруется проходящая # в туннеле инфа. Для второй машины надо просто поменять 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 -Pin ipsec
esp/tunnel/217.15.62.200-217.15.62.49/require;
# "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; # требует что все адреса должны быть ограничены
. }
# Задание различных дефолтовых таймеров. [cclang="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 time60 min;
encryption_algorithm 3des ;
authentication_algorithm hmac_sha1;
compression_algorithm deflate ; }
Думается, к этому моменту ядро уже пересобралось, и
проинсталлилось. Можно перезагружатья. После перезагрузки смотрим:
Всё нормально, все интерфейсы создались, racoon запущен. Надо
заметить, что пока в фаерволле не прокрутили дырки для протоколов и
портов, по которым пашет туннель, по нему ничё не пойдёт. Также
учтите, что ядро собранное с вышеуказанными (которые про firewall, а
не про ipsec) опциями, включает файроволл при загрузке, в режиме
запрета всего. Поэтому до перезагрузки лучше настроить файрволл, или
иметь физический доступ к машине.
Настраиваем фаервол:
/usr/home/lissyara/>ipfw show |head-4
00100 484032 allow ip from any to any via gif0
00200 21656 allow udp from 217.15.62.200 to me dst-port 500
00300 355600 allow esp from me to 217.15.62.200
00400 355600 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=4ttl=64time=3.160 ms 64 bytes from 192.168.170.254: icmp_seq=5ttl=64time=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 1610:51:31 epia kernel: WARNING: pseudo-random number generator
used for IPsec processing
Рыскания по инету ни к чему не привели. В рассылке lists.freebsd.org
рекомендуют ставить железный генератор случайных чисел :).
P.S. Рекомендую ознакомиться со старой версией статьи для понимания
происходящего.