Протокол L2TP (Layer 2 Tunneling Protocol) - протокол туннелирования второго уровня создан на основе PPTP и проприетарного протокола L2F, разработанного Cisco.Принцип действия L2TPВ отличие от PPTP, в L2TP не используется выделенный канал управления. Все управляющие сообщения посылаются через туннель. Проблема PPTP и иже с ними, связанная с переходом через NAT, ввиду отсутствия в GRE портов, решена в L2TP инкапсулированием туннелируемых данных в UDP (порт 1701). В результате, пользовательские данные снабжаются рядом заголовков и концевиков и итоговый IP-пакет имеет вид:

Заголовок L2TP имеет формат, показанный на рисунке ниже. В зависимости от типа полезной нагрузки (пользовательские данные, управляющие сообщения), заголовок может видоизменяться - могут исключаться некоторые опциональные поля либо добавляться (в случае управляющих сообщений) дополнительные поля (AVP).

Флаг T (type) принимает значение "1", если передается управляющее сообщение и значение "0", если передаются пользовательские данные; флаг L указывает на наличие (значение "1") или отсутствие (значение "0") в заголовке поля длины (length), которое обязательно для управляющих сообщений; флаг S определяет наличие в заголовке опциональных полей Ns и Nr (sequence numbers), которые обязательны для управляющих сообщений; с помощью флага O определяется присутствие в заголовке поля смещения (offset), для управляющих сообщений этот бит всегда должен быть сброшен в ноль; флаг P сигнализирует о необходимости обработки данного пакета с наивысшим приоритетом, типовое применение - в сообщениях keep alive, что помогает избежать случайных разрывов соединения из-за флуктуаций времени передачи пакетов по сети, бит P должен быть сброшен для управляющих сообщений.
Поле "версия" всегда должно содержать значение "2" для L2TP, значение "1" зарезервировано для обратной совместимости с L2F. Поле "длина" определяет длину в байтах пакета с заголовком. Независимо от присутствия этого поля в заголовке, максимальная длина пакета будет ограничена сверху порогом протокола IP в 65535 байт, минус длина внешних заголовков IP и UDP.
Поля "идентификатор туннеля" и "идентификатор сессии" используются для определения принадлежности передаваемого пакета соответствующему туннелю и сессии. Эти значения уникальны для каждого узла, причем передающая сторона должна помещать в соответствующее поле идентификатор принимающей стороны, а не свой собственный.
Поля Ns и Nr имеют назначение, аналогичное полям sequence number и aknowledgement number. В поле Ns содержится порядковый номер фрагмента передаваемых данных, а в поле Nr - ожидаемый номер следующего фрагмента принимаемых данных. Таким образом обеспечивается поочередная доставка с подтверждением получения. Поле Nr может присутствовать только в контрольных сообщениях, если данное поле встречается в заголовке пакета с пользовательскими данными, оно должно быть проигнорировано приемником.
Поле "величина смещения" указывает на смещение начала поля данных относительно начала заголовка. Поле "заполнитель" предназначено для дополнения заголовка до целого числа 32-битных слов. Два последних поля никогда не используются в заголовках управляющих сообщений.
В случае контрольных сообщений, заголовок может дополняться так называемыми AVP (Attrubute Value Pair - пара трибут-значение), которые следуют непосредственно за заголовком. Общий формат AVP:

Флаг M определяет AVP, обязательный (mandatory) для обработки. Если принятый AVP с установленным флагом M не может быть корректно обработан, то должна быть разорвана сессия, с которой ассоциировано данное сообщение или, если данное сообщение ассоциировано с тунелем, то тунель со всеми сессиями. Флаг H указывает на то, что данный AVP является скрытым (hidden), т.е. зашифрованным. В поле "длина" указывается суммарная длина AVP в байтах. Поле "ID производителя" может быть использовано на усмотрение пользователя, но обычно содержит идентификатор, выдаваемый IETF и используемый при определении специфичных AVP. Тип атрибута содержит указатель на тип данного AVP.
Упомянутое выше шифрованные AVP используется для защищенной передачи секретных данных. Шифрование осуществляется с помощью логической операции исключающего или данных и ключа, представляющего собой MD5-хэш предварительно согласованного обоими сторонами пароля, случайного вектора и типа атрибута. При этом данные, подлежащие шифрованию (один или несколько AVP) могут дополняться случайным заполнителем, чтобы скрыть изначальную длину данных, а на приемной стороне заполнитель отбрасывается на основании поля, содержащего длину изначального сообщения.
Схема туннелирования аналогична используемой в PPTP:

Здесь LAC - (L2TP Access Concentrator - концентратор доступа L2TP) обеспечивает PPPoE-соединение с клиентом; LNS - (L2TP Network Server - сетевой сервер L2TP) обеспечивает доступ к ресурсам локальной сети. Аналогично PPTP, верхний туннель иллюстрирует mandatory mode, нижний - voluntary mode. В отличие от PPTP, отсутствует выделенный канал управления (как уже упоминалось выше).
Процедуры установления управляющего соединения, входящего и исходящего звонка (пользовательские данные) и представляют собой трехсторонний хендшейк с использованием аналогичных применяемым в PPTP управляющих сообщений. При этом каждому управляющему сообщению соответствует набор обязательных и опциональных AVP, содержащих необходимые данные, обязательным для всех управляющих сообщений является AVP "тип сообщения", исключение - сообщение с нулевым содержимым, используемое в качестве акноледжментов. Полный перечень AVP, описание их формата и назначения можно просмотреть в
RFC2661.
L2TP сервер на MPD5 во FreeBSD7.1Исходные данные - поверх реальной сети 192.168.0.0/24 требуется установить туннель с логическими адресами из диапазона 172.16.0.0/24. В качестве LNS использован хост под управлением FreeBSD 7.1 (fbsd - 192.168.0.2), в качестве LAC в voluntary mode, хост под управлением Windows XP SP2 со встроенным клиентом (win - 192.168.0.1).
Начать можно с установки на fbsd mpd5 из портов:
cd /usr/ports/net/mpd5 && make install clean
или пакетов
pkg_add -r mpd5
После чего можно создать файл с логинами и паролями (в качестве примера - логин "l2tpclient", пароль "secret"):
touch /usr/local/etc/mpd5/mpd.secret
echo "l2tpclient secret" >> /usr/local/etc/mpd5/mpd.secret
chown root:wheel /usr/local/etc/mpd5/mpd.secret
chmod 700 /usr/local/ etc/mpd5/mpd.secret
и файл конфигурации usr/local/etc/mpd5/mpd.conf примерно следующего содержания
startup:
log bund
log frame
log iface
log ipcp
log lcp
log link
log phys
default:
load lns
lns:
set ippool add pool1 172.16.0.50 172.16.0.60
create bundle template B
set iface enable proxy-arp
set iface idle 1800
set iface enable tcpmssfix
set ipcp ranges 172.16.0.1/32 ippool pool1
create link template L l2tp
set link action bundle B
set link enable multilink
set link yes pap chap
set link mtu 1460
set l2tp self 192.168.0.2
set link enable incoming
Разумеется, приведеный файл конфигурации содержит лишь строки, включающие минимально необходимый функционал.
После этого необходимо добавить в rc.conf соответствующую строку:
echo "mpd_enable="YES"" >> /etc/rc.conf
Запуск/остановка/рестарт демона mpd5 осуществляется с помощью опций start/stop/restart скриптом /usr/local/etc/rc.d/mpd5, т.е. для запуска:
/usr/local/etc/rc.d/mpd5 start
Настройка встроенного в win L2TP-клиента происходит следующим образом:
В разделе панели управления "Сетевые подключения" нужно выбрать "Создание нового подключения"


В окне мастера новых подключений выбрать "Подключить к сети на рабочем месте" - "Подключение к виртуальной частной сети"


В соответствующих полях ввести произвольное имя подключения и адрес сервера 192.168.0.2
В меню "Свойства" вновь созданного подключения на вкладке "Безопасность" снять флаг "Требуется шифрование...", на вкладке "Сеть" выбрать L2TP IPSec VPN


Поскольку протокол L2TP не предусматривает шифрования каким-либо встроенным протоколом, обычно он используется в связке с протоколом шифрования IPSec. Поскольку в данной статье L2TP рассматривается в контексте протоколов туннелирования, на стороне LNS шифрование с помощью IPSec не было включено, однако оно требуется встроенным клиентом на стороне LAC. Чтобы отменить это требование, в системном реестре win нужно добавить с помощью редактора реестра ("Пуск" - "Выполнить" - regedit) ключ ProhibitIpSec (тип DWORD) в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters\ со значением "1". После перезагрузки системы изменения должны вступить в силу, проконтролировать это можно с помощью списка активных служб ("Пуск" - "Выполнить" - services.msc).
После этого можно, используя ранее определенные логин и пароль, установить соединение и пронаблюдать за процессом его установления путем захвата целевых пакетов на соответствующем сетевом интерфейсе fbsd командой
tcpdump -i em0 proto l2tp.
ЗаключениеВ цикле статей посвященных туннелированию эта завершающая. Основным достоинством описанного выше протокола L2TP можно назвать то, что он позволяет осуществлять соединение через NAT, благодаря инкапсуляции кадров L2TP в UDP (порт 1701). Универсальность и гибкость L2TP в сочетании с протоколом шифрования IPSec позволяет организовывать VPN с высокой степенью защиты передаваемых данных, как для доступа к ресурсам защищенной локальной сети по незащищенным каналам, так и между защищенными локальными сетями.