Материал просмотрен 6,047 раз(а)

Однажды за определенную плату мне надо было поднять VPN-сервер на FreeBSD. Заказчик не ставил задачу, какой сервер поднимать. Первое, что я нашел в сети – это продукт mpd5. Позволяет создавать pptp и l2tp VPN серверы, а также клиенты для подключения. Этот продукт хорош простотой. Действительно, pptp, а потом и l2tp серверы дались мне за довольно короткое время (около 30 минут).

Все сводилось к тому, что надо было отредактировать sample файл конфигурации. Проверил – все работало. Оставил заказчику pptp сервер, так как в случае l2tp сервера, на виндовом клиенте пришлось бы править реестр в кусте HKLM (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\RasMan\Parameters), чтобы отключить работу через IPsec.

Работу я ему сдал, но остались нерешенными некоторые задачи, а именно: pptp славится своим низким уровнем безопасности, l2tp не особо лучше без IPsec, кроме того, возникли проблемы, если клиент находится за NAT, плюс ко всему, не все провайдеры пропускают pptp. Подробнее с озвученными протоколами советую ознакомится, например, на wiki.

Мне понравилась одна фраза про связь, между IPsec и l2tp: “как стол и табуретка”.

Итак, было решено все таки настроить l2tp/IPsec VPN сервер.

Я использовал следующие продукты:

FreeBSD 8.2
IPsec-tools-0.8.0_3 KAME racoon IKE daemon, IPsec-tools version
mpd-5.6 Multi-link PPP daemon based on netgraph(4)
Ставим либо из портов, либо из пакетов.

Далее, нам необходимо сконфигурировать ядро. Про компиляцию ядра есть отдельная статья на сайте litl-admin.ru, либо смотрите в хэндбуке. В новое ядро нам надо добавить 3 опции:

options IPSEC
options IPSEC_NAT_T
device crypto

С первой опцией понятно, со второй: разшифровывается как IPsec NAT TRAVERSAL. Необходимо для работы за NAT (изменение и восстановление заголовков пакетов). Опция IPsec зависит от crypto.

Компилим ядро, ставим ядро, перезагружаемся.

Будем настраивать racoon (демон IKE протокола).

Создаем директорию /usr/local/etc/racoon

Копируем туда /usr/local/share/examples/IPsec-tools/racoon.conf.sample как racoon.conf

И приводим к вот такому виду (комментарии можно убрать, Я скопировал сначала для того, чтобы меньше допустить синтаксических ошибок при редактировании конфигурационного файла):

# $KAME: racoon.conf.in,v 1.18 2001/08/16 06:33:40 itojun Exp $
# the file should contain key ID/key pairs, for pre-shared key authentication.
path pre_shared_key “/usr/local/etc/racoon/psk.txt”;
# “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 192.168.10.50 [500];
isakmp_natt 192.168.10.50 [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.
# maximum time to wait for completing each phase.
#phase1 30 sec;
#phase2 15 sec;
}
remote anonymous
{
exchange_mode main;
passive on;
proposal_check obey; #strict; # obey, strict, or claim
support_proxy on;
nat_traversal on;
ike_frag on;
dpd_delay 20;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key; #rsasig;
dh_group 2;
}
}
sainfo anonymous
{
pfs_group 2;
encryption_algorithm 3des,aes;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}

Все, racoon готов. Не забудьте поменять IP адреса на свои.

Далее создаем файл в той же директории с именем psk.txt. Это наш PRE SHARED KEY. Именно секретную фразу в подключении мы будем указывать.

Файл имеет вид:

IPклиента1 phrase1
IPклиента2 phrase2

Есть патч для IPsec-tools, чтобы фраза была для всех адресов одинаковой. Этот патч есть в порте. Для работы racoon, необходимо, чтобы файл psk.txt имел права 600 (читать и изменять имеет право только root) (изменить можно командой: #chmod 600 psk.txt).

Теперь надо настроить работу программы setkey, которая управляет IPsec SA/SP БД.

Создаем файл в той же директории setkey.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;

Перейдем к конфигурированию l2tp сервера mpd.

Директория, где находятся конфигурационные файлы mpd: /usr/local/etc/mpd5
Создайте и отредактируете файл mpd.conf в соответствии с этим:

startup:
#set user foo bar admin
#set web self 0.0.0.0 5006
#set web open
default:
load l2tp_server
l2tp_server:
# Define dynamic IP address pool.
set ippool add pool1 192.168.100.50 192.168.100.99
# Create clonable bundle template named B
create bundle template B
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment.
set ipcp ranges 192.168.10.50/32 ippool pool1
set ipcp dns 192.168.10.2
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
set bundle enable compression
set ccp yes mppc
set mppc yes e40
set mppc yes e128
set mppc yes stateless
# Create clonable link template named L
create link template L l2tp
# Set bundle template to use
set link action bundle B
# Multilink adds some overhead, but gives full 1500 MTU.
set link enable multilink
set link yes acfcomp protocomp
set link no pap chap eap
set link enable chap-msv2
# We can use use RADIUS authentication/accounting by including
# another config section with label ‘radius’.
# load radius
set link keep-alive 10 60
# We reducing link mtu to avoid GRE packet fragmentation.
set link mtu 1460
# Configure PPTP
set l2tp self 192.168.10.50
# Allow to accept calls
set link enable incoming

Как видите, l2tp сервер легко превращается из конфигурации pptp сервера заменой буквосочетаний pptp на l2tp. Такой вот простой mpd.

Теперь редактируем файл mpd.secret. В нем хранятся логины и пароли l2tp сервера. Этот логин и пароль будем вводить в настройках подключения клиента. Формат файла: логин, табуляция, пароль.

Теперь нам надо все это дело запустить. Для этого правим /etc/rc.conf. Сразу приведу мой файл конфигурации:

# Network Settings:
ifconfig_em0=”inet 192.168.10.50 netmask 255.255.255.0″
defaultrouter=”192.168.10.2″
gateway_enable=”YES”
hostname=”gw.home.net”

# Services:
sendmail_enable=”NO”
sendmail_submit_enable=”NO”
sendmail_outbond_enable=”NO”
sendmail_msp_queue_enable=”NO”
sshd_enable=”YES”
mpd_enable=”YES”
racoon_enable=”YES”
ipsec_enable=”YES”
ipsec_program=”/usr/local/sbin/setkey”
ipsec_file=”/usr/local/etc/racoon/setkey.conf”
racoon_flags=”-l /var/log/racoon.log”

# Firewall Settings:
#firewall_enable=”YES”
#firewall_script=”/etc/ipfw.conf”

Строки с Sendmail можете удалить. Теперь надо перезагрузиться. Мы подошли к проверке сервиса:

Советую сразу посмотреть файл /var/log/racoon.log на предмет чистого запуска racoon. Должно быть так:

2012-03-13 02:42:28: INFO: @(#)ipsec-tools 0.8.0 (http://ipsec-tools.sourceforge.net)
2012-03-13 02:42:28: INFO: @(#)This product linked OpenSSL 0.9.8q 2 Dec 2010 (http://www.openssl.org/)
2012-03-13 02:42:28: INFO: Reading configuration from “/usr/local/etc/racoon/racoon.conf”
2012-03-13 02:42:28: INFO: 192.168.10.50[4500] used for NAT-T
2012-03-13 02:42:28: INFO: 192.168.10.50[4500] used as isakmp port (fd=4)
2012-03-13 02:42:28: INFO: 192.168.10.50[500] used for NAT-T
2012-03-13 02:42:28: INFO: 192.168.10.50[500] used as isakmp port (fd=5)

Синтаксическая ошибка будет выглядеть так:

2012-03-13 02:40:24: ERROR: /usr/local/etc/racoon/racoon.conf:47: “na” syntax error
2012-03-13 02:40:24: ERROR: fatal parse failure (1 errors)
Теперь создадим подключение (на примере Windows 7):

Заходим в Центр управления сетями и общим доступом. Нажимаем “Настройка нового подключения или сети”:

Выбираем подключения к рабочему месту. И далее вводим данные, следуя шагам мастера.

Внимание, нам необходимо ввести нашу ключевую фразу. Для этого в свойствах нового подключения во вкладке безопасность жмем кнопку дополнительные параметры:

Наконец подключаемся, проверяем. Удачи вам!