Управление через FreeBSD
Навигация : Оглавление / Установка, настройка и запуск комплекса / Контроль за доступом в интернет
Содержание
Управление доступом через FreeBSD
Настройка доступа к FreeBSD
Доступ к серверу с FreeBSD производится через telnet (возможно ssh1 или ssh2).
Доступ требуется только программе Server.exe комплекса.
В программе Boss.exe (Настройки – Настройка работы Сервера – Закладка «FreeBSD») отредактируйте значения под ваши параметры подключения к серверу с FreeBSD.
Если Пароль для команды Su не указан, то считается, что будет прямое подключение пользователя root к серверу Unix. Обычно прямое подключение root запрещено. Для разрешение прямого коннекта root под FreeBSD требуется установка параметра:
PermitRootLogin yes
в файле /etc/ssh/sshd_config
Также для FreeBSD версий выше 5.3 в файле /etc/ssh/sshd_config пропишите:
PasswordAuthentication yes UseDNS no
О терминологии
Существуют различные режимы тарификации работы клиента на компьютере:
- режим с открытой тарификацией
- блочная тарификация
- пакетный режим
- в режиме открытой тарификации возможен «доверительный» режим работы (оплата в конце работы)
О важных таблицах для управления firewall-ом
- сompstate – основная таблица текущего состояния компьютеров клуба.
- price_list_packet – прейскурант на пакеты
- price_traffic – прейскурант на дополнительный трафик и факт включения интернета на клиенте при блочной и пакетной посадке
- Прейскурант для открытой тарификации:
- price_list_open_main
- price_list_open_date_time_tracks
- price_list_open_res
- Прейскурант для блочной тарификации:
- price_list_block_main
- price_list_ block _date_time_tracks
- price_list_ block _res
- ip_state - таблица, содержащая ip-адреса, подлежащие учету (адресов может быть больше, чем компьютеров в клубе. Например, машина администратора, офиса, охраны, сторонних организаций и т.п.)
- firewall_profiles - таблица, определяющая шаблоны правил для управления ipfw
О таблице firewall_profiles
В таблицах, которые определяют прейскурант клуба, есть поле FWProfilesID.
Это поле хранит индекс строки в таблице firewall_profiles.
Таблица firewall_profiles представляет собой данные о том, какой набор команд сбросить в firewall через telnet при наступлении особых событий, а именно: начало и окончание сессии клиента, выключение интернета при превышении трафика и прочее.
В завсисимости от режима работы, который при начале сессии выбрал клиент, в таблицу compstate в поле FWProfilesID прописывается значение из аналогичного поля выбранной таблицы прейскурантов (в строку, соответствующую номеру клиентского компьютера).
Периодически (по умолчанию раз в две секунды) сервер производит проверку таблицы compstate на предмет изменений значения поля FWProfilesID в ней. Если такое изменение обнаружено, то сервер прописывает это новое значение в поле FireWallProfileID таблицы ip_state в запись, которая соответствует ip компьютера из compstate.
Также периодически (по умолчанию раз в две секунды) сервер производит проверку таблицы ip_state на предмет несоответствия значения поля FWProfilesID и поля PrevFireWallProfileID. Если таковое обнаружено, то сервер выполнит через telnet команды по шаблону из соответствующей записи в firewall_profiles
Список шаблонов команд для firewall (под FreeBSD это ipfw) содержится в blob-столбце Template таблицы firewall_profiles.
Пример обязательной записи номер 1, которая выключает Интернет на машине клиента:
ipfw delete %N%00 ipfw add %N%00 deny ip from any to %IP% ipfw delete %N%05 ipfw delete %N%06 ipfw pipe delete %N%05 ipfw pipe delete %N%06
в ней (а также в любых других записях):
- %N% - номер записи из ip_state
- %IP% - ip адрес этой машины, который будет подставляться из
Первая строчка из примера добавляет правило, запрещающее входящий ip-трафик на машину.
Вторая, третья, четвертая и пятая строчки удаляют правила, которые обеспечивают управление полосой шейпера на машине. Откуда могут возникнуть правила? Их может прописать в ipfw профайл номер три в firewall_profiles.
Пример шаблона для включения интернета с ограниченной полосой пропускания на входящий и исходящий трафик (по умолчанию, это правило 3):
ipfw delete %N%00 ipfw delete %N%03 ipfw delete %N%04 ipfw delete %N%05 ipfw delete %N%06 ipfw pipe delete %N%05 ipfw pipe delete %N%06 ipfw pipe %N%05 config bw 10kbyte/s queue 50 ipfw add %N%05 pipe %N%05 ip from any to %IP% ipfw pipe %N%06 config bw 10kbyte/s queue 50 ipfw add %N%06 pipe %N%06 ip from %IP% to any
Первая строчка удаляет правило deny, чем включает интернет на машине в принципе.
2-5 строчки удаляют возможные предыдущие состояния шейпера
Шестая строка определяет pipe (трубу) для входящего ip-трафика и указыват полосу пропускания для неё.
Седьмая назначает этот pipe только для входящего трафика
8,9 – тоже, но только для исходящего трафика
О подсчете трафика
Принцип подсчета трафика заключается в том, что ipfw накапливает в своих правилах типа count информацию о входящем и исходящем трафике для всех ip-адресов, определенных в ip_state
Пример записи подсчета трафика для ip 192.168.0.1:
ipfw add 101 count ip from any to 192.168.0.1 via rl0 ipfw add 102 count ip from 192.168.0.1 to any via rl0
Первое правило считает весь входящий трафик, а второе – исходящий.
Для остальных машин правила должны выглядеть аналогично.
Обязательно должно соблюдаться следующее требование: входящий трафик аккумулируется в записях с номерами вида: %N%01 (в примере это 101)
А для исходящего трафика: %N%02
Также должно выполняться требование, что запись запретить интернет должна быть вида: %N%00
Если записи с таким номером нет, то server будет считать, что интернет на машине есть.
В комплект программ комплекса входит вспомогательная программа для упрощения процесса генерации записей FwRulezMaker.exe, которая помогает составить файл правил, которые будут грузиться по умолчанию при загрузке машины с FreeBSD :
В верхнем окошке можно задать шаблон для генерации правил по всем значениям из диапазона, определяемого в полях выше.
При генерации вместо значения %N% будет подставлено текущее значение переменной.
Пример работы программы для пяти машин:
Эти правила следует вставить в автозагрузку FreeBSD, чтобы они автоматом запускались на машине при загрузке.
Например, создав файл /usr/local/etc/rc.d/rulez.sh
Потом прописав для него:
сhmod a+x /usr/local/etc/rc.d/rulez.sh
Пример содержимого этого файла с правилами для ipfw (+ для работы с NAT) для пяти машин:
#!/bin/sh ipfw -f flush ipfw add 10 allow ip from 192.168.0.0/24 to 192.168.0.0/24 # разрешить всем всегда доступ к серверу КС на ip 82.138.29.59 ipfw add 12 allow ip from 82.138.29.59 to any ipfw add 13 allow ip from any to 82.138.29.59 ipfw add 14 divert natd ip from 192.168.0.0/24 to any out xmit rl1 ipfw add 15 divert natd ip from any to me in recv rl1 ipfw add 100 deny ip from any to 192.168.0.1 ipfw add 101 count ip from any to 192.168.0.1 via rl0 ipfw add 102 count ip from 192.168.0.1 to any via rl0 ipfw add 200 deny ip from any to 192.168.0.2 ipfw add 201 count ip from any to 192.168.0.2 via rl0 ipfw add 202 count ip from 192.168.0.2 to any via rl0 ipfw add 300 deny ip from any to 192.168.0.3 ipfw add 301 count ip from any to 192.168.0.3 via rl0 ipfw add 302 count ip from 192.168.0.3 to any via rl0 ipfw add 400 deny ip from any to 192.168.0.4 ipfw add 401 count ip from any to 192.168.0.4 via rl0 ipfw add 402 count ip from 192.168.0.4 to any via rl0 ipfw add 500 deny ip from any to 192.168.0.5 ipfw add 501 count ip from any to 192.168.0.5 via rl0 ipfw add 502 count ip from 192.168.0.5 to any via rl0
где:
- rl1 - внешний интерфейс
- rl0 – внутренний интерфейс
- правила 14 и 15 обеспечивают работу NAT.
Название интерфейсов можно посмотреть по команде ifconfig
Периодически сервер посылает на машину с FreeBSD по telnet команду ipfw show для получения текущего состояния счетчиков трафика для каждой машины:
ipfw show | awk '{ if ((($4=="count") && ( $3!=0 )) || ($4=="deny")) { printf $1 " " $3"\n"} }'; ipfw pipe show | awk '{ if (($1!="mask:") && ($1!="BKT") && ($1!=0)) { printf $1 " " $2 "\n" }}'
И получает ответ вида:
00101 37594494 00102 8175730 00201 19295662 00202 12312476 00301 46714841 00302 7872719 00401 118926153 00402 7325235 00501 22706842 00502 4375308 00105: 160.000 00106: 800.000 00205: 160.000 00206: 800.000 00305: 160.000 00306: 800.000 00405: 160.000 00406: 800.000 00505: 160.000 00506: 800.000
строчка 00101 показывает, сколько байт входящего трафика прошло по правилу 101, т.е. это текущий входящий трафик для первой записи в ip_state
Правило 105 показывает, сколько килобит в секунду на входящий трафик сейчас установлено для первой машины
102 и 106 – по аналогии, только для исходящего трафика
Разрабатывая поддержку управления трафиком под другие ос, например Linux, учитывайте требования, изложенные выше.
При этом вы можете в таблице профайлов писать свои производные шаблоны, соблюдая общие принципы.
Учитывайте, что вам нужно будет написать свой обработчик команды ipfw show, заменив его своим скриптом, который будет выдавать информацию о трафике строго в формате из примера выше (ddddd <value>)
В принципе, можно обойтись и без сервиса общения с Unix, если написать самостоятельно скрипт, который будет отслеживать изменения в таблице ip_state, включать-выключать интернет, в зависимости от значений в FireWallProfileID и аккумулировать дельту по трафику в IIN_COUNT, IOUT_COUNT для тарификации трафика.
Именно эти два столбца содержат текущее абсолютное значение в байтах по трафику, которое и подставляется в основную таблицу учета клуба (compstate)
Вам не нужно обнулять их при включении правил. Это сделает server.exe автоматически при начале нового сеанса. Вам следует лишь периодически добавлять в них значение трафика, который прошел за промежуток врмени, от последнего обновления.
Пример добавления 100 байт входящего и 200 исходящего трафика:
UPDATE ip_state SET IIN_COUNT= IIN_COUNT+100, IOUT_COUNT=IOUT_COUNT+200