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.
Источник тут

Насколько полезным был этот пост?

Нажмите на звезду, чтобы оценить!

Средний рейтинг 5 / 5. Голосов: 2

Пока оценок нет! Будьте первым, поставь свою оценку этому посту.

Мы сожалеем, что этот пост не был полезен для вас!

Давайте улучшим этот пост!

Расскажите, как мы можем улучшить этот пост?

Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments
Back to top button
0
Would love your thoughts, please comment.x
()
x