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

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

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Sindikat88
мл. сержант
Сообщения: 134
Зарегистрирован: 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:
Просьба, за ошибки сильно не пинать. А так, критика приветствуется.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2520 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35025
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2018-03-26 22:32:33

эх, где ж ты был пару лет назад =((
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Sindikat88
мл. сержант
Сообщения: 134
Зарегистрирован: 2010-09-02 15:07:54
Контактная информация:

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

Непрочитанное сообщение Sindikat88 » 2018-03-26 22:54:39

Пару лет назад это не требовалось :)

Аватара пользователя
skeletor
майор
Сообщения: 2420
Зарегистрирован: 2007-11-16 18:22:04
Откуда: Kiev
Контактная информация:

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

Непрочитанное сообщение skeletor » 2018-03-28 11:03:50

В целом неплохо, но есть несколько моментов:

1) Отправляем машину в перезагрузку === это лучше не писать, а просто запустить racoon, mpd.
2) Нет нигде оговорки, что машина не за NAT'ом и имеет внешний IP.
3) Далее приведу список правил для IPFW. === непонятно, что за Server_External_IP, а так же то, что эти правила работать не будут, так как это не макросы. Либо замените IP на XX.XX.XX.XX, либо используйте макросы и потом ниже пояснение к ним.
4) Так же, в конфигах уберите комментарии или напишите, какие строки добавили.

Аватара пользователя
Sindikat88
мл. сержант
Сообщения: 134
Зарегистрирован: 2010-09-02 15:07:54
Контактная информация:

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

Непрочитанное сообщение Sindikat88 » 2018-03-28 11:23:15

Ок. Поправлю. Спасибо

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35025
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2018-03-28 23:10:31

про ребут - не согласен...
я при настройке не ленюсь перезагружать - нет-нет да вылезет, что в автозагрузку что-то не поставил, в rc.conf ошибся и т.п.

когда оно на выходных, через полгода, ребутнётся (питание отключили или сам ребутнул зачем-то) и не подымется - и придётся сломя голову мчаться на ругой конец города... тогда и вспоминаешь про ребут.

лучше я сразу ребутну, если возможность есть.
как минимум - после всех настроек, разок.
--
а так, да, есть странные машины, которые уже даже перезагружать страшно

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

bsd0$ uptime 
23:09  up 2136 days, 10:08, 3 users, load averages: 0,00 0,00 0,00
bsd0$ uname -a
FreeBSD bsd0.moskb.local 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Sat Nov 21 15:02:08 UTC 2009     root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64
bsd0$ 
это ночь щас... а днём там LA до 8, при 4 физических процах...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Sindikat88
мл. сержант
Сообщения: 134
Зарегистрирован: 2010-09-02 15:07:54
Контактная информация:

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

Непрочитанное сообщение Sindikat88 » 2018-03-29 11:59:09

Коллеги, а не у кого не было проблем, с переездом с 8.1 на 10.1?
IPFW стал пускать всех подряд из локалки в Интернет.
Может конечно, у меня глаз замылился, но не могу понять причину.

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

#!/bin/sh
ipfw -f flush
ipfw -f pipe flush
ipfw -f queue flush

cmd="/sbin/ipfw add"

LanOut="bge1" # Внешняя сетевуха
IpOut="XXX.XXX.XXX.XXX" # Внешний IP

LanIn="bge0" # внутренняя сетевуха
NetIn="192.168.0.0/23" # Внутренняя сеть
openvpn_if="tun0"       #OpenVPN port
IpVPN="192.168.225.0"
VIP="192.168.0.0{140-160}"

#NAT 
ipfw nat 123 config if $LanOut log same_ports reset \ 
redirect_port tcp 192.168.0.8:443 443 \
redirect_port tcp 192.168.0.8:80 80 \
redirect_port tcp 192.168.0.8:993 993 \
redirect_port tcp 192.168.0.7:14000 14000 \
redirect_port tcp 192.168.0.7:13000 13000 \
redirect_port udp 192.168.0.7:15000 15000 \
redirect_port tcp 192.168.0.91:35300 35300

#local
$cmd 105 allow all from any to any via $LanIn
#VPN
$cmd 106 allow all from any to any via tun0
# loopback
$cmd 101 allow all from any to any via lo0

# Считаем трафик
# SMTP
$cmd 020 count tcp from any 25 to any out via $LanOut
$cmd 021 count tcp from any to any 25 in via $LanOut
#PROXY
$cmd 022 count tcp from any to 3128 any out via $LanOut
$cmd 023 count tcp from any to any 3128 in via $LanOut
# Kamera
$cmd 024 count tcp from any to any 554 in via $LanOut
$cmd 025 count tcp from any 554 to any out via $LanOut
#OpenVPN
$cmd 026 count tcp from any 2000 to any out via $LanOut
$cmd 027 count tcp from any to any 2000 in via $LanOut
# ALL
$cmd 029 count ip from any to any out via $LanOut
$cmd 028 count ip from any to any in via $LanOut

#Incoming traffic to NAT
$cmd 130 nat 123 ip from any to any in via $LanOut

# NAT from local to Inet
$cmd 131 nat 123 ip from $NetIn to any out via $LanOut

#Allow DYN rules
$cmd 140 check-state

# DNS resolve
$cmd 172 allow ip from any 53 to any via $LanOut
$cmd 173 allow ip from any to any 53 via $LanOut

# Outgoing server to Internet
$cmd 180 allow ip from me to any out via $LanOut setup keep-state

# ICMP
$cmd 200 allow icmp from any to any out via $LanOut

# OpenVPN
$cmd 201 allow tcp from any to ${IpOut} 2000 in via ${LanOut}
$cmd 202 allow tcp from ${IpOut} 2000 to any out via ${LanOut}
$cmd 203 allow all from any to any in via ${openvpn_if}
$cmd 204 allow all from any to any out via ${openvpn_if}

# Time
$cmd 209 allow udp from any to any 123 out via $LanOut
$cmd 210 allow udp from any 123 to any in via $LanOut

# Postal service
$cmd 211 allow tcp from any to me 25 in via $LanOut
$cmd 212 allow tcp from me 25 to any out via $LanOut

# ATS
$cmd 221 allow ip from any to 192.168.0.91 in via $LanOut
$cmd 222 allow ip from 193.201.230.128/26 to 192.168.0.91 in via $LanOut
$cmd 223 allow ip from me 5060,11024 to any out via $LanOut
$cmd 224 allow ip from 192.168.0.91 to 193.201.230.128/26 out via $LanOut

#NAT for Iphone and etc
$cmd 251 allow ip from '192.168.0.0{140-160}' to any out via $LanOut
$cmd 252 allow ip from any to '192.168.0.0{140-160}' in via $LanOut
$cmd 253 allow ip from '192.168.1.0{247-249}' to any out via $LanOut
$cmd 254 allow ip from any to '192.168.1.0{247-249}' in via $LanOut

# NAT for admin
$cmd 265 allow ip from 192.168.1.25 to any out via $LanOut
$cmd 266 allow ip from any to 192.168.1.25 in via $LanOut

#Откываем доступ wi-fi сетям NAT
$cmd 271 allow ip from 192.168.1.251 to any out via $LanOut
$cmd 272 allow ip from any to 192.168.1.251 in via $LanOut
$cmd 273 allow ip from 192.168.1.253 to any out via $LanOut
$cmd 274 allow ip from any to 192.168.1.253 in via $LanOut

#LinkedIn
$cmd 282 allow ip from any to lkdin.pass.xzvpn.net out via $LanOut
$cmd 281 allow ip from lkdin.pass.xzvpn.net to any in via $LanOut

# mail HTTP
$cmd 321 allow ip from any to 192.168.0.8 443,80,993 in via $LanOut
$cmd 322 allow ip from 192.168.0.8 443,80,993 to any out via $LanOut

# FTP
$cmd 373 allow ip from any to me 20-21,30000-50000 in via $LanOut
$cmd 374 allow ip from me 20-21,30000-50000 to any out via $LanOut

#Разрешаем определенный ICMP-трафик из мира к нам
$cmd 391 allow icmp from any to me in via $LanOut icmptype 3,8,12

#Разрешаем определенный ICMP-трафик от нас в мир
$cmd 392 allow icmp from me to any out via $LanOut icmptype 0,3,4,11,12

#Запрещаем прочий ICMP-трафик
$cmd 429 deny log icmp from any to me in via $LanOut icmptype 5,9,10,13,15,17

# Deny all inbound traffic from non-routable reserved address spaces
$cmd 430 deny all from 192.168.0.0/16 to any in via $LanOut
$cmd 431 deny all from 172.16.0.0/12 to any in via $LanOut
$cmd 432 deny all from 10.0.0.0/8 to any in via $LanOut
$cmd 433 deny all from 127.0.0.0/8 to any in via $LanOut
$cmd 434 deny all from 0.0.0.0/8 to any in via $LanOut
$cmd 435 deny all from 169.254.0.0/16 to any in via $LanOut
$cmd 436 deny all from 192.0.2.0/24 to any in via $LanOut
$cmd 437 deny all from 204.152.64.0/23 to any in via $LanOut
$cmd 438 deny all from 224.0.0.0/3 to any in via $LanOut

# Deny ident
$cmd 439 deny tcp from any to any 113 in via $LanOut

#Netbios
$cmd 440 deny tcp from any to any 137 via $LanOut
$cmd 441 deny tcp from any to any 138 via $LanOut
$cmd 442 deny tcp from any to any 139 via $LanOut
$cmd 443 deny tcp from any to any 81 via $LanOut

# Deny fragments packets
$cmd 444 deny all from any to any frag in via $LanOut

# Deny ACK packets that did not match the dynamic rule table
$cmd 445 deny tcp from any to any established in via $LanOut

# Allow in ssh from Internet
$cmd 500 allow tcp from XXX.XXX.XXX.XXX to me 22 in via $LanOut setup limit src-addr 1

# Reject incomming traffic from Inet
$cmd 600 deny log all from any to any in via $LanOut

# Reject outgoing traffic to Inet
$cmd 610 deny log all from any to any out via $LanOut
$cmd 999 deny log all from any to any

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35025
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2018-03-29 21:12:29

это надо правила смотреть в файрволле живьём, а не в файле
Убей их всех! Бог потом рассортирует...