pfSense 2.1 PPTP-клиент Печать
28.04.14 13:12

pfSense 2,1 и PPTP-клиент на WAN интерфейсе


pfSense - программный межсетевой экран/маршрутизатор, основанный на FreeBSD, неплохо работает "из коробки". Но с некоторым функционалом все же приходится повозиться и так сказать "доработать напильником".
Одним из таких мест стал pptp-клиент, который основывается на MPD (Multi-link PPP daemon). Клиент совершенно не хотел подключаться к корпоративному Microsoft Windows PPTP-серверу. Из логов было понятно, что клиент и сервер никак не могут договориться об используемом протоколе аутентификации.


Лог (Status->System logs->PPP):
При этом клиенты на Windows-машинах без проблем подключались. В состоянии подключения видна следующая картина:


Поиск в интернете дал несколько решений:
  1. http://www.thin.kiev.ua автор раскрывает причину происходящего, оказывается по умолчанию в pfsense отключена поддержка шифрования от Microsoft. В надежде, что все вроде логично и должно сразу заработать, в файл interfaces.inc были внесены описанные изменения. Но к сожалению, в моем случае это не помогло.
  2. http://habrahabr.ru здесь в комментариях, в дополнение первого решения, предлагается отключить лишние методы шифрования непосредственно в настройках PPTP-сервера. Идея наверняка принесла бы свои плоды, жаль только, что проверить мне её не удалось. К настройкам сервера доступ я не имел.
  3. http://am-productions.biz когда я уже отчаялся, было найдено данное решение. Здесь описывается настройка mpd в качестве PPTP-клиента во FreeBSD. Автор приводит конфигурацию, в которой указаны нужные параметры, остается только разобраться что к чему и исправить конфигурацию в pfSense.
Для того чтобы разобраться, какие именно параметры шифрования необходимо указать, пришлось проанализировать все три решения, обратившись к документации MPD.
Первое, что хочется отметить, так это разницу в командах enable/disable, accept/deny, yes/no.
Первая пара enable/disable указывает, пожелания с нашей стороны.
Пара accept/deny указывает будем ли мы принимать пожелания противоположной стороны.
Команда "yes" - это одновременно enable и accept. А "no" - соответственно disable и deny.
Далее вернемся к состоянию подключения на Windows-клиентах:
Проверка подлинности MS CHAP V2
Шифрование MPPE 128
Сжатие MPPC
Для начала разберемся со сжатием и шифрованием.

set bundle enable compression // включаем протокол управления сжатием
set ccp yes mppc // разрешаем субпротокол сжатия/шифрования MPPC (Microsoft Point-to-Point Compression)
set mppc yes e40 e56 e128 // разрешаем 40,56,128-битное шифрование. В моем случае можно оставить только последнее.
set mppc yes stateless // разрешаем stateless-режим. Не совсем понятно, что же он делает, но в документации написано, что позволяет быстро восстановить соединение при потере пакетов.

Далее необходимо выбрать метод проверки подлинности. Почти все методы, используемые Microsoft, включены по-умолчанию и отлично работают без дополнительных команд. Остается только подтолкнуть mpd к принятию правильного решения. Нужно отметить, что chap - это псевдоним, который включает в себя chap-md5 chap-msv1 chap-msv2. Указывать их отдельно не нужно.

set link no pap eap // отключаем лишние методы, как указано во втором решении, только на стороне клиента, а не сервера.

Следующим шагом надо внести изменения в файл /etc/inc/interfaces.inc. Сделать это можно несколькими способами. Редактировать прямо из web-интерфейса: Diagnostics -> Edit File. здесь нажимаем "Browse", выбираем нужный файл, ищем в нем участок кода (удобно пользоваться поиском), вносим изменения и сохраняем. Также можно отредактировать из консоли, в меню выбираем пункт "8) Shell", откроется командная строка FreeBSD. Вводим команду "ee /etc/inc/interfaces.inc" без кавычек.  Откроется редактор ee (Easy Editor) и уже в нем производится правка. Главное внимательно проверить, тот ли кусок кода править, нужный участок начинается примерно на 1440 строке. В итоге получаем:

if (!isset($ppp['verbose_log']))
$mpdconf .= <<<EOD


set bundle enable compression
set ccp yes mppc
set mppc yes e40 e56 e128
stateless

#log -bund -ccp -chat -iface -ipcp -lcp -link

EOD;

foreach($ports as $pid => $port){
$port = get_real_interface($port);
$mpdconf .= <<<EOD

create link static {$interface}_link{$pid} {$type}
set link action bundle {$interface}
set link {$multilink} multilink
set link keep-alive 10 60
set link max-redial 0

EOD;

if (isset($ppp['shortseq']))
$mpdconf .= <<<EOD
set link no shortseq

EOD;

if (isset($ppp['acfcomp']))
$mpdconf .= <<<EOD
set link no acfcomp

EOD;

if (isset($ppp['protocomp']))
$mpdconf .= <<<EOD
set link no protocomp

EOD;

$mpdconf .= <<<EOD

set link no pap eap
# set link disable chap pap
# set link accept chap pap eap
set link disable incoming


Теперь можно создавать PPTP-сессии. Если сессия уже создана, то нужно отключить и снова включить привязанный к ней сетевой интерфейс. После внесения изменений все заработало. Из логов видно какой метод аутентификации и шифрования были выбраны.

Лог (Status->System logs->PPP):
Распространенной ошибкой в ходе настройки PPTP/PPPOE-клиента является некорректно указанный IP-адрес клиента. Если адрес выдается автоматически, нужно внести в поле "Local IP address" 0.0.0.0 и указать корректную маску сети, например /24.


Все вышеописанное выполнялось и проверялось на pfSense 2.0.1. и успешно работает на 2.1. После обновления pfSense изменения нужно вносить заново.



ссылка на материал: http://www.thin.kiev.ua/router-os/50-pfsense/1999-pfsense-21-pptp-wan.html

{jcomments on}
Последнее обновление 28.04.14 13:26