Skip to main content

Настройка L2TP+IPSec VPN-сервера на FreeBSD 10

freebsd l2tp ipsec

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

RACOON

# 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).

 windows ipsec

 

freebsd, l2tp, vpn, ipsec