воскресенье, 6 декабря 2009 г.

IPSEC туннель между модемом Asus AM604g и FreeBSD 7.0

Исходные данные:
Сервер живёт на реальном IP=ххх.ххх.ххх.ххх , внутренний интерфейс 10.10.122.4 на котором сеть 10.10.122.0/24, на сервере установлены ipsec-tools-0.7.3.

Модем на динамическом, но также реальном IP, интернет подключен через СТРИМ, внутренняя сеть 10.10.133.0/24, внутренний фейс модема 10.10.133.4 (на модеме 4 Lan порта и WiFi, поднят dhcp, маршрутизация статическая).

Генерим самоподписные сертификаты для сервера и модема приведёнными ниже скриптами.
Серверный сертификат:

server$ cat ./gencrt_bsd.sh
#!/bin/sh
openssl req -new -nodes -newkey rsa:1024 -sha1 -keyform PEM -keyout server.test.ru.private -outform PEM -out server.test.ru.pem

openssl x509 -days 9999 -req -in server.test.ru.pem -signkey server.test.ru.private -out server.test.ru.public

openssl x509 -in server.test.ru.public -text


Сертификат для модема:

server$ cat ./gencrt_adsl.sh
#!/bin/sh
openssl req -new -nodes -newkey rsa:1024 -sha1 -keyform PEM -keyout adsl.test.ru.private -outform PEM -out adsl.test.ru.pem

openssl x509 -days 9999 -req -in adsl.test.ru.pem -signkey adsl.test.ru.private -out adsl.test.ru.public

openssl x509 -in adsl.test.ru.public -text


В настройках модема:
1. Идём в раздел Advanced Setup->Certificate->Trusted CA, жмём Import Certificate и через copy/paste добавляем публичный сертификат сервера (server.test.ru.public).
У меня он называется "server.test.ru".

2. В разделе Advanced Setup->Certificate->Local, говорим Import Certificate и добавляем сертификаты модема (публичный и приватный - adsl.test.ru.public/adsl.test.ru.private), называем "adsl".

3. В разделе Advanced Setup->IPsec, создаём подключение: Add New Connection,
где выставляем
IPSec Connection Name = myconnection,
Remote IPSec Gateway Address (IP or Domain Name) = ххх.ххх.ххх.ххх,
Tunnel access from local IP addresses = subnet,
IP Address for VPN = 10.10.133.4,
IP Subnetmask = 255.255.255.0,
Tunnel access from remote IP addresse = subnet,
IP Address for VPN = 10.10.122.4,
IP Subnetmask = 255.255.255.0,
Key Exchange Method = auto(ike),
Authentication Method = certificate(x.509),
certificates = adsl,
Perfect Forward Secrecy = enable,

Advanced IKE Settings
Phase 1
Mode = aggressive,
Encryption Algorithm = 3des,
Integrity Algorithm = sha1,
Select Diffie-Hellman Group for Key Exchange = 1024bit,
Key Life Time = 3600seconds,
Phase 2
Encryption Algorithm = 3des,
Integrity Algorithm = sha1,
Select Diffie-Hellman Group for Key Exchange = 1024bit,
Key Life Time = 3600seconds
Жмакаем Save/Apply и на свежесозданном подключении ставим галку Enable.

Для тестирования и отладки, разделе Management->System Log можно выставить уровень debug. Логи очень информативны и помогут разобраться в проблемах подключения.


Теперь настройки сервера:
Публичные и приватные сертификаты сервера, а также публичный ключ модема кладём в /usr/local/etc/racoon/cert и выставляем корректные права:

server$ ls -AlFGo /usr/local/etc/racoon
drwx------ 2 root wheel - 512 1 дек 00:53 cert/
-rw------- 1 root wheel - 8523 3 дек 00:05 racoon.conf

server$ ls -AlFGo /usr/local/etc/racoon/cert
-rw------- 1 root wheel - 948 1 дек 00:46 adsl.test.ru.public
-rw------- 1 root wheel - 1034 7 окт 12:46 server.test.ru.public
-rw------- 1 root wheel - 733 29 июл 2008 server.test.ru.pem
-rw------- 1 root wheel - 887 29 июл 2008 server.test.ru.private
-rw------- 1 root wheel - 1013 29 июл 2008 server.test.ru.public


Дальше правим /usr/local/etc/racoon/racoon.conf

server$ cat /usr/local/etc/racoon/racoon.conf

path include "/usr/local/etc/racoon";
path certificate "/usr/local/etc/racoon/cert";

log debug2;
#log info;
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.
}

# if no listen directive is specified, racoon will listen on all
# available interface addresses.
listen
{
isakmp xxx.xxx.xxx.xxx [500];
}

# Specify various default timers.
timer
{
# These value can be changed per remote node.
counter 5; # количество повторов отправки 5 = дефолт
interval 20 sec; # интервал между попытками отправки 10 = дефолт
persend 1; # количество отправляемых пакетов 1 = дефолт
phase1 90 sec; # максимальное время отведённое на завершение фазы 1
phase2 90 sec; # то-же для 2й фазы
}

remote anonymous
{
exchange_mode main,aggressive;# режим обмена для фазы 1, когда racoon
# выступает инициатором, также определяет
# допустимые режимы обмена, когда racoon-
# responder.Описываются через запятую,
# первое значение в списке используется
# когда racoon инициатор (main,aggressive,base)
doi ipsec_doi; # использовать расширение по RFC 2407
situation identity_only;# использовать SIT_IDENTITY_ONLY по RFC 2407
passive on; # инициируем соединения или ждём подключений
generate_policy on; # генерим политики ибо IP противоположной стороны неизвестен
nonce_size 16;# default = 16, размер nonce = (8-256), подробности в RFC2409...
lifetime time 60 min;
initial_contact on; # включение отправки сообщения INITIAL-CONTACT при рестарте
# default = on, это сообщение полезно
# если responder оставляет старый SA при реконнекте.
# Если сообщение не послать, то responder будет
# использовать старый SA даже когда уже существует новый.
# можно юзать net.key.preferred_oldsa в sysctl, чтобы
# принудительно оставлять старый SA
proposal_check obey;# obey- при выборе pfs,lifetime и длине ключей,
# использовать значения предлагаемые инициатором
# strict,claim- если наши значения серьёзней, то ок,
# иначе отклоняем... или наоборот при claim
# exact- если не совпадают с нашими то не принимаем ...
my_identifier asn1dn; # идентификатор сервера отправляемый
# удалённому хосту будет взят из поля
# Subject сертификата
peers_identifier asn1dn;
certificate_type x509 "server.test.ru.public" "server.test.ru.private";
peers_certfile x509 "adsl.test.ru.public";

# конфигурация параметров предложения первой фазы
proposal {
encryption_algorithm 3des;# алгоритм шифрования
hash_algorithm sha1; # метод хеширования
authentication_method rsasig; # метод аутентификации- по сертификатам
dh_group 2; # длина ключа Диффи-Хеллмана 1024бит (1-768бит)
}
}

# конфигурация параметров предложения второй фазы
sainfo anonymous
{
pfs_group 2;
lifetime time 60 min; # время жизни ключа 2 фазы
encryption_algorithm 3des; # алгоритм шифрования 2 фазы
authentication_algorithm hmac_sha1,hmac_md5; # алгоритм хэширования 2 фазы
compression_algorithm deflate; # алгоритм сжатия 2 фазы
}



Теперь правим /etc/rc.conf:

server$ echo "ipsec_enable="YES" >> /etc/rc.conf
server$ echo "racoon_enable="YES" >> /etc/rc.conf

Стартуем в консоли сервера racoon -vFdddddd, пингуем любой живой хост с обратной стороны туннеля и смотрим дебаг -всё должно взлететь...
Если нет, то смотрим настройки файерволла на сервере - должен пропускаться udp на 500 порт (isakmp) а также протокол esp.

Я использую pf, правила такие:
pass in on $ext_if proto udp from any to $ext_ip port {isakmp}
pass in on $ext_if proto esp from any to $ext_ip

При описанной схеме подключения, FreeBSD кидает пакеты в туннель без указаний маршрутов и настройки политик в /etc/ipsec.conf. Модем также не нуждается в прописывании дополнительных маршрутов. (Но если вы например планируете использовать для аутентификации на модеме, radius сервер находящийся в сети по ту сторону туннеля, то маршрут прописать всё таки придётся - указывать он должен на внутренний интерфейс модема -10.10.133.4)

Воспроизведение, перепечатка или распространение иным образом материалов данной статьи возможно только с указанием автора и гиперссылки на данную страницу.

Комментариев нет:

Отправить комментарий