dadv: (chuck)
[personal profile] dadv

Весьма элегантное решение для FreeBSD проблемы проброса VPN через мало приспособленные для этого подключения к Сети типа мобильного телефона или ADSL-модема, когда клиенту выдается, в общем случае, динамический "приватный" адрес IP вида 192.168.0.100 или 10.1.2.3 и выход в сеть идет через трансляцию адресов. Причем иногда нормально пропускаются только протоколы TCP и UDP. А, например, GRE уже не пройдет, и, следовательно, PPtP тоже.

Так вот, решением в таком случае становится L2TP, который инкапсулирует произвольный поток IP-пакетов, выдавая поток UDP-пакетов и предоставляя стандартный PPP-интерфейс со всеми "фичами" протокола PPP - с авторизацией, шифрованием, автоматическим выделением IP-адресов для VPN-соединения, адресов серверов DNS и MS WINS и т.п. Замечательно проходит через любые трансляции адресов.

Серверная часть на основе mpd5. Конфигурация mpd.conf:

startup:
        # через полчаса (1800 секунд) неактивности закрывать
        # соединения l2tp, по умолчанию 10 секунд
        set global l2tptimeout 1800

default:
        load l2tp

l2tp:
        # создание шаблона соединения - реальное соединение будет
        # создано по этому шаблону при входящем подключении L2TP-клиента
        create bundle template P

        # тут произвольные параметры IPCP, хорошо знакомые по более
        # распространенным рецептам настроек "традиционного" PPP,
        # PPtP или PPPoE
        set ipcp yes vjcomp
        set ipcp ranges 192.168.100.33/32 192.168.100.34/32

        # используем только один линк в соединении
        create link template L1 l2tp
        # собственный адрес L2TP-сервера, к которому будет подключаться клиент
        set l2tp self 1.1.1.1
        # имя L2TP-сервера для диагностики - будет "светиться" в журналах
        set l2tp hostname mydomain.ru
        # пароль для авторизации клиентского L2TP-хоста и шифрования
        # служебных пакетов
        set l2tp secret "myl2tppassword"
        # использовать пароль для шифрования служебных пакетов
        set l2tp enable hidden

        # привязываем линк к нашему шаблонному соединению
        set link action bundle P
        # опять любые стандартные настройки PPP
        set link accmap 0
        set link yes acfcomp protocomp
        set link no pap chap
        set link keep-alive 65 180
        # это шаблон входящих соединений
        set link enable incoming

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

Настройка клиента очень похожа, mpd.conf:

startup:
        set global l2tptimeout 1800

default:
        load l2tp

l2tp:
        # клиент создает не шаблон для входящих соединений,
        # а одно конкретное исходящее соединение
        create bundle static P
        set ipcp yes vjcomp

        # один линк в соединении (бывают и мультилинковые)
        create link static L1 l2tp
        set link action bundle P
        set link accmap 0
        set link yes acfcomp protocomp
        set link no pap chap
        set link keep-alive 65 180
        # при обрыве связи переподключаться неограниченное число раз,
        # по умолчанию значение -1 (не переподключаться)
        set link max-redial 0
        # это не входящее соединение, а исходящее
        set link disable incoming

        # адрес L2TP-сервера
        set l2tp peer 1.1.1.1
        set l2tp secret "myl2tppassword"
        set l2tp enable hidden
        # сразу после старта mpd открывать соединение
        set l2tp enable outcall
        open

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Tags

Style Credit

Powered by Dreamwidth Studios