Управление через FreeBSD

Материал из ASV2 manual
Перейти к: навигация, поиск

Навигация : Оглавление / Установка, настройка и запуск комплекса / Контроль за доступом в интернет



Управление доступом через 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



О терминологии

Существуют различные режимы тарификации работы клиента на компьютере:

  1. режим с открытой тарификацией
  2. блочная тарификация
  3. пакетный режим
  4. в режиме открытой тарификации возможен «доверительный» режим работы (оплата в конце работы)



О важных таблицах для управления 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 :

IPFW.GIF

В верхнем окошке можно задать шаблон для генерации правил по всем значениям из диапазона, определяемого в полях выше.

При генерации вместо значения %N% будет подставлено текущее значение переменной.

Пример работы программы для пяти машин:

IPFW2.GIF

Эти правила следует вставить в автозагрузку 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