В данном примере рассматривается настройка 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.
Источник тут