VPN сервис на основе L2TP/IPSec PSK (xl2tpd, racoon)

Способов защиты доступа удаленных клиентов ко внутренним ресурсам компании существует масса. В этой статье расматривается настройка защищенного соединения vpn на основе racoon (ipsec-tools) и xl2tpd.

Серверы, участвующие в настройке, находятся в одной подсети без собственного маршрутизатора, поэтому пришлось настроить VPN-сервис на одном из серверов и сделать его маршрутизатором для подсети VPN.

Для работы пакет ipsec-tools требует включить в ядре следующие опции (во время установки производится проверка):

[*] Networking support  --->
  Networking options  --->
    <*> Transformation user configuration interface
    <*> PF_KEY sockets
    [*] TCP/IP networking
       [*] IP: AH transformation
       [*] IP: ESP transformation
       [*] IP: IPComp transformation
       [*] IP: IPsec transport mode
       [*] IP: IPsec tunnel mode
       [*] IP: IPsec BEET mode
    [*] Network packet filtering framework (Netfilter)  --->
       Core Netfilter Configuration  --->
          <*>   IPsec "policy" match support
    <*> Layer Two Tunneling Protocol (L2TP)
-*- Cryptographic API  --->
     <*> Null algorithms

Дополнительно следует включить следующие параметры:

Device Drivers  --->
  [*] Network device support  --->
    <*> PPP (point-to-point protocol) support
    <*>   PPP Deflate compression
    [*]   PPP filtering
    <*>   PPP MPPE compression (encryption) (EXPERIMENTAL)
    <*>   PPP over Ethernet (EXPERIMENTAL)
    <*>   PPP over L2TP (EXPERIMENTAL)
    <*>   PPP support for async serial ports
    <*>   PPP support for sync tty ports
    <*>   PPP BSD-Compress compression

Так как мы настраиваем туннель с использованием PSK (Pre-shared key), сразу определимся с ключем. Например — $SuperSecurityKey$
Для определенности также укажем, что IP адрес сервера — xxx.xxx.xxx.xxx, этот адрес находится на интерфейсе eth0.

Настройку начнем с файла /etc/racoon/psk.txt, который содержит список pre-shared ключей (в нашем случае ключ один):

*  $SuperSecurityKey$

В качестве хоста указываем *, так как клиенты будут подключаться из разных подсетей.

Далее, параметры туннеля ipsec указываем в файле /etc/racoon/racoon.conf:

# Путь до файла с pre-shared ключами
path pre_shared_key "/etc/racoon/psk.txt";

# Режим логирования
log error;

# Указываем адреса, на которых raoon должен ожидать соединения
listen
{
    # сокет для управления racoon
    adminsock "/var/run/racoon.sock" "root" "root" 0600;
    isakmp xxx.xxx.xxx.xxx [500];
    isakmp_natt xxx.xxx.xxx.xxx [4500];
    strict_address;
}

remote anonymous
{
    exchange_mode main;
    # область интерпретации
    doi ipsec_doi;
    lifetime time 24 hour;
    # режим ожидания входящих соединений
    passive on;
    # включаем автоматическую генерацию ACL
    generate_policy on;
    proposal_check obey;
    # разрешаем работу в режиме NAT traversal
    nat_traversal on;
    # разрешаем фрагментацию IKE
    ike_frag on;
    verify_identifier on;
    my_identifier address;
    peers_identifier address;

    proposal {
        # алгоритм шифрования
        encryption_algorithm 3des;
        # алгоритм хеширования
        hash_algorithm sha1;
        # метод авторизации
        authentication_method pre_shared_key;
        # Diffie-Hellman группа (2 = 1024 бит)
        dh_group 2;
    }
}

Последний этап конфигурирования ipsec — настройка списков (ACL) доступов (файл /etc/ipsec-tools.conf):

#!/usr/sbin/setkey -f

flush;
spdflush;

spdadd xxx.xxx.xxx.xxx[l2tp] 0.0.0.0/0 udp -P out ipsec esp/transport//require;
spdadd 0.0.0.0/0 xxx.xxx.xxx.xxx[l2tp] udp -P in ipsec esp/transport//require;

После завершения конфигурирования racoon можно его запустить командой /etc/init.d/racoon start

Переходим к следующему этапу — настройке xl2tpd.
При подключении клиентам необходимо назначить какой-то внутренний IP адрес. Пусть у нас это будет подсеть 10.0.0.0/24.

Файл /etc/xl2tpd/xl2tpd.conf:

[global]
listen-addr = xxx.xxx.xxx.xxx

ipsec saref = no

[lns default]
ip range = 10.0.0.2-10.0.0.254
local ip = 10.0.0.1
require chap = yes
refuse pap = yes
name = myname.ru
ppp debug = no
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

Задаем параметры соединения l2tp в файле /etc/ppp/options.xl2tpd:

asyncmap 0
auth
lock
hide-password
modem
name xl2tpd
debug
lcp-echo-interval 120
lcp-echo-failure 10
mtu 1200
mru 1200
proxyarp
nodefaultroute

noccp
novj
novjccomp
nopcomp
noaccomp
connect-delay 5000

Завершающее действие в настройке xl2tpd заключается в заведении учетных записей пользователей, файл /etc/ppp/chap-secrets:

# client      server     secret        IP address
username1     xl2tpd     password1     *
username2     xl2tpd     password2     *

Теперь можно запустить xl2tpd командой /etc/init.d/xl2tpd start

Последний этап настройки сервиса vpn — добавление необходимых правил маршрутизации.

*nat
# 10.0.0.0/24 - подсеть vpn
# 10.1.0.0/24 - подсеть между серверами
# 10.1.0.1 - адрес интерфейса, через который производится доступ 
# в подсеть между серверами

-A POSTROUTING -s 10.0.0.0/24 -d 10.1.0.0/24 -j SNAT --to-source 10.1.0.1

*filter
-A FORWARD -s 10.0.0.0/24 -j ACCEPT
-A FORWARD -d 10.0.0.0/24 -j ACCEPT

Настройку можно считать завершенной.

Операционные системы семейств Microsoft Windows, Apple OS X, Apple iOS, Google Android имеют встроенные средства и интерфейсы для подключения к VPN L2TP/IPsec PSK.
В Windows в ключе реестра (указан ниже) необходимо создать DWORD параметр AssumeUDPEncapsulationContextOnSendRule и установить ему значение 2.

  • для Windows XP — HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\IPsec
  • для Windows Vista/7 — HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent

Настройка клиентской части в операционных системах GNU/Linux, в общем случае, более сложная и является предметом отдельной небольшой статьи.

css.php