В данном примере рассматривается настройка 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.
Источник тут
FreeBSD 12.4 доступна для скачивания
Команды управления пакетным фильтром pf