Настройка L2TP+IPSec VPN-сервера на FreeBSD 10
VPN планируется для подключения удалённых сотрудников. Авторизация IPsec будет проходить по PSK (pre_shared_key). Реализация с помощью mpd5+racoon.
Установку будет произодить на только что установленный сервер FreeBSD.
# uname -r
10.1-RELEASE-p6
Первым делом подготовим ядро системы. Соответственно необходимы исходники.
Осходный код для своей версии сестемы можно получить следущим образом (10.2 заменити на своё значение): svnlite co svn://svn.freebsd.org/base/releng/10.2 /usr/src
Для начала необходимо применить несколько патчей для нормальной работы IPSec через NAT. (Основная проблема в том что Windows неправильно проверяет checksum зашифрованных пакетов).
# cd /usr/
# fetch http://tech4u.pro/files/ipsec-patches-FBSD-10.0.diff
# patch < ipsec-patches-FBSD-10.0.diff
После патча необходимо пересобрать ядро и установить. Копируем старый конфиг и правим:
# cp /usr/src/sys/amd64/conf/GENERIC /usr/src/sys/amd64/conf/IPSEC
# ee /usr/src/sys/amd64/conf/IPSEC
-ident GENERIC
+ident IPSEC
+options IPSEC
+options IPSEC_NAT_T
+options IPSEC_DEBUG
+options IPSEC_FILTERTUNNEL
+device crypto
+evice enc
Установим новое ядро и перезагрузимся.
# cd /usr/src
# make -j4 buildkernel KERNCONF=IPSEC
# make installkernel KERNCONF=IPSEC
# shutdown -r now
С ядром закончили. Осталось пропатчить racoon - demon, отвечающий за IPSEC. Не забываем обновить порты и пакетный менеджер.
# cd /usr/ports/security/ipsec-tools/
# make extract
# cd /usr/ports/security/ipsec-tools/work/ipsec-tools-0.8.1/
# fetch http://tech4u.pro/files/patch-zz-local-0.diff
# fetch http://tech4u.pro/files/patch-zz-local-1.diff
# fetch http://tech4u.pro/files/patch-zz-local-2.diff
# fetch http://tech4u.pro/files/patch-zz-local-3.diff
# fetch http://tech4u.pro/files/patch-zz-local-4.diff
# patch < patch-zz-local-0.diff
# patch < patch-zz-local-1.diff
# patch < patch-zz-local-2.diff
# patch < patch-zz-local-3.diff
# patch < patch-zz-local-4.diff
# cd ../../
# make
# make install
После установки залочим пакет, т.к. после обновления все наши патчи слетят.
# pkg lock ipsec-tools
Теперь необходимо настроить Racoon и IPSec:
# cp /usr/local/share/examples/ipsec-tools/racoon.conf /usr/local/etc/racoon/racoon.conf
# cp /usr/local/share/examples/ipsec-tools/psk.txt /usr/local/etc/racoon/psk.txt
Мой конфиг Racoon:
path pre_shared_key "/usr/local/etc/racoon/psk.txt";
# racoon will look for certificate file in the directory,
# if the certificate/certificate request payload is received.
log debug;
# "padding" defines some padding parameters. 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.
}
# if no listen directive is specified, racoon will listen on all
# available interface addresses.
listen
{
isakmp xxx.xxx.xxx.xxx; # Адрес вашего сервера
isakmp_natt xxx.xxx.xxx.xxx [4500];
#isakmp xxx.xxx.xxx.xxx [500];
#admin [7002]; # administrative port for racoonctl.
#strict_address; # requires that all addresses must be bound.
}
# Specify various default timers.
timer
{
# These value 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 send.
# maximum time to wait for completing each phase.
phase1 30 sec;
phase2 15 sec;
}
remote anonymous
{
exchange_mode main, aggressive;
# doi ipsec_doi;
situation identity_only;
#my_identifier asn1dn;
#certificate_type x509 "my.cert.pem" "my.key.pem";
lifetime time 24 hour;
nonce_size 16;
initial_contact on;
proposal_check obey; # obey, strict, or claim
ike_frag on;
#generate_policy on;
nat_traversal on;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2;
}
}
sainfo anonymous
{
pfs_group 2;
encryption_algorithm 3des, des;
authentication_algorithm hmac_sha1, hmac_md5;
compression_algorithm deflate;
}
В psk.txt
достаточно добавить одну строчку. Это будет pre shared key для любый адресов
* ваш_pre_shared_key
Так же на этот файл необходимо задать права 0600.
# chmod 0600 psk.txt
Отредактируем стартовый скрипт ipsec.
# ee /etc/rc.d/ipsec
-ipsec_program="/sbin/setkey"
+ipsec_program="/usr/local/sbin/setkey"
Добавим политики шифрования.
# ee /etc/ipsec.conf
+flush;
+spdflush;
+spdadd 0.0.0.0/0[0] 0.0.0.0/0[1701] udp -P in ipsec esp/transport//require;
+spdadd 0.0.0.0/0[1701] 0.0.0.0/0[0] udp -P out ipsec esp/transport//require;
Установим mpd5 - vpn сервер.
# pkg install mpd5
Мой конфиг mpd.conf
.
startup:
# configure mpd users
set user foo bar admin
set user foo1 bar1
# configure the console
set console self 127.0.0.1 5005
set console open
# configure the web server
set web self 0.0.0.0 5006
set web open
#
# Default configuration is "dialup"
default:
load l2tp_server
l2tp_server:
set ippool add priv_access 10.10.41.2 10.10.41.13 #пул адресов
create bundle template C
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
set ipcp ranges 10.10.41.0/28 ippool priv_access
set ipcp dns 8.8.8.8
set ccp yes mppc
set mppc yes e40
set mppc yes e128
set mppc yes stateless
create link template N l2tp
set link action bundle C
set link enable multilink
set link yes acfcomp protocomp
set link no pap chap
set link enable chap
set link keep-alive 10 60
set link mtu 1460
set l2tp self ххх.ххх.ххх.ххх # - адрес вашего сервера
set link enable incoming
Впринципе всё. Добавляем в rc.conf следующие строчки.
#VPN_IPSEC--------------------------
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
racoon_enable="YES"
racoon_create_dirs="YES"
mpd_enable="YES"
И перезагружаемся.
Создаём новое VPN подключение в windows. Указываем адрес сервера. Тип VPN выбираем L2TP c IPsec. Не забываем в дополнительных параметрах указать ключ (psk.txt).