Stargazer
ПРИМЕР НАСТРОЙКИ СЕРВЕРА ПОД FreeBSD

Дано:

Имеется пользовательская сеть, один сегмент, 192.168.10.0/24. Роутер с установленным stargazer-ом. Сервер имеет связь с внешним миром и сервером, на котором находится музыкальный и видео архивы.

Серврер имеет три сетевых интерфейса (сетевые карты 3COM):

  • xl0, 192.168.10.0/24, к нему подключены клиенты
  • xl1, 192.168.30.0/24, через него происходит выход во внешний мир. На этом же интерфейсе производится маскарадинг
  • xl2, 192.168.20.0/24, к нему подключен архив с музыкой и фильмами
Ниже дана схема этого сервера:

Городские ресурсы состоят из 4-х подсетей:

  • 195.248.160.0/19
  • 212.86.224.0/19
  • 213.227.192.0/18
  • 217.24.160.0/20

Требуется:

Необходимо настроить сервер таким образом:

  1. Организовать подсчет локального трафика
  2. Организовать подсчет городского трафика
  3. Организовать подсчет мирового(прочего) трафика
  4. Настроить доступ пользователям так, что бы они не авторизовавшись не могли попасть в интернет, внутренние ресурсы, также, должны быть недоступны
  5. Пользователи всегда, независимо от того, авторизованы они или нет, могли пинговать сервер (для нужд диагностики)
  6. С клиентской машины с адресом 192.168.10.18 настроить доступ по ssh на сервер при отсутствии авторизатции. Это домашняя машина админа и ему бывает нужно что-то сделать на сервере не имея авторизации
  7. В офисе расположена машина с адресом 192.168.10.2, настроить для нее доступ по ssh на сервер при отсутствии авторизатции.
  8. Доступ конфигуратором сделать возможным только с хостов 192.168.10.2 и 192.168.10.18
Решение:

Первое что нужно сделать, это определится с правилами подсчета трафика.

Будем считать, что:

  • направлекние №0 - локальный трафик (DIR0)
  • направлекние №1 - городской трафик (DIR1)
  • направлекние №2 - мировой трафик (DIR2)
rules

Файл /usr/local/stargazer/etc/rules:

# Локальные ресурсы
ALL 192.168.10.0/24 DIR0

# Трафик на роутер
ALL 192.168.20.1 DIR0
ALL 192.168.30.1 DIR0

# Городской трафик
ALL 195.248.160.0/19 DIR1
ALL 212.86.224.0/19 DIR1
ALL 213.227.192.0/18 DIR1
ALL 217.24.160.0/20 DIR1

# Пинг
ICMP 0.0.0.0/0 NULL

# Мир
ALL 0.0.0.0/0 DIR2

Настройка фаервола

Будем использовать стандартный пакетный фильтр для FreeBSD ipfw.
Назовем этот файл ipfw.sh, сделаем его исполняемым и разместим в директории /usr/local/etc/rc.d

# Определим основные переменные # int_if, serv_if, ext_if – названия интерфейсов, к которым
# подключены соответствующие сети – пользовательская, серверная, внешняя.

#!/bin/sh
fwcmd="/sbin/ipfw"
natdcmd="/sbin/natd"
int_if="xl0"
serv_if="xl1"
ext_if="xl2"

Сбрасываем правила ipfw
${fwcmd} -f flush

# Задаем маскарадинг пакетов из пользовательской сети во внешнюю сеть
# опции маскарадинга
# -s для правильной работы таких протоколов как FTP, IRC, DCC
# -m пытаться использовать те же номера портов, которые имеют
# исходящие пакеты. (короче нужно для правильной работы таких протоколов как RPC)
# -u использовать маскарадинг только для немаршрутизируемых
# адресов (192.168.0.0/16 172.16.0.0/12 10.0.0.0/8)
# -a использовать данные IP адрес для макарадинга пакетов.
${natdcmd} -s -m -u -a 192.168.30.1

# Разрешаем ходить ICMP пакетам
${fwcmd} add 10 allow icmp from any to any

# Следующие правила будут блокировать лубой исходящий
# трафик из внутренних сетей во внешние с адресами получателя
# из немаршрутизируемого диапазона (как правило это трафик
# генерирующийся вирусами, выпускать который наружу не
# рекомендуется, что бы не загружать внешний канал).
${fwcmd} add 304 deny ip from any to 192.168.0.0/16 out via ${ext_if}
${fwcmd} add 305 deny ip from any to 10.0.0.0/16 out via ${ext_if}
${fwcmd} add 306 deny ip from any to 172.16.0.0/12 out via ${ext_if}

# Следующие правила можно использовать для блокирования
# использования различных прокси серверов в городском
# сегменте сети
${fwcmd} add 307 deny log tcp from any to proxy.alkar.net 8080 via ${int_if}
# и т.д

# Следующие правила разрешают конектиться клиентам к серверу
# stargazer на порт 8888 на котором он слушает клиентские соединения
${fwcmd} add 308 allow udp from any to 192.168.10.1 8888 via ${int_if}
${fwcmd} add 309 allow udp from 192.168.10.1 to any via ${int_if}

# Следующие правила разрешают машинам с адресами 192.168.10.2 и
# 192.168.10.18 подключаться к роутеру по протоколу ssh без
# подключения клиентской программы.
${fwcmd} add 310 allow tcp from 192.168.10.2 to 192.168.10.1 22 via ${int_if}
${fwcmd} add 311 allow tcp from 192.168.10.18 to 192.168.10.1 22 via ${int_if}
${fwcmd} add 312 allow tcp from 192.168.10.1 to any via ${int_if}

# Блокируем все остальные клиентские запросы к роутеру
${fwcmd} add 320 deny log ip from 192.168.10.0/24 to 192.168.10.1 via ${int_if}
${fwcmd} add 321 deny log ip from 192.168.10.0/24 to 192.168.20.1 via ${int_if}
${fwcmd} add 322 deny log ip from 192.168.10.0/24 to 192.168.30.1 via ${int_if}

# Здесь оставляем окно в нумерации для исполнения скриптов юзеров

# Следующее правило определяет что все пакеты проходящие через
# внешний сетевой интерфейс направленный во внешнюю сеть будут
# попадать в правило маскарадинга, описанное выше.
${fwcmd} add 50024 divert natd all from any to any via ${ext_if}

# Следующие правила разрешают роутеру соединяться с использованием
# протокола tcp с внешними сетями.
${fwcmd} add 50029 allow tcp from any to any out via ${ext_if} setup
${fwcmd} add 50030 allow tcp from any to any via ${ext_if} established

# Следующие правила разрешают роутеру соединяться с использованием
# протокола udp с внешними сетями, а также разрешают прохождение
# ДНС трафика через роутер
${fwcmd} add 50031 allow udp from any to any out via ${ext_if}
${fwcmd} add 50032 allow udp from any 53 to any in via ${ext_if}

# Следующее правило разрешает конектиться к роутеру по протоколу
# ssh из внешней сети
${fwcmd} add 50033 allow tcp from any to 192.168.30.1 22 via ${ext_if}

# Далее идет запрещающее правило для всего остального
# трафика (т.е. схема файрвола – все что не разрешено
# явно – то запрещено)
$fwcmd add 65534 deny log ip from any to any

После того как ipfw настроен необходимо настроить скрипты OnConnect и OnDisconnect. Для этого мы в нумерации правил ipfw оставили диапазон номеров который будут использовать скрипты OnConnect и OnDisconnect , это будут номера начиная с 310 по 50000.

OnConnect

fwcmd="/sbin/ipfw"
int_if="xl0"

ip=$2
login=$1
id=$4

# id - уникальный целочисленный идентификатор пользователя
# принимает значений от 0 до максимального кол-ва пользователей

${fwcmd} add `expr $id '*' 10 + 29000` fwd 127.0.0.1,3128 tcp from $ip to any 80 via ${int_if}
${fwcmd} add `expr $id '*' 10 + 29001` allow ip from $ip to any via ${int_if}

echo "connect $login " >> /usr/local/stargazer/var/log/connect.log

OnDisconnect

fwcmd="/sbin/ipfw"

id=$4

${fwcmd} delete `expr $id '*' 20 + 29000`
${fwcmd} delete `expr $id '*' 20 + 29001`

echo "disconnect $1" >> /usr/local/stargazer/var/log/connect.log

OnDisconnect

fwcmd="/sbin/ipfw"

id=$4

${fwcmd} delete `expr $id '*' 20 + 29000`
${fwcmd} delete `expr $id '*' 20 + 29001`

echo "disconnect $1" >> /usr/local/stargazer/var/log/connect.log

Теперь настраиваем конфигурацию Stargazer.

stargazer.conf

# Имя файла в котором определяются правила подсчета трафика
rules=/usr/local/stargazer/etc/rules

# Рабочая директория сервере, тут содержатся данный о тарифах, изерах и админах
WorkDir=/usr/local/stargazer/var

# Имя лог файла куда пушутся события
LogFile=/usr/local/stargazer/var/log/stargazer.log

# Если юзер в течение UserTimeout секунд не подает признаков жизни,
# сервер отключит его (естественно, если клиент был подключен до этого)
UserTimeout=120

# Время через которое сервер повторяет проверку того, жив ли клиент. Также это время
# через которое у клиента обновляется его статитстика. UserDelay должно быть в
# 3...10 раз меньше чем UserTimeout
UserDelay=15

# Эта опция действительна только для сервера работающего со вторым типом тарифных планов
# Она определяет что будет передаватся программе InetAccess от сервера
# FreeMb = 0 - кол-во бесплатных мегабайт в пресчете на цену нулевого направления
# FreeMb = 1 - кол-во бесплатных мегабайт в пресчете на цену первого направления
# FreeMb = 2 - кол-во бесплатных мегабайт в пресчете на цену второго направления
# .................... # FreeMb = 9 - кол-во бесплатных мегабайт в пресчете на цену девятого направления
# FreeMb = cash - кол-во денег на которые юзер может бесплатно качать
# FreeMb = none - ничего не передавать
FreeMb=2

# Время через которое пишется детальная статистика
# возможные значения 3, 2, 1, 1/2, 1/4, 1/6
# 3 - раз в три часа, 1 - раз в чаc, 1/2 - раз в пол часа, 1/6 - раз в 10 мин
StatTime=1/6

# Номер порта по которому сервер слушает обращения конфигуратора
adminPort=8888

# Номер порта по которому сервер ожидает обращения авторизатора
userPort=8888

# Максимальное кол-во юзеров. Эта величина влияет на кол-во # памяти необходимой серверу
MaxUsers=1000

# for FreeBSD only
# Имя интерфейсов на которых нужно вести подсчет трафика
iface=xl0,xl1,xl2

# Имена направлений. Пустые имена не будут отображаться
# ни в авторизаторе, ни в конфигураторе
DirName0=Local Network
DirName1=City Network
DirName2=World Network
DirName3=
DirName4=
DirName5=
DirName6=
DirName7=
DirName8=
DirName9=

# Опция определяющая менять ли местами upload и download
TurnTraff=no

#Опция определяющая обнулять трафик в конце месяца или нет
ResetTraff=yes

# "Разамазанное" снятие абонплаты. Каждый день
# 1/30 (1/31, 12/28) часть абонплаты
SpreadFee=no

# День снятия абонплаты
DayFee=1

# День, в который происходит обнуление счетчиков трафика, и
# перехода на новый тариф
DayResetTraff=1

# Владелец, группа и права доступа на файлы
# статистики у пользователей
StatOwner=root
StatGroup=stg_stat
StatMode=644

# Владелец, группа и права доступа на файлы
# конфигурации у пользователей
ConfOwner=root
ConfGroup=root
ConfMode=600

# Владелец, группа и права доступа на логи
# у пользователей
UserLogOwner=root
UserLogGroup=root
UserLogMode=644

# Разрешение на доступ конфигуратором
AdminOrder=allow,deny
AdminAllowFrom=192.168.10.2 192.168.10.18
AdminDenyFrom=all

# Разрешение на доступ авторизатором
UserOrder=allow,deny
UserAllowFrom=192.168.10.0/24
UserDenyFrom=all

# Запрет на слишком частые обращения на порт авторизатора
FloodControl=yes

Теперь помещаем в каталог /usr/local/etc/rc.d стартовый скрипт старгейзера stargazer.sh Содержание скрипта stargazer.sh #!/bin/sh
/usr/local/stargazer/bin/stargazer /usr/local/stargazer/etc/
В данном примере, настроечные файлы и БД сервера расположены, не в
/etc
/var
а в
/usr/local/stargazer/etc
/usr/local/stargazer/var
СОДЕРЖАНИЕ