развертывание тарифицируемого доступа в интернет с использованием 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.


Сетевые решения. Статья была опубликована в номере 11 за 2005 год в рубрике sysadmin

©1999-2024 Сетевые решения