FreeBSD

MPD5 настройка VPN-сервера в FreeBSD

В данном примере рассматривается настройка MPD5 в качестве VPN-сервера для подключений Windows-клиентов к небольшой офисной сети. Также MPD5 может использоваться в качестве VPN-клиента для доступа к удаленной сети, или подключения к интернет провайдеру.

Установка MPD5

Установка пакета:

pkg_add -r mpd5

Для установки из коллекции портов, обновляем коллекцию:

portsnap fetch && portsnap update || portsnap extract

И устанавливаем порт:

cd /usr/ports/net/mpd5
make install clean

Настройка MPD5

Переходим в папку конфигурации:

cd /usr/local/etc/mpd5

При установке в паке созданы файлы с примерами типовых конфигураций. Рассматриваемый конфиг основан на секциях startup и pptp_server из типовой конфигурации.

Создаем файл конфигурации:

ee mpd.conf

Задаем параметры:

#Секция startup определяет базовые параметры MPD5
startup:
   #Протоколировать IP-адреса, с которых выполняются подключения
   log +PHYS2
   #Параметры http и telnet доступа для мониторинга и оперативного управления.
   #Задать логин, пароль и роль администратора
   set user foo bar admin
   #Задать пользователя, доступны роли operator и user, по умолчанию подразумевается user
   #set user foo1 bar1
   #Открыть локальный telnet доступ, порт 5005
   set console self 127.0.0.1 5005
   set console open
   #Открыть веб-админку на всех интерфейсах, порт 5006
   set web self 0.0.0.0 5006
   set web open

#Если при запуске MPD не задано иное, по умолчанию обрабатывается секция default.
default:
    #Загрузить секцию pptp_server
    load pptp_server

pptp_server:
    #Пул адресов, начальный и конечный адрес
    set ippool add pool1 192.168.0.193 192.168.0.254

    #Создать динамический пучок (bundle) с именем B.
    #Сетевые интерфейсы будут создаваться динамически при подключении клиента
    create bundle template B

    #Если удаленный IP-адрес входит в локальную подсеть, зарегистрировать для него MAC-адрес
    set iface enable proxy-arp

    #Отключать клиента при отсутствии трафика в течение данного количества секунд
    #set iface idle 1800

    #Корректировать размер пакета при установке TCP соединений через туннель,
    #в случае если он превышает заданный MTU (TCP Maximum Segment Size Fix)
    set iface enable tcpmssfix

    #Разрешить сжатие заголовков TCP
    set ipcp yes vjcomp

    #IP-адреса сервера и клиентов.
    #Присвоить серверу один общий адрес
    #Для клиентов задать объявленный ранее пул
    set ipcp ranges 192.168.0.192/32 ippool pool1

    #Задать клиенту DNS-серверы
    set ipcp dns 192.168.0.1 192.168.2.1
    #Задать клиенту WINS-серверы
    #set ipcp nbns 192.168.0.1

    #Разрешить шифрование Microsoft
    #Протокол сжатия Microsoft в базовой поставке не поддерживается, требуется пересборка ядра со сторонним модулем.
    set bundle enable compression
    set ccp yes mppc
    #Разрешить 40-битное и 128-битное шифрование Microsoft
    #set mppc yes e40
    set mppc yes e128
    #Разрешить безстатусный (stateless) режим шифрования.
    #Повышает устойчивость к потерям, ценой повышенной загрузки на процессор.
    set mppc yes stateless

    #Создать динамическую PPTP линию
    create link template L pptp

    #Связать с пучком B
    set link action bundle B

    #Использовать фрагментацию, если размер пакета превышает MTU
    set link enable multilink

    #Разрешить сжатие некоторых полей в заголовке, экономит от 1 до 3 байт на пакет
    set link yes acfcomp protocomp

    #Использовать CHAP авторизацию, протоколы: Microsoft CHAP v2, Microsoft CHAP, CHAP MD5.
    set link no pap eap
    set link enable chap

    #Отправлять LCP эхо запрос каждые 10 секунд, если ответа не последует в течение 60 секунд, считать соединение разорванным.
    #Не работает вплоть до версии 5.5, LCP-пинг отправляется раз в минуту
    #set link keep-alive 10 60

    #Максимальный размер пакета
    set link mtu 1460

    #Принимать PPTP подключения на всех интерфейсах
    set pptp self 0.0.0.0
    set link enable incoming

Создаем список пользователей mpd.secret:

ee mpd.secret

Задаем имена пользователей, пароли, и, можно также присвоить фиксированные IP-адреса. Имя пользователя чувствительно к регистру.

#login    password    ip
user1     pass1      192.168.0.193
user2     pass2

Ограничиваем доступ к файлу:

chmod 600 mpd.secret

Брандмауэр

Для приема PPTP подключений необходимо открыть входящие TCP соединения на порт 1723 и разрешить GRE-трафик.
Для IPFW правила будут примерно следующие:

allow tcp from any to me dst-port 1723 setup keep-state
allow gre from any to me
allow gre from me to any

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

allow all from 192.168.0.0/24 to 192.168.0.0/24

Сислог (ee /etc/syslog.conf)

Добавляем следующие строки в конец файла:

!mpd
*.*                                             /var/log/mpd.log
!*

Все сообщения от mpd будут направлены в mpd.log.

Задаем параметры ротации логов:

ee /etc/newsyslog.conf

Вариант с ежедневной отправкой уведомлений:

/var/log/mpd.log                        600  7     *    @T00  JC

Обнулять файл ежедневно в полночь, хранить 7 файлов в сжатом формате.

Либо вариант с ежемесячной ротацией с сохранением логов за последние три месяца:

/var/log/mpd.log                        600  3    *    $M1D0 JC

Создаем лог:

touch /var/log/mpd.log

Перезагружаем конфигурацию сислога:

/etc/rc.d/syslogd reload

Запуск MPD5

Разрешаем запуск MPD в rc.conf:

echo mpd_enable="yes" >> /etc/rc.conf

Запускаем демон:

/usr/local/etc/rc.d/mpd5 start

Проверяем, стартанул ли демон:

ps -ax | grep mpd5

Проверяем, слушается ли сокет:

netstat -an | grep 1723

Проверяем сообщения в лог-файле:

cat /var/log/mpd.log

Заходим браузером в Веб-админку MPD, проверяем параметры соединений.

Создаем подключение в Windows, либо настраиваем на удаленной стороне MPD-клиент и пробуем подключиться. При настройке клиентского подключения в Windows, чтобы предотвратить туннелирование всего интернет трафика в удаленную сеть, в дополнительных настройках протокола TCP/IP, необходимо отключить флажок «Использовать основной шлюз в удаленной сети». В этом случае будет туннелироваться только трафик удаленной подсети в соответствии с ее классом.

В случае проблем используем tcpdump. Мониторим физический канал, вместо $pif задаем имя физического интерфейса:

tcpdump -ni $pif tcp port 1723 or proto gre

Мониторим туннель:

tcpdump -ni ng0

Возможные проблемы

Если MPD не стартует, и пишет в лог ошибки типа: Netgraph initialization failed. Необходимо загрузить или вкомпилировать в ядро следующие модули:

ng_socket.ko
netgraph.ko
ng_mppc.ko
rc4.ko
ng_tee.ko
ng_pptpgre.ko
ng_ksocket.ko
ng_iface.ko
ng_ppp.ko
ng_tcpmss.ko

В современных версиях FreeBSD этой проблемы быть не должно. Необходимые модули подгружаются динамически при старте MPD и подключении клиента. Проверено начиная с версии FreeBSD 7.3, на более ранних не проверял.

Так же ошибка Can’t create socket node: No such file or directory. Netgraph initialization failed может возникнуть после установки новой версии системы. Проблема возникает из-за линковки программы со старыми системными библиотеками. В этом случае необходимо переустановить или пересобрать MPD.

Отчет по сессиям MPD5

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

Добавим в /usr/local/etc/periodic/daily 2 скрипта.

011.mpd

egrep '(mpd: pptp)|(MESG:)|(Name)' /var/log/mpd.log>/tmp/mpd.log.grep

800.mpd

echo
echo PPTP connections
cat /tmp/mpd.log.grep
rm /tmp/mpd.log.grep

Скрипт разбит на две части, поскольку periodic daily работает длительное время, нужно успеть сформировать отчет до ротации лога. Поэтому в самом начале обработки первым скриптом сбрасываем содержимое во временный файл, а когда дойдет очередь в отчете до VPN сессий, вторым скриптом читаем и удаляем временный файл.

Для корректной работы скрипта придется перенести время запуска periodic daily на 23:57 в /etc/crontab:

57      23      *       *       *       root    periodic daily

Если время запуска periodic daily менять не желательно, придется, либо перенести ротацию лога на 4 часа, поскольку логи ротируются ежечасно соединения с 3 до 4 часов не будут включены в отчет. Либо формировать отчет напрямую через cron, не зависимо от periodic.
Источник тут

Оставить комментарий