ЕВГЕНИЙ ЛИТВИНЕНКО
Организуем доступ в Интернет с использованием биллинговой системы FreeNIBS
Одна из ваших основных задач – предоставить пользователям возможность доступа в Интернет из локальной сети. Традиционно используемый для этой цели прокси-сервер имеет некоторые недостатки, которых нет у системы, предлагаемой вам сегодня.
Сегодня мы создадим систему, которая обеспечит пользователям локальной сети доступ в Интернет. Для передачи данных внутри сети будем использовать технологию VPN. Подсчет интернет-трафика ведется с помощью биллинговой системы FreeNIBS. Настройка производилась в популярном российском дистрибутиве ALT Linux Master 2.4.
Напомню, что аббревиатура VPN расшифровывается как Virtual Private Network – виртуальная частная сеть. Суть этой технологии заключается в том, что при подключении к VPN-серверу при помощи специального программного обеспечения поверх общедоступной сети в уже установленном соединении организуется зашифрованный канал, через который передается интернет-трафик.
Одним из вариантов применения этой технологии является предоставление компьютерам локальной сети выхода в Интернет. То есть на сервере, имеющем выход в Интернет, работает служба, которая при подключении к ней клиентского компьютера предоставляет ему доступ к глобальной сети.
Использование данной технологии предоставляет несколько преимуществ, которых не имеет аналогичная система, построенная с использованием прокси-сервера. Во-первых, весь передаваемый трафик шифруется, что позволяет избежать перехвата данных в локальной сети. Во-вторых, используя прокси-сервер, очень трудно организовать корректное отключение пользователя при превышении лимита на трафик. Это связано с тем, что подсчет трафика ведется с использованием протоколов прокси-сервера, в которые информация о трафике записывается только по окончании скачивания файла. То есть если у пользователя до превышения лимита осталось 2 Мб, а он решит закачать файл размером 10 Мб, то прокси-сервер позволит это сделать. Главное, чтобы не оборвалось соединение.
Настройка сервера VPN
Сети VPN используют протокол PPTP (Point-to-Point Tunneling Protocol), который реализует пакет pptpd. Компиляция и установка пакета описаны в разделе «Пересборка пакетов». Аналогично собирается и устанавливается пакет pppd, реализующий протокол связи PPP (Point-to-Point Protocol). PPTP использует PPP при установке соединения с клиентским компьютером. Сервис pppd использует конфигурационный файл /etc/ppp/options. Демон – /etc/pptpd.conf и /etc/ppp/options.pptpd (последний указывается непосредственно в pptpd.conf и может быть изменён на файл с другим именем).
Сперва настраиваем и тестируем связку pptpd+pppd в «чистом» виде, используя для авторизации пользователей данные, хранящиеся в /etc/ppp/chap-secrets.
В файле /etc/pptpd.conf дописываются следующие строки:
// предельная скорость соединения, бит/с
speed 115200
// подключаем файл с параметрами
option /etc/ppp/options.pptpd
// включаем отладочный режим
debug
// IP-адрес на стороне сервера. Используется для установки двухточечного соединения
localip 192.168.100.1
// IP-адрес на стороне клиента. Указывается один адрес или диапазон адресов, один из которых выдается клиентскому
// компьютеру при установке VPN-соединения. В данном примере выделяется диапазон адресов: 192.168.101.1-192.168.101.100
remoteip 192.168.101.1-100
Настройки VPN-подключения описаны в файле /etc/ppp/options.pptpd.
Для VPN-соединения, использующего MPPE-шифрование, необходимо отключить алгоритмы сжатия передаваемых данных:
nobsdcomp
nodeflate
Pppd поддерживает несколько протоколов аутентификации. Это PAP, CHAP, MSCHAP. Протоколы семейства CHAP более надежны, нежели PAP, так как PAP передает пароль по сети в открытом виде, а CHAP – только его хеш-сумму. Клиентами Windows используется протокол авторизации MSCHAP и его обновленная версия MSCHAP-v2. Необходимо отключить ненужные протоколы и разрешить использование только протоколов MSCHAP/MSCHAP-v2:
refuse-pap
refuse-chap
require-mschap
require-mschapv2
Всегда существует опасность перехвата данных в локальной сети. Поэтому в целях безопасности устанавливаем принудительное шифрование трафика:
require-mppe
Для проверки работоспособности VPN-сервера создаем тестовую учетную запись. Пользовательские данные хранятся в файле /etc/ppp/chap-secrets в следующем формате:
имя_пользователя имя_сервера пароль IP-адрес
Например:
test * 123 192.168.101.1
Имя сервера, как правило, не указывают. Вместо него ставится символ «*».
Теперь можно подключаться к серверу. Если возникли какие-то проблемы – изучайте протоколы.
После того как заработала связка pptpd+pppd, настраивается система авторизации FreeRadius и система подсчета трафика FreeNIBS.
Настройка биллинговой системы
Сама по себе вышесозданная система не обладает гибкостью. А перед системным администратором часто стоит задача – распределить интернет-трафик между пользователями. Хорошим тоном является выделение для пользователя фиксированного количества мегабайт интернет-трафика в месяц. Отсюда вытекает необходимость вести статистику для каждого пользователя, которая содержала бы количество принятых и переданных байт за одно подключение и целиком за месяц. Все эти возможности реализует пакет FreeNIBS (Neon internet Billing System for FreeRadius). FreeNIBS является надстройкой для пакета FreeRadius. FreeRadius – это одна из реализаций протокола RADIUS (Remote Authentication Dial In User Service), который служит для авторизации удаленных пользователей. Первоначально протокол разрабатывался для больших модемных пулов, но реализация получилась настолько удачной, что сейчас он используется не только для DialUP-подключений, но и для IP-телефонии и организации доступа в VPN-сети. FreeNIBS использует FreeRadius для авторизации пользователей.
Пакет собирается из исходников. В результате компиляции получается несколько пакетов. Основными являются freenibs-0.0.3-0.9.3-alt4.i686.rpm и freeradius-0.9.3-alt4.i686.rpm. Остальные пакеты добавляют в программу поддержку различных баз данных и скриптовых языков. В данном проекте используется сервер баз данных MySQL, поэтому дополнительно устанавливается пакет freeradius-mysql-0.9.3-alt4.i686.rpm.
FreeRadius состоит из двух частей – клиента и сервера. Сервер реализует протокол RADIUS. Клиентом является сервер доступа (NAS – Network Access Server), в данном случае это VPN-сервер. Для того чтобы pptp взаимодействовал с Radius-сервером, в файл /etc/ppp/options.pptpd добавляем следующие строки:
plugin radius.so
plugin radattr.so
В файле /etc/raddb/clients.conf перечисляются все клиенты, которые будут обращаться к Radius-серверу. Так как в нашем случае он один, то файл содержит только следующее:
client 127.0.0.1 {
secret = testing123
shortname = localhost
nastype = other
}
Здесь говорится, что клиент будет обращаться с локальной машины (адрес 127.0.0.1). Параметр secret содержит ключевое слово, которое позволяет серверу идентифицировать отдельных клиентов. Параметр shortname содержит имя (краткое) хоста клиента, а в параметре nastype хранится тип клиента. В данном случае он не совпадает со стандартными, поэтому там указывается значение other.
Настройки клиента RADIUS хранятся в каталоге /etc/radiusclient. А записи о сервере хранятся в файле /etc/radiusclient/servers, где необходимо лишь записать адрес сервера и ключевое слово:
localhost testing123
Для хранения пользовательских аккаунтов и статистики используется база данных MySQL. Параметры для доступа к базе содержатся в файле /etc/raddb/nibs.conf. Редактируются следующие строки:
server = "localhost"
port = "3306"
login = "freenibs"
password = "password"
Здесь стоит упомянуть, что FreeNIBS может работать с пользователями в двух режимах – простом и профессиональном. В простом режиме для всех пользователей определенной группы используются единые настройки группы. В профессиональном режиме у каждого пользователя могут быть индивидуальные настройки.
Далее необходимо настроить саму базу данных. В пакете исходных текстов в каталоге freeradius/src/modules/rlm_nibs/drivers/rlm_nibs_mysql (здесь и далее если не указан абсолютный путь, то речь идёт об исходных текстах пакета FreeNIBS) находятся файлы с описанием структур таблиц. Файл nibs_mysql.sql содержит набор SQL-команд для создания базы данных freenibs и таблиц в ней. Файл nibs_mysql_prof_add.sql содержит запросы, модифицирующие ранее созданные таблицы, для их использования в профессиональном режиме.
В файле nibs_mysql.sql редактируется строка с паролем для пользователя базы данных freenibs. После этого запросы необходимо передать MySQL. Это делается следующими командами:
#mysql -u root -p < nibs_mysql.sql
#mysql -u root -p < nibs_mysql_prof_add.sql
Чтобы включить профессиональный режим, необходимо, помимо модификации таблиц, раскомментировать следующую строку в файле nibs.conf (и не забыть перезапустить FreeRadius, если он уже работает):
authorize_query_prof = "SELECT tos, do_with_tos, direction, fixed, fixed_cost, activation_time, total_time_limit,
month_time_limit, week_time_limit, day_time_limit, total_traffic_limit, month_traffic_limit, week_traffic_limit,
day_traffic_limit, total_money_limit, month_money_limit, week_money_limit, day_money_limit, login_time, huntgroup_name,
simultaneous_use, port_limit, session_timeout, idle_timeout, allowed_prefixes, no_pass, no_acct, allow_callback,
other_params FROM ${auth_table} WHERE user = "%{SQL-User-Name}""
Здесь описывается запрос к базе данных, который производится во время авторизации пользователя.
Чтобы отслеживать IP-адреса компьютеров, с которых производится подключение, в файл /etc/pptpd.conf добавляется следующая строка:
pppd /usr/sbin/call-pppd
call-pppd – это bash-скрипт, производящий запуск pppd с дополнительными параметрами, IP-адресом машины клиента и её MAC-адресом. Эта позволяет отслеживать администратору, с каких именно компьютеров производится подключение.
При превышении лимита на трафик пользователь должен быть отключен от сервера. За это отвечает специальный скрипт, путь к которому указывается в файле /etc/raddb/nibs.conf, в параметре kill_program. С пакетом FreeNIBS идет специальный скрипт для отключения пользователей, «заточенный» под протокол PPP:
kill_program = "${sbin_dir}/pppkill %{Framed-IP-Address}"
Работа с пользователями и просмотр статистики производятся через веб-интерфейс. Он предназначен для работы на виртуальном сервере. После создания виртуального хоста файлы веб-интерфейса, находящиеся в src/modules/rlm_nibs/utils/web, копируются в соответствующий каталог. Так как интерфейсов два (администрирование системы и просмотр статистики), то и виртуальных хостов соответственно будет столько же.
Необходимо отредактировать только файл include/mysql.php и прописать в нём соответствующие имя пользователя и пароль для доступа к базе данных.
Веб-интерфейс можно дорабатывать, добавляя новые возможности. В данном проекте была добавлена возможность сброса пользователей с линии на странице «Online». Для этого в существующий файл online.php была добавлена ссылка для вызова скрипта kill.php. Скрипту передается параметр – IP-адрес пользователя, которого необходимо «сбросить».
Файл kill.php содержит следующие строки:
<?php
exec("sudo /usr/sbin/pppkill $ip");
header("Location:online.php");
?>
pppkill является привилегированной командой. То есть вызвать ее можно либо пользователю root, либо с помощью утилиты sudo. Так как php-скрипты выполняются от имени пользователя apache, необходимо разрешить ему выполнять эту команду. Для этого в файле /etc/sudoers дописывается следующая строка:
apache ALL = NOPASSWD: /usr/sbin/pppkill
Теперь можно создавать пакеты и пользователей. На первых этапах рекомендуется запускать FreeRadius, не используя утилиту service, а из командной строки с параметром -X:
# radiusd -X
Запущенный таким образом FreeRadius отображает подробные логи в текущей консоли.
Настройка преобразования сетевых адресов (NAT) и фильтрации пакетов
Существуют несколько диапазонов IP-адресов, которые используются только для адресации в локальных сетях. То есть в сети Интернет эти адреса не используются. К ним относятся подсеть класса A 10.x.x.x и подсети класса C 192.168.x.x (также существует диапазон сетей класса B, но он практически не используется).
Провайдер интернет-услуг чаще всего предоставляет только один уникальный адрес, который присваивается интерфейсу, через который осуществляется доступ в сеть Интернет. Для того чтобы компьютеры локальной сети могли получить доступ в Интернет, используется технология преобразования сетевых адресов NAT (Network Address Translation). Суть этой технологии состоит в следующем – во всех пакетах, которые направлены в сеть Интернет, в заголовке локальный адрес отправителя заменяется на внешний. В ALM-системe NAT реализует утилита iptables.
Также в круг задач iptables входит фильтрация сетевых пакетов по заданным критериям. Это необходимо в целях безопасности. Используя iptables, можно оградить доступ к локальным службам извне. А также запретить прохождение локальных сетевых пакетов по внешним сетевым интерфейсам.
Фильтрацию пакетов можно организовать двумя способами. Запрещать все пакеты и разрешать только необходимые. А можно пропускать все пакеты, запрещая явно только те пакеты, которые являются нежелательными. Однако вторая политика чревата очень большими неприятностями.
Утилита iptables управляется из командной строки и имеет огромное число параметров. Для удобства администрирования создается скрипт, в котором содержатся все необходимые команды. Скрипт помещается в каталог /etc/ppp/ip-up.d. Это гарантирует запуск скрипта после соединения с сетью Интернет.
Чтобы получить возможность передачи пакетов между сетевыми интерфейсами (маршрутизация), дается следующая команда:
# echo "1" > /proc/sys/net/ipv4/ip_forward
Данная команда записывает 1 в файл, находящийся в виртуальной файловой системе /proc.
Перед использованием iptables необходимо отменить все ранее указанные правила (если таковые существовали). Для этого запускаем утилиту с ключом -F:
# iptables -F
Теперь можно приступать к созданию правил. Здесь необходимо выбрать критерии, по которым фильтруются пакеты. Чаще всего это сетевой адрес отправителя/получателя, порт и сетевой интерфейс. Для того чтобы запретить все пакеты, адресуемые извне на порт 3306 (MySQL), дается следующая команда:
# iptables -A INPUT -p tcp -s ! 192.168.0.0/16 -d 195.5.28.227 --destination-port 3306 -j DROP
Здесь:
- в параметре -p указывается протокол (tcp);
- в параметре -s указывается адрес отправителя (в данном случае все адреса, не принадлежащие подсети 192.168.0.0./16);
- в параметре -d указывается адрес получателя (здесь адрес, получаемый от провайдера при подключении);
- в параметре --destination-port указывается номер порта (3306);
- в параметре -j указываем действие, которое необходимо совершить с пакетом, который удовлетворяет описанным критериям (в данном случае уничтожить).
После того как все правила для уничтожения пакетов заданы, необходимо разрешить прохождение всех остальных пакетов:
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
Для того чтобы заработала система преобразования сетевых адресов, необходимо дать команду:
# iptables -A POSTROUTING -t nat -s $IP_REMOTE -o $PPP_MODEM -j SNAT --to-source внешний_ip_адрес
В процессе настройки было обнаружено, что операционная система Windows XP некорректно передает данные в сети VPN. Для корректной работы необходимо явно задать размер фрагментированных пакетов:
# iptables -I POSTROUTING 1 -t nat -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1024
После того как заработала система преобразования сетевых адресов – пользователи локальной сети, – получают возможность практически полноценной работы в сети Интернет. К недостаткам данной системы (точнее, это относится только к NAT) причислить невозможность работы клиентов с файлообменными p2p-сетями (например, EDonkey). Это связано с тем, что сервер файлообменной сети пытается установить прямое соединение с клиентом. Выйти из положения можно, включив форвардинг портов, которые использует p2p-клиент. В результате работы пользователи получают доступ в сеть Интернет, а администратор – гибкий инструмент управления этой системой.