Набросок статьи для L2TP/IPSEC клиента под FreeDSB 10

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Sindikat88
мл. сержант
Сообщения: 131
Зарегистрирован: 2010-09-02 15:07:54
Контактная информация:

Набросок статьи для L2TP/IPSEC клиента под FreeDSB 10

Непрочитанное сообщение Sindikat88 » 2017-07-24 12:22:57

Приветствую всех, кто столкнулся с проблемой настройки L2TP/IPSEC соединения в FreeBSD.
После долгих изысканий и поисков по западным форумам и азиатским форумам (да да, если нужда припрет, то и азиатские форумы будешь копать), мне наконец таки удалось решить свою проблему.
А теперь вкратце о самой проблеме.
Мои коллеги из дружественной девелоперской компании решили установить у себя шлюз в виде железки Mikrotik с L2TP/IPSEC preshared key VPN сервером на борту.
А т.к. часть этих коллег хотела работать на нашей территории, то нужно было им выделять отдельную изолированную подсеть с возможностью ходить в "домашнюю" сеть компании.
Итак, приступим:
Имеется система с уже настроенным клиентом OpenVPN (это для моей сети) и рабочим IPFW.
Необходимо поднять L2TP/IPSEC клиента.
uname

Код: Выделить всё

FreeBSD 10.3-RELEASE-p11


Обновляем систему

Код: Выделить всё

# freebsd-update fetch
# freebsd-update install

И перезагружаемся

Собираем свое собственное ядро с блекджеком и ...
Если каталог /usr/src/ отсутствует в вашей системе (или этот каталог пуст), то это значит, что исходные тексты не были установлены.
Для этого устанавливаем Subversion, что бы синхронизировать исходный код.

Код: Выделить всё

# cd /usr/ports/devel/subversion
# make install clean

Теперь приступаем к скачиванию актуальной версии
# вместо head укажите интересующую вас ветку или тэг
cd /usr/src && svn co http://svn.freebsd.org/base/head/ ./

Код: Выделить всё

cd /usr/src && svn co http://svn.freebsd.org/base/10.3/ ./

Переходим в папку с дефолтным ядром и делаем его копию, но с нужным именем

Код: Выделить всё

# cd /usr/src/sys/conf/amd64
# cp GENERIC GATE

и добавляем в файл GATE следующие параметры (IPFW добавляется по желанию)

Код: Выделить всё

#NAT and IPFW
options IPFIREWALL
options IPDIVERT
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_NAT
options LIBALIAS
options ROUTETABLES=5
options DUMMYNET
options HZ="1000"                       # for DUMMYNET
 
# Options for a IPsec enabled kernel
options         IPSEC        #IP security
options         IPSEC_ESP    #IP security (crypto; define w/ IPSEC)
options         IPSEC_FILTERTUNNEL
options         IPSEC_NAT_T
options         IPSEC_FILTERGIF  #filter ipsec packets from a tunnel
device          crypto
device          enc
device          gif

Далее переходим в папку /usr/src

Код: Выделить всё

# cd /usr/src

и собираем ядро

Код: Выделить всё

# make buildkernel KERNCONF=GATE

после того, как ядро будет собрано, устанавливаем его

Код: Выделить всё

# make installkernel KERNCONF=GATE

После этого перезагружаем машину:

Код: Выделить всё

# reboot

И смотрим, что получилось:

Код: Выделить всё

 # uname -a
FreeBSD mout 10.3-RELEASE-p19 FreeBSD 10.3-RELEASE-p19 #1 r318353M: Tue Jun 13 16:26:25 MSK 2017     biliy.sergey@mout:/usr/obj/usr/src/sys/GATE  amd64

Отлично. Теперь мы работаем со своим ядром.
Теперь устанавливаем ipsec-tools для создания шифрованного соединения с сервером VPN

Код: Выделить всё

#cd /usr/ports/security/ipsec-tools
#make install clean

Копируем конфиги из примеров, по умолчанию директория /usr/local/etc/racoon/ пуста

Код: Выделить всё

#cp /usr/local/share/examples/ipsec-tools/psk.txt /usr/local/etc/racoon/
#cp /usr/local/share/examples/ipsec-tools/racoon.conf /usr/local/etc/racoon/

И редактируем:

Код: Выделить всё

# $KAME: racoon.conf.in,v 1.18 2001/08/16 06:33:40 itojun Exp $
 
# "path" affects "include" directives.  "path" must be specified before any
# "include" directive with relative file path.
# you can overwrite "path" directive afterwards, however, doing so may add
# more confusion.
path include "@sysconfdir_x@/racoon";
#include "remote.conf";
 
# the file should contain key ID/key pairs, for pre-shared key authentication.
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.
#path certificate "@sysconfdir_x@/cert";
 
# "log" specifies logging level.  It is followed by either "notify", "debug"
# or "debug2".
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                  My_External_IP [7001];
        isakmp                  My_External_IP [500];
        isakmp_natt             My_External_IP [4500];
        #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.
#       natt_keepalive  15 sec;
        # maximum time to wait for completing each phase.
        phase1 30 sec;
        phase2 15 sec;
}
 
remote Server_External_IP
{
        exchange_mode           main,aggressive;
        doi                     ipsec_doi;
        lifetime                time 24 hour;
        situation               identity_only;
        my_identifier           address My_External_IP;
        peers_identifier        address Server_External_IP;
        proposal_check          obey;
        passive                 off;
        generate_policy         off;
#       nat_traversal           off;
 
                                proposal {
        encryption_algorithm aes;
        hash_algorithm sha1;
        authentication_method pre_shared_key;
        dh_group modp2048;
                                }
}
 
 
sainfo anonymous
{
        pfs_group modp2048;
        encryption_algorithm            3des;
        authentication_algorithm        hmac_sha1;
        compression_algorithm           deflate;
}

Меняем права и владельца файла ключей. Владельцем этого файл должен быть пользователь от имени которого запускаеться racoon и права 600.

Код: Выделить всё

#chmod 600 /usr/local/etc/racoon/psk.txt
#chown root:wheel /usr/local/etc/racoon/psk.txt

И заполняем его в таком виде:

Код: Выделить всё

# IPv4/v6 addresses
Server_External_IP  Ваш_preshared_key

Создаем файл /etc/ipsec.conf и наполняем его

Код: Выделить всё

flush;
spdflush;
 
spdadd 0.0.0.0/0 0.0.0.0/0[1701] any -P out ipsec esp/transport//require;
spdadd 0.0.0.0/0[1701] 0.0.0.0/0 any -P in ipsec esp/transport//require;


Добавляем в автозапуск

Код: Выделить всё

racoon_enable="YES"
ipsec_enable="YES"
ipsec_program="/usr/local/sbin/setkey"
ipsec_file="/etc/ipsec.conf"

Далее устанавливаем клиента PPP клиента. В его качестве будет выступать MPD5

Код: Выделить всё

# cd /usr/ports/net/mpd5
# make install clean

И рисуем конфиг нашего клиента

Код: Выделить всё

# ee /usr/local/etc/mpd5/mpd.conf

Код: Выделить всё

startup:
      # Set web self 127.0.0.1 5008
      # Set user vpntest vpntest admin
      # Set web open
log +ALL +EVENTS -FRAME -ECHO
default:
      load L2TP_client
 
L2TP_client:
        create bundle static B1
        create link static L1 l2tp
        set link action bundle B1
        set auth authname "user"
        set auth password "password"
        set link max-redial 0
        set link mtu 1460
        set link keep-alive 20 75
 
        set l2tp peer Server_External_IP
        open

Ну и добавляем MPD5 в автозагрузку:

Код: Выделить всё

mpd_enable="YES"

Далее приведу список правил для IPFW. Последние 2 правила потом можно будет убрать

Код: Выделить всё

/sbin/ipfw add allow udp from Server_External_IP to me isakmp
/sbin/ipfw add allow udp from me to Server_External_IP isakmp
/sbin/ipfw add allow esp from Server_External_IP to me
/sbin/ipfw add allow esp from me to Server_External_IP
/sbin/ipfw add allow ipencap from Server_External_IP to me
/sbin/ipfw add allow ipencap from me to Server_External_IP
/sbin/ipfw add allow all from Server_External_IP to me
/sbin/ipfw add allow all from me to Server_External_IP


Отправляем машину в перезагрузку

Код: Выделить всё

# reboot

И смотрим вывод ifconfig. Если есть что то похожее на

Код: Выделить всё

ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1460
        inet 192.168.196.4 --> 192.168.196.1 netmask 0xffffffff
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

Значит MPD5 подключился к серверу. Если нет, смотрим логи.

Так же проверяем статус ipsec. Если там присутствуют строки

Код: Выделить всё

setkey -D
My_External_IP Server_External_IP
        esp mode=transport spi=192677682(0x0b7c0732) reqid=0(0x00000000)
        E: 3des-cbc  319b7fca 2fcbd1a4 117a64fc aa4e704d ea17ef52 857cedae
        A: hmac-sha1  ac728111 1870b1e2 32cd723b 2a78b79e da17d280
        seq=0x00000017 replay=4 flags=0x00000000 state=mature
        created: Jul 24 12:18:34 2017   current: Jul 24 12:21:10 2017
        diff: 156(s)    hard: 28800(s)  soft: 23040(s)
        last: Jul 24 12:20:58 2017      hard: 0(s)      soft: 0(s)
        current: 2344(bytes)    hard: 0(bytes)  soft: 0(bytes)
        allocated: 23   hard: 0 soft: 0
        sadb_seq=1 pid=36513 refcnt=2
Server_External_IP My_External_IP
        esp mode=transport spi=266948264(0x0fe94ea8) reqid=0(0x00000000)
        E: 3des-cbc  15e03fe0 b7aa345b 349f0830 3a09237c 4d6a86bd 408ad1ff
        A: hmac-sha1  9a07f590 9add8005 5ed88ff3 7a725e5c 80e8325e
        seq=0x00000018 replay=4 flags=0x00000000 state=mature
        created: Jul 24 12:18:34 2017   current: Jul 24 12:21:10 2017
        diff: 156(s)    hard: 28800(s)  soft: 23040(s)
        last: Jul 24 12:20:58 2017      hard: 0(s)      soft: 0(s)
        current: 1501(bytes)    hard: 0(bytes)  soft: 0(bytes)
        allocated: 24   hard: 0 soft: 0
        sadb_seq=0 pid=36513 refcnt=1

значит все хорошо. Если нет, смотрим логи.


Чукча не писатель, чукча читатель :smile:
Просьба, за ошибки сильно не пинать. А так, критика приветствуется.

Вернуться в «FreeBSD»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя