Некоторое время назад автору этих строк была поставлена задача поднять 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":
# Логин и пароль. Адрес будет выдан динамически из пула сервера
Настраиваем пакетный фильтр (файрволл). Опишем правила в файле /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" чтобы он включался при загрузке:
Вот теперь действительно всё. Сервером можно пользоваться.
Настройка клиентов
Настройка PPTP-соедения на Windows вещь элементарная и описывать её не стоит. Нужно только отметить что в качестве сервера для подключения нужно указывать авторой IP-адрес (алиас) сервера, а точкой выхода будет первый (основной) адрес. Шифрование в Windows включено и используется по умолчанию.
В Linux (при использовании Network Manager) шифрование по умолчанию выключено и потому его нужно включать самому. Для этого в свойствах соединения нужно нажать кнопку "Advanced" и включить "MPPE" и "stateful encryption":
После этого соединение проходит успешно и между клиентом и сервером ходит шифрованный трафик.
Генерация логинов и паролей
Ещё один интересный момент это быстрая генерация большого количества логинов и паролей для последующей раздачи клиентам. Автор этих строк для быстрой генерации сотни пар "логин-пароль" написал небольшой скрипт на bash: