развертывание тарифицируемого доступа в интернет с использованием VPN
введение
Существует много способов тарификации пользователей интернет, но PPP остается, пожалуй, лучшим из них - он поддерживает аунтефикацию, шифрование (к сожалению, только проприетарное - mppe, хотя в последних версиях ядра linux оно уже включено), и поддерживается, пожалуй, всеми существующими ныне операционными системами. Изначально PPP был создан как протокол для коммутируемых линий, но сейчас существует множество технологий инкапсуляции PPP в другие протоколы различных уровней. Из наиболее распространенных хочу отметить PPtP – GRE-инкапсуляцию PPP через существующую TCP/IP-сеть, и PPPoE - инкапсуляцию PPP в кадры Ethernet.
PPP, VPN и GNU/Linux
В Linux сервером PPTP выступает poptop, распространяемый по лицензии GPL. Его официальный сайт доступен по адресу www.poptop.org. На момент написания статьи текущая стабильная версия - 1.2.3.
Poptop сам всего лишь инкапсулирует PPP в GRE-соединение. Для создания PPP-соединения он использует pppd. В качестве PPPoE-сервера может выступать rp-pppoe, доступный для свободного скачивания ссайтКак и poptop, rp-pppoe использует pppd для создания ppp-соединений. Для BSD существует еще несколько реализаций PPTP- и PPPoE-серверов, в частности mpd и pppoed. Они имеют свои плюсы и минусы по сравнению с poptop и rp-pppoe.
установка и настройка poptop
Установка poptop достаточно тривиальна. В debian это делается одной командой –
apt-get install pptpd
В вашем дистрибутиве poptop возможно отсутствует, поэтому вам прийдется его собрать вручную:
tar -xzvf pptpd-1.2.3.tar.gz; cd pptpd-1.2.3; ./configure && make && make install
Если вы хотите, что бы расположение файлов poptop было a-la дистрибутивное, то запускайте configure вот так:
./configure -prefix=/usr -sysconfdir=/etc
Если вам нужна поддержка TCP wrappers - добавьте ключ -with-libwrap (см. man 5 tcpd). Настройка poptop сводится к банальному редактированию pptpd.conf (как правило, это /etc/pptpd.conf).
TAG: ppp. Путь к pppd, по умолчанию /usr/sbin/pppd.
ppp /usr/sbin/pppd
TAG: option. Указывает местонахождение файла опций pppd, т. наз. peer`a. По умолчанию /etc/ppp/options.
option /etc/ppp/pptpd-options
TAG: debug. Включает отладочный вывод в syslog.
#debug
TAG: stimeout. Указывает таймаут (в секундах) для старта управляющего соединения.
# stimeout 10
TAG: noipparam. Запрещает передачу клиенту его IP-адреса, что иначе делается по умолчанию.
#noipparam
TAG: logwtmp. Использовать wtmp(5) для регистрации коннектов клиента.
#logwtmp
TAG: bcrelay. Включает режим броадкастового релея к клиентам с указанного интерфейса.
#bcrelay eth1
TAG’и localip и remoteip. Указывают локальный и удаленный пулы IP-адресов.
Любые адреса работают, пока удаленная машина следит за своей таблицей роутинга.
Вы можете указать один IP-адрес, или несколько разделенных запятыми.
Также вы можете задавать маски. Например: 192.168.0.234,192.168.0.245-249,192.168.0.254. Важные ограничения:
1. Никаких пробелов между запятыми или адресами.
2. Если вы задали больше IP-адресов, чем MAX_CONNECTIONS, то poptop начинает с начала списка и до тех пор, пока не превышает MAX_CONNECTIONS. Остальные адреса будут проигнорированы.
3. Сокращения недопустимы! То есть 234-8 не значит 234-238.
localip 192.168.0.1
remoteip 192.168.0.2-200,192.168.1.245
настройка pppd
В debian пир, который поставляется вместе с pptpd, почти готов к использованию. После небольших изменений, необходимых нам, получается примерно следующие настройки.
Подключаем плагин для работы с radius-сервером:
plugin radius.so
Задаем имя локальной системы:
name pptp.server.local
Обрезаем имя домена, которое очень любит передавать windows вместе с именем:
chapms-strip-domain
Из всех типов авторизации мы признаем только CHAP (он шифрует пароли во время передачи).
require-chap
# require-mschap-v2
Включаем MPPE-шифрование. Хочу отметить, что для поддержки MPPE необходимо включить mschap v2, и наложить патч на ядро.
# require-mppe-128
Наши DNS-серверы:
ms-dns 192.168.0.1
ms-dns 192.168.0.201
Добавляем в таблицу ARP удаленного клиента:
proxyarp
Не заменяем default route:
nodefaultroute
Включаем отладку:
debug
Создаем UUCP-like лок-файл:
lock
Все!
настройка rp-pppoe
Настройка rp-pppoe гораздо проще, чем poptop. Основные отличия в том, что pppd peer называется /etc/ppp/pppoe-server-options. Так же хочу отметить, что rp-pppoe из дистрибутива debian 5 отказался корректно работать в качестве сервера, поэтому мне пришлось его пересобрать, указав скрипту ./configure путь к исходным кодам pppd, которые я получил командой
apt-get source pppd
пересобираем ядро с поддержкой mppe
Пересобирать ядро мы будем на примере debian. Установим необходимые пакеты:
apt-get install gcc bin86 libc6-dev bzip2 kernel-package kernel-patch-mppe apt-get install kernel-source-2.6.11.7
Пересоберем ядро:
cd /usr/src
tar xfj kernel-source-2.6.11.7.tar.bz2
cd kernel-source-2.6.11.7
make-kpkg clean
cp /boot/config-`uname -kernel-release` ./.config
cd /usr/src/kernel-source-2.6.11.7
make-kpkg -added-patches mppe -append-to-version -mppe -config oldconfig -initrd kernel_image
Когда у вас спросят о опции CONFIG_PPP_MPPE, нажмите m:
PPP MPPE compression (encryption) (PPP_MPPE) [N/m/?] (NEW) m
И, наконец, установите новое ядро:
dpkg -install /usr/src/kernel-image-2.6.11.7-mppe_10.00.Custom_all.deb
и перезагрузитесь.
собственно, авторизация и учет. Radius
Radius - это Remote Access Dial-Up User Service, протокол разработанный компанией Lucent RA. Для более подробной информации обратитесь к RFC 2138 и 2139.
В кратце, суть Radius заключается в следующих тезисах:
- логины и пароли клиентов хранятся на radius-сервере;
- есть Network Access Server (NAS), например – pppd или Cisco;
- NAS посылает запрос, содержащий имя пользователя, пароль и некую дополнительную информацию radius-серверу;
- radius-сервер отвечает NAS’у, разрешая или запрещая вход этого пользователя;
- запросы и ответы называются radius-пакетами, каждый пакет состоит из пар Attribute-Value;
- при необходимости запускается процесс аккаунтинга, который производит учет времени, траффика и других параметров сессии пользователя.
аутентификация и авторизация
Первая, и основная задача radius – аутентификация. Radius определяет, может ли юзер использовать запрашиваемый им сервис. Например, когда пользователь vasya пытается дозвониться на NAS, происходит следующее:
1. NAS запрашивает логин и пароль.
2. NAS посылает access-request пакет Radius-серверу. Access-request пакет содержит всю необходимую информацию для аутентификации (как правило, это логин, пароль, телефонный номер).
3. Radius проверяет в базе данных, существует ли пользователь vasya и совпадает ли пароль с предложенным. Дополнительно, Radius может проверить различные условия, например телефон, с которого звонит vasya, время, и т.д. Если все условия выполнены, Radius посылает NAS’у access-accept, если нет - то access-reject.
Далее начинается процесс авторизации. Radius передает NAS’у дополнительные параметры, например, IP-адрес, который нужно присвоить клиенту.
аккаунтинг
Радиус сохраняет информацию о трафике, которую передает ему NAS, о времени пользователя online, и д.р. Вот не полный список аккаунтиг-атрибутов:
- User-Name;
- NAS-IP-Address;
- NAS-Port;
- Service-Type;
- Framed-Protocol;
- Framed-IP-Address;
- Calling-Station-ID;
- Acct-Input-Octets;
- Acct-Output-Octets;
- Acct-Session-Time.
Основной проблемой первых имплеминтаций Radius было то, что accountnig-информация отправлялась только в конце сессии. Для обхода этой проблемы были придуманы так называемые alive-пакеты. В начале сессии Radius передает NAS’у параметр Acct-Interim-Interval, в котором указывается, как часто посылать alive-пакеты. В Alive-пакетах содержится актуальное обновление аккаунтинговой информации. Хочу отметить, что период отправки alive-пакетов может задаваться на NAS’e.
В результате, сессию можно представить в следующем виде:
Call - access-request - access-accept - acct-request - acct-reply - alive - ... - alive - end of call
Или вот так:
Start - Alive - ... - Alive - Stop
Хочу так же отметить, что у Radius’a есть один большой недостаток - он очень легко может пропустить пакет. В первую очередь это обусловлено тем, что Radius работает по UDP. Во вторую очередь это может быть связано с высокой загрузкой сервера. В случае утери alive-пакета ничего страшного не происходит - ведь со следующим alive-пакетом (или со stop-пакетом) придут реальные значения счетчиков. Но в случае утери Start- или Stop- записи происходит страшное, и мы уже не можем так просто анализировать аккаунтинговую информацию. Есть два решения этой проблемы. Первое - это увеличение надежности канала связи между NAS’ом и Radius-сервером и закупка сверхмощного оборудования; второе заключается в написании расширения дополнительной логики к radius-серверу (модуля биллинга). Возможны другие решения, например написание скрипта, который будет запускаться по приходу аккаунтиг-пакетов и анализировать текущую сессию. Но это решение гораздо более ресурсоемко. Остановимся на втором.
К счастью, разработчики бесплатного программного обеспечения уже подумали за нас, и нам остается взять почти готовое. Речь идет о проекте freenibs, основную ветку которого можно загрузить по адресу nibs.net.ua. Существует несколько веток этого ПО, все ссылки на их сайты можно найти на форуме.
FreeNIBS
FreeNIBS - это плагин для freeradius (www.freeradius.org). Достаточно подробная документация по настройке есть в документации freenibs. Хочу только отметить, что на данный момент установка freenibs - процесс достаточно творческий, и для реального использования в продакшн нужно исправить несколько ошибок в коде freenibs, которые приводят к ошибкам в логике и увеличению нагрузки на сервер. На форуме вы сможете найти патчи, в которых исправляются некоторые из этих ошибок (и, как принято, добавляются новые). Но в целом, после месяца обработки напильником, freenibs успешно используется мной в качестве биллинга на одном из беларуских провайдеров.
ugenka.
Существует много способов тарификации пользователей интернет, но PPP остается, пожалуй, лучшим из них - он поддерживает аунтефикацию, шифрование (к сожалению, только проприетарное - mppe, хотя в последних версиях ядра linux оно уже включено), и поддерживается, пожалуй, всеми существующими ныне операционными системами. Изначально PPP был создан как протокол для коммутируемых линий, но сейчас существует множество технологий инкапсуляции PPP в другие протоколы различных уровней. Из наиболее распространенных хочу отметить PPtP – GRE-инкапсуляцию PPP через существующую TCP/IP-сеть, и PPPoE - инкапсуляцию PPP в кадры Ethernet.
PPP, VPN и GNU/Linux
В Linux сервером PPTP выступает poptop, распространяемый по лицензии GPL. Его официальный сайт доступен по адресу www.poptop.org. На момент написания статьи текущая стабильная версия - 1.2.3.
Poptop сам всего лишь инкапсулирует PPP в GRE-соединение. Для создания PPP-соединения он использует pppd. В качестве PPPoE-сервера может выступать rp-pppoe, доступный для свободного скачивания ссайтКак и poptop, rp-pppoe использует pppd для создания ppp-соединений. Для BSD существует еще несколько реализаций PPTP- и PPPoE-серверов, в частности mpd и pppoed. Они имеют свои плюсы и минусы по сравнению с poptop и rp-pppoe.
установка и настройка poptop
Установка poptop достаточно тривиальна. В debian это делается одной командой –
apt-get install pptpd
В вашем дистрибутиве poptop возможно отсутствует, поэтому вам прийдется его собрать вручную:
tar -xzvf pptpd-1.2.3.tar.gz; cd pptpd-1.2.3; ./configure && make && make install
Если вы хотите, что бы расположение файлов poptop было a-la дистрибутивное, то запускайте configure вот так:
./configure -prefix=/usr -sysconfdir=/etc
Если вам нужна поддержка TCP wrappers - добавьте ключ -with-libwrap (см. man 5 tcpd). Настройка poptop сводится к банальному редактированию pptpd.conf (как правило, это /etc/pptpd.conf).
TAG: ppp. Путь к pppd, по умолчанию /usr/sbin/pppd.
ppp /usr/sbin/pppd
TAG: option. Указывает местонахождение файла опций pppd, т. наз. peer`a. По умолчанию /etc/ppp/options.
option /etc/ppp/pptpd-options
TAG: debug. Включает отладочный вывод в syslog.
#debug
TAG: stimeout. Указывает таймаут (в секундах) для старта управляющего соединения.
# stimeout 10
TAG: noipparam. Запрещает передачу клиенту его IP-адреса, что иначе делается по умолчанию.
#noipparam
TAG: logwtmp. Использовать wtmp(5) для регистрации коннектов клиента.
#logwtmp
TAG: bcrelay
#bcrelay eth1
TAG’и localip и remoteip. Указывают локальный и удаленный пулы IP-адресов.
Любые адреса работают, пока удаленная машина следит за своей таблицей роутинга.
Вы можете указать один IP-адрес, или несколько разделенных запятыми.
Также вы можете задавать маски. Например: 192.168.0.234,192.168.0.245-249,192.168.0.254. Важные ограничения:
1. Никаких пробелов между запятыми или адресами.
2. Если вы задали больше IP-адресов, чем MAX_CONNECTIONS, то poptop начинает с начала списка и до тех пор, пока не превышает MAX_CONNECTIONS. Остальные адреса будут проигнорированы.
3. Сокращения недопустимы! То есть 234-8 не значит 234-238.
localip 192.168.0.1
remoteip 192.168.0.2-200,192.168.1.245
настройка pppd
В debian пир, который поставляется вместе с pptpd, почти готов к использованию. После небольших изменений, необходимых нам, получается примерно следующие настройки.
Подключаем плагин для работы с radius-сервером:
plugin radius.so
Задаем имя локальной системы:
name pptp.server.local
Обрезаем имя домена, которое очень любит передавать windows вместе с именем:
chapms-strip-domain
Из всех типов авторизации мы признаем только CHAP (он шифрует пароли во время передачи).
require-chap
# require-mschap-v2
Включаем MPPE-шифрование. Хочу отметить, что для поддержки MPPE необходимо включить mschap v2, и наложить патч на ядро.
# require-mppe-128
Наши DNS-серверы:
ms-dns 192.168.0.1
ms-dns 192.168.0.201
Добавляем в таблицу ARP удаленного клиента:
proxyarp
Не заменяем default route:
nodefaultroute
Включаем отладку:
debug
Создаем UUCP-like лок-файл:
lock
Все!
настройка rp-pppoe
Настройка rp-pppoe гораздо проще, чем poptop. Основные отличия в том, что pppd peer называется /etc/ppp/pppoe-server-options. Так же хочу отметить, что rp-pppoe из дистрибутива debian 5 отказался корректно работать в качестве сервера, поэтому мне пришлось его пересобрать, указав скрипту ./configure путь к исходным кодам pppd, которые я получил командой
apt-get source pppd
пересобираем ядро с поддержкой mppe
Пересобирать ядро мы будем на примере debian. Установим необходимые пакеты:
apt-get install gcc bin86 libc6-dev bzip2 kernel-package kernel-patch-mppe apt-get install kernel-source-2.6.11.7
Пересоберем ядро:
cd /usr/src
tar xfj kernel-source-2.6.11.7.tar.bz2
cd kernel-source-2.6.11.7
make-kpkg clean
cp /boot/config-`uname -kernel-release` ./.config
cd /usr/src/kernel-source-2.6.11.7
make-kpkg -added-patches mppe -append-to-version -mppe -config oldconfig -initrd kernel_image
Когда у вас спросят о опции CONFIG_PPP_MPPE, нажмите m:
PPP MPPE compression (encryption) (PPP_MPPE) [N/m/?] (NEW) m
И, наконец, установите новое ядро:
dpkg -install /usr/src/kernel-image-2.6.11.7-mppe_10.00.Custom_all.deb
и перезагрузитесь.
собственно, авторизация и учет. Radius
Radius - это Remote Access Dial-Up User Service, протокол разработанный компанией Lucent RA. Для более подробной информации обратитесь к RFC 2138 и 2139.
В кратце, суть Radius заключается в следующих тезисах:
- логины и пароли клиентов хранятся на radius-сервере;
- есть Network Access Server (NAS), например – pppd или Cisco;
- NAS посылает запрос, содержащий имя пользователя, пароль и некую дополнительную информацию radius-серверу;
- radius-сервер отвечает NAS’у, разрешая или запрещая вход этого пользователя;
- запросы и ответы называются radius-пакетами, каждый пакет состоит из пар Attribute-Value;
- при необходимости запускается процесс аккаунтинга, который производит учет времени, траффика и других параметров сессии пользователя.
аутентификация и авторизация
Первая, и основная задача radius – аутентификация. Radius определяет, может ли юзер использовать запрашиваемый им сервис. Например, когда пользователь vasya пытается дозвониться на NAS, происходит следующее:
1. NAS запрашивает логин и пароль.
2. NAS посылает access-request пакет Radius-серверу. Access-request пакет содержит всю необходимую информацию для аутентификации (как правило, это логин, пароль, телефонный номер).
3. Radius проверяет в базе данных, существует ли пользователь vasya и совпадает ли пароль с предложенным. Дополнительно, Radius может проверить различные условия, например телефон, с которого звонит vasya, время, и т.д. Если все условия выполнены, Radius посылает NAS’у access-accept, если нет - то access-reject.
Далее начинается процесс авторизации. Radius передает NAS’у дополнительные параметры, например, IP-адрес, который нужно присвоить клиенту.
аккаунтинг
Радиус сохраняет информацию о трафике, которую передает ему NAS, о времени пользователя online, и д.р. Вот не полный список аккаунтиг-атрибутов:
- User-Name;
- NAS-IP-Address;
- NAS-Port;
- Service-Type;
- Framed-Protocol;
- Framed-IP-Address;
- Calling-Station-ID;
- Acct-Input-Octets;
- Acct-Output-Octets;
- Acct-Session-Time.
Основной проблемой первых имплеминтаций Radius было то, что accountnig-информация отправлялась только в конце сессии. Для обхода этой проблемы были придуманы так называемые alive-пакеты. В начале сессии Radius передает NAS’у параметр Acct-Interim-Interval, в котором указывается, как часто посылать alive-пакеты. В Alive-пакетах содержится актуальное обновление аккаунтинговой информации. Хочу отметить, что период отправки alive-пакетов может задаваться на NAS’e.
В результате, сессию можно представить в следующем виде:
Call - access-request - access-accept - acct-request - acct-reply - alive - ... - alive - end of call
Или вот так:
Start - Alive - ... - Alive - Stop
Хочу так же отметить, что у Radius’a есть один большой недостаток - он очень легко может пропустить пакет. В первую очередь это обусловлено тем, что Radius работает по UDP. Во вторую очередь это может быть связано с высокой загрузкой сервера. В случае утери alive-пакета ничего страшного не происходит - ведь со следующим alive-пакетом (или со stop-пакетом) придут реальные значения счетчиков. Но в случае утери Start- или Stop- записи происходит страшное, и мы уже не можем так просто анализировать аккаунтинговую информацию. Есть два решения этой проблемы. Первое - это увеличение надежности канала связи между NAS’ом и Radius-сервером и закупка сверхмощного оборудования; второе заключается в написании расширения дополнительной логики к radius-серверу (модуля биллинга). Возможны другие решения, например написание скрипта, который будет запускаться по приходу аккаунтиг-пакетов и анализировать текущую сессию. Но это решение гораздо более ресурсоемко. Остановимся на втором.
К счастью, разработчики бесплатного программного обеспечения уже подумали за нас, и нам остается взять почти готовое. Речь идет о проекте freenibs, основную ветку которого можно загрузить по адресу nibs.net.ua. Существует несколько веток этого ПО, все ссылки на их сайты можно найти на форуме.
FreeNIBS
FreeNIBS - это плагин для freeradius (www.freeradius.org). Достаточно подробная документация по настройке есть в документации freenibs. Хочу только отметить, что на данный момент установка freenibs - процесс достаточно творческий, и для реального использования в продакшн нужно исправить несколько ошибок в коде freenibs, которые приводят к ошибкам в логике и увеличению нагрузки на сервер. На форуме вы сможете найти патчи, в которых исправляются некоторые из этих ошибок (и, как принято, добавляются новые). Но в целом, после месяца обработки напильником, freenibs успешно используется мной в качестве биллинга на одном из беларуских провайдеров.
ugenka.
Сетевые решения. Статья была опубликована в номере 11 за 2005 год в рубрике sysadmin