Настройка pptpd на FreeBSD

()

Некоторое время назад автору этих строк была поставлена задача поднять PPTP-сервер на FreeBSD. Обычно для этого используют mpd, но поскольку автор является "прожжёным линуксоидом" то он решил попробовать поднять привычный по Linux pptpd. Попытка увенчалась успехом и был получен простой в администрировании pptp-сервер. Далее будет приведено описание процесса настройки и запуска сервиса.

Настройка сервера

Подробная постановка задачи:

  • сервер под управлением FreeBSD 8.1;
  • сетевой интерфейс fxp0 на сервере с IP-адресом 1.2.3.4 и алиасом 1.2.3.5;
  • клиенты должны подключаться к серверу на его алиас и иметь точкой выхода основной адрес сервера;
  • трафик между клиентами и сервером должен шифроваться;

Приступаем к настройке. Первым делом запустим DNS-сервер. Для этого открываем файл "/etc/namedb/named.conf" и меняем строку:

	listen-on	{ 127.0.0.1; };

На:

	listen-on	{ any; };

Чтобы сервер слушал на всех доступных адресах и интерфейсах а не только на localhost, поскольку именно этот сервер в качестве DNS и будут использовать наши клиенты. Затем добавляем в файл /etc/rc.conf строку:

named_enable="YES"

И запускаем сервис:

/etc/rc.d/named start

Теперь нужно обновить дерево портов, чтобы быть уверенными что ставим всё самое свежее:

portsnap fetch extract

Сервер pptpd доступен в портах FreeBSD как net/poptop. Установим его:

cd /usr/ports/net/poptop && make install clean

Переходим к настройке. Клиентам мы будем выдавать адреса из сети 10.255.117.0/255.255.255.0. Для всех PPP-соединений на стороне сервера будет адрес 10.255.117.1.

Самая большая сложность при настройке возникла когда выяснилось что при использовании типовой конфигурации клиенты на Linux и Mac OS X не могли согласовать с сервером шифрование и потому хотя формально подключение и происходило - реально трафик не ходил. У клиентов под управлением Windows таких проблем не возникло.

Однако вдумчивое чтение документации некоторые эксперименты с конфигурацией помогли решить эту проблему. Далее будет описано сразу готовое решение.

Создадим файл конфигурации pptpd "/usr/local/etc/pptpd.conf" следующего содержания:

noipparam
logwtmp
localip 10.255.117.1
remoteip 10.255.117.2-102
+chapms-v2
mppe-128
mppe-stateless
nobsdcomp

Теперь нам нужно настроить подсистему ppp, надстройкой над которой и является pptpd. Здесь самым первым делом нужно привести файл "/etc/ppp/ppp.conf" к виду:

default:
 set log Phase Chat LCP IPCP CCP tun command
 disable ipv6cp
 ident user-ppp VERSION
 set device /dev/cuau1

 set speed 115200
 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
           \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
 set timeout 180
 enable dns

papchap:
 set phone PHONE_NUM
 set authname USERNAME
 set authkey PASSWORD

 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
 add default HISADDR

loop:
 set timeout 0
 set log phase chat connect lcp ipcp command
 set device localhost:pptp
 set dial
 set login
 # Здесь указываем:
 # 1. Адрес на стороне сервера для всех подключений
 # 2. Диапазон клиентских адресов
 # 3. Маску подсети
 set ifaddr 10.255.117.1 10.255.117.2-10.255.117.102 255.255.255.0
 add default HISADDR
 set server /tmp/loop "" 0177

loop-in:
 set timeout 0
 set log phase lcp ipcp command
 allow mode direct


pptp:
 load loop
 disable pap
 disable ipv6cp
 accept dns
 enable MSChapV2
 enable mppe
 disable deflate pred1
 deny deflate pred1
 add default HISADDR
 # Адрес DNS, выдаваемый клиентам.
 # Идеальный вариант - адрес сервера ("точка выхода")
 set dns 1.2.3.4
 set mppe 128 stateless
 set device !/etc/ppp/secure

Следующий шаг - создание скрипта "/etc/ppp/secure", управляющего ppp-соединенями:

#!/bin/sh
exec /usr/sbin/ppp -direct loop-in

Создаём файл с логинами и паролями "/etc/ppp/ppp.secret":

# Логин и пароль. Адрес будет выдан динамически из пула сервера
login1 pass1

# Логин и пароль со "ситатическим" адресом
login2 pass2 10.255.117.200

Запускаем сервер:

echo pptpd_enable="YES" >> /etc/rc.conf && /usr/local/etc/rc.d/pptpd start

Настраиваем пакетный фильтр (файрволл). Опишем правила в файле /etc/pf.rules:

set limit { states 20000, frags 5000 }
set timeout { adaptive.start 6000, adaptive.end 12000 }
set skip on { lo0 }


# Базовые настройки
if_ext = "fxp0"
if_pptp = "tun"
table <pptp_users> { 10.255.117.0/24 }

set block-policy drop
set state-policy if-bound

scrub all reassemble tcp fragment reassemble

# NAT для клиентов PPTPD
nat on $if_ext inet from <pptp_users> -> ($if_ext:0)

pass quick on lo0 all
pass quick on tun all

# Разрешаем исходящий трафик
pass out quick on $if_ext inet proto tcp from ($if_ext) to any flags S/SA keep state
pass out quick on $if_ext inet proto { udp, icmp } from ($if_ext) to any keep state
pass out quick on $if_ext inet proto gre from ($if_ext) to any

# Разрешаем доступ к серверу по SSH
pass in quick on $if_ext inet proto tcp from any to ($if_ext) port 22 flags S/SA keep state


# Разрешаем подключение по PPTP
pass in quick on $if_ext inet proto tcp from any to ($if_ext) port 1723 flags S/SA keep state
pass in quick on $if_ext inet proto gre from any to ($if_ext) keep state

# Разрешаем ICMP
pass in quick on $if_ext inet proto icmp from any to ($if_ext)

# Разрешаем весь трафик наших клиентов
pass in quick inet from <pptp_users> to any

# Запрещаем весь остальной трафик
block drop all

Добавляем в файл "/etc/rc.conf" строки:

pf_enable="YES"
pf_rules="/etc/pf.rules"

И запускаем пакетный фильтр:

/etc/rc.d/pf start

Казалось бы всё, но кое-что ещё не сделано. И это кое-что очень важное: мы не включили форвардинг (пересылку) пакетов. Без этого клиенты смогут подключаться к серверу, но их трафик дальше сервера не уйдёт.

Включаем форвардинг и сразу добавляем соответствующую строку в файл "/etc/sysctl.conf" чтобы он включался при загрузке:

sysctl net.inet.ip.forwarding=1 && echo net.inet.ip.forwarding=1 >> /etc/sysctl.conf

Вот теперь действительно всё. Сервером можно пользоваться.

Настройка клиентов

Настройка PPTP-соедения на Windows вещь элементарная и описывать её не стоит. Нужно только отметить что в качестве сервера для подключения нужно указывать авторой IP-адрес (алиас) сервера, а точкой выхода будет первый (основной) адрес. Шифрование в Windows включено и используется по умолчанию.

В Linux (при использовании Network Manager) шифрование по умолчанию выключено и потому его нужно включать самому. Для этого в свойствах соединения нужно нажать кнопку "Advanced" и включить "MPPE" и "stateful encryption":

Расширенные настройки PPTP в Network Manager

После этого соединение проходит успешно и между клиентом и сервером ходит шифрованный трафик.

Генерация логинов и паролей

Ещё один интересный момент это быстрая генерация большого количества логинов и паролей для последующей раздачи клиентам. Автор этих строк для быстрой генерации сотни пар "логин-пароль" написал небольшой скрипт на bash:

#!/usr/local/bin/bash

# Уровень "случайности" пароля.
RND_LEVEL=8
# Длина пароля
PASS_LEN=8

for i in {1..100}; do
    echo user$i `head -c $RND_LEVEL /dev/urandom | md5 | cut -c 1-$PASS_LEN`
done

После запуска скрипт напечатает сотню пар "логин-пароль" на стандартный вывод. Вывод скрипт можно сразу перенаправить в файл /etc/ppp/ppp.secret.

На этом всё. Приятной работы!

Ключевые слова: freebsd, pptpd, poptop, mppe, pf.

Комментарии:

morbo 2010-11-15 07:34:38 (#)

Привычный pptpd в FreeBSD, насколько я знаю, работает полностью в режиме пользователя, что приводит к его низкой производительности.

Кстати, сегодня появилась новость, что патчи для accel-pptp, работающего полностью в режиме ядра, войдут в официальное ядро Linux. После этого производительность pptpd в Linux и mpd в FreeBSD должны сравняться.

MooSE 2010-11-15 10:00:33 (#)

Цитата:

Привычный pptpd в FreeBSD, насколько я знаю, работает полностью в режиме пользователя, что приводит к его низкой производительности.

Кстати, сегодня появилась новость, что патчи для accel-pptp, работающего полностью в режиме ядра, войдут в официальное ядро Linux. После этого производительность pptpd в Linux и mpd в FreeBSD должны сравняться.

Он везде в режиме пользователя работает. Но при небольшом количестве клиентов это не фатально.

mpd мне не понравился сложность конфигурации. что вобщем-то характерно для подобных комбайнов.

То что в Linux включают accel-pptp это клёво, но надо дождаться этого в дистрибутивах.

Anonymous 2010-11-30 08:33:46 (#)

Цитата:



mpd мне не понравился сложность конфигурации. что вобщем-то характерно для подобных комбайнов.

в mpd значительно больше ручек для управления - причем большая часть ее это настройки ppp уровня.
все что относится к pptp - это устновить тип линка на pptp, назначить на каком адресе слушаем и сказать что принимаем соединения - ровно 4 строки в mpd.links.
остальное - это не более чем настройки ppp - которые тут перемещены в свой каталог.

Anonymous 2010-12-01 09:19:25 (#)

поделитесь ссылкой,как настроить VPN сервер чтобы без проблем держал 1000 клиентов? (можно и без шифрации)

MooSE 2010-12-01 09:36:36 (#)

Цитата:

поделитесь ссылкой,как настроить VPN сервер чтобы без проблем держал 1000 клиентов? (можно и без шифрации)


Для начала расскажи какие у тебя проблемы при тысяче клиентов:)

Anonymous 2010-12-03 23:02:02 (#)

замучали разрывы (с)
например у клиентов отваливается коннект
(ошибки сети маловероятны - пинг постоянный)

причем сервер думает что клиент еще тут и не разрывает сессию. причем убить туннель методом kill PID не получается

слышал, что для pptp нужно ставить патч и использовать некоторые шаманские заклинания

под линух слышал вообще такое невозможно

Anonymous 2011-03-12 15:44:34 (#)

А кто подскажет, какие правила в ipfw писать надо, что бы пропустить VPN клиентов за шлюз, внутрь сети?

Anonymous 2011-11-05 17:51:34 (#)

poptop может оказаться полезен во многих случаях.
Конкретно у меня проблема: с установленной семерки не идут коннекты на внешние впн сервера под mpd5 (внутри сети инет выдается через впн), уж не знаю козни провайдера это или что еще, но на настроенный Poptop коннект идет, а на Mpd5 - ошибка 619

Спасибо за гайд!
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE