Выход во внешние сети

Обсуждение ПО используемого нами для решения тех или иных задач (Антивирусы, движки BD, файрволлы и т.п.)
Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Выход во внешние сети

Сообщение Val » 30.10.2009 12:49

Все приведенное ниже на Linux/FreeBSD, хотя может быть частично сделано на Windows (все ПО бесплатное).
кратко
Комп - 3 интерфейса: локалка + деп, выделенная локалка для сервера достоверности, инет.
IPTables - фильтрация пакетов. Хотя бы шапочное знание IP нужно.
Например этим скриптом устанавливаются правила: пускаем входящие по всем интерфейсам по всем протоколам из локальной сети LAN_IP_RANGE и запрещаем входящие по интерфейсу eth1 по протоколу tcp. И принятые и отклоненные логируем в разные базы (--ulog-nlgroup 1 или 2, можно 32 группы)

Код: Выделить всё

...
LAN_IP_RANGE="192.168.100.0/24"
$IPTABLES -A INPUT -p ALL -s $LAN_IP_RANGE -j good_in
$IPTABLES -A INPUT -p tcp -i eth1-j bad_in
...
$IPTABLES -A good_in -i eth1 -j ULOG --ulog-nlgroup 1 --ulog-prefix "mon__in_g" --ulog-cprange 48 --ulog-qthreshold 50
$IPTABLES -A good_in -j ACCEPT
$IPTABLES -A bad_in -i eth1 -j ULOG --ulog-nlgroup 2 --ulog-prefix "mon__in_b" --ulog-cprange 48 --ulog-qthreshold 50
$IPTABLES -A bad_in -j DROP
...

Подобное делаем для цепочек INPUT, FORWARD, OUTPUT. Полный контроль, много дополнительных примочек. Например можно отслеживать PASSIVE FTP. Удачная настройка позволяет влегкую цеплять юзеров в любыми адресами к корпоративке, неограниченное количество клиентов с сервером достоверности и т.п.
http://ru.wikipedia.org/wiki/Iptables
Ulogd - логирование пакетов
Позволяет принимать данные о пакетах с IPTables и и складывать их в текстовый файл, MySQL базу и некоторые другие приемники. Т.к. правила логирования задаются в настройках IPTables, можно складывать описания пакетов только нужные (например только http или только проходящие через нужный интерфейс).
У меня: разрешенные пакеты логируются в одну базу, запрещенные, перед тем как отброситься, логируются в другую базу.
Полей хватает под любые нужды:

Код: Выделить всё

CREATE TABLE `ulog` (
  `id` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `raw_mac` VARCHAR(80) COLLATE latin1_swedish_ci DEFAULT NULL,
  `oob_time_sec` INTEGER(10) UNSIGNED DEFAULT NULL,
  `oob_time_usec` INTEGER(10) UNSIGNED DEFAULT NULL,
  `oob_prefix` VARCHAR(32) COLLATE latin1_swedish_ci DEFAULT NULL,
  `oob_mark` INTEGER(10) UNSIGNED DEFAULT NULL,
  `oob_in` VARCHAR(32) COLLATE latin1_swedish_ci DEFAULT NULL,
  `oob_out` VARCHAR(32) COLLATE latin1_swedish_ci DEFAULT NULL,
  `ip_saddr` INTEGER(10) UNSIGNED DEFAULT NULL,
  `ip_daddr` INTEGER(10) UNSIGNED DEFAULT NULL,
  `ip_protocol` TINYINT(3) UNSIGNED DEFAULT NULL,
  `ip_tos` TINYINT(3) UNSIGNED DEFAULT NULL,
  `ip_ttl` TINYINT(3) UNSIGNED DEFAULT NULL,
  `ip_totlen` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `ip_ihl` TINYINT(3) UNSIGNED DEFAULT NULL,
  `ip_csum` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `ip_id` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `ip_fragoff` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `tcp_sport` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `tcp_dport` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `tcp_seq` INTEGER(10) UNSIGNED DEFAULT NULL,
  `tcp_ackseq` INTEGER(10) UNSIGNED DEFAULT NULL,
  `tcp_window` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `tcp_urg` TINYINT(4) DEFAULT NULL,
  `tcp_urgp` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `tcp_ack` TINYINT(4) DEFAULT NULL,
  `tcp_psh` TINYINT(4) DEFAULT NULL,
  `tcp_rst` TINYINT(4) DEFAULT NULL,
  `tcp_syn` TINYINT(4) DEFAULT NULL,
  `tcp_fin` TINYINT(4) DEFAULT NULL,
  `udp_sport` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `udp_dport` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `udp_len` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `icmp_type` TINYINT(3) UNSIGNED DEFAULT NULL,
  `icmp_code` TINYINT(3) UNSIGNED DEFAULT NULL,
  `icmp_echoid` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `icmp_echoseq` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `icmp_gateway` INTEGER(10) UNSIGNED DEFAULT NULL,
  `icmp_fragmtu` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `pwsniff_user` VARCHAR(30) COLLATE latin1_swedish_ci DEFAULT NULL,
  `pwsniff_pass` VARCHAR(30) COLLATE latin1_swedish_ci DEFAULT NULL,
  `ahesp_spi` INTEGER(10) UNSIGNED DEFAULT NULL,
  `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `state` SMALLINT(6) UNSIGNED DEFAULT NULL,
  `end_timestamp` DATETIME DEFAULT NULL,
  `start_timestamp` DATETIME DEFAULT NULL,
  `username` VARCHAR(30) COLLATE latin1_swedish_ci DEFAULT NULL,
  `user_id` SMALLINT(5) UNSIGNED DEFAULT NULL,
  `client_os` VARCHAR(100) COLLATE latin1_swedish_ci DEFAULT NULL,
  `client_app` VARCHAR(255) COLLATE latin1_swedish_ci DEFAULT NULL,
  `local_time` INTEGER(10) UNSIGNED DEFAULT NULL,
  `local_hostname` VARCHAR(32) COLLATE latin1_swedish_ci DEFAULT NULL,
.............

Базу можно просматривать вручную, анализировать скриптами или использовать бесплатное ПО, которого много разного.
Например:
Webflowlog - web приложение осуществляющее отображение информации из базы Ulogd в нужном виде. Много настроек отчетов.
например отобразим что ходило с 9:00 до 9:35 по протоколу tcp с и на 62.183.67.155 (группировка и сумма длин пакетов).
настройки
wfl_1.gif

результат
wfl_2.gif

раскрытие группировки (помечено кружком на предыдущем рисунке)
wfl_3.gif
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Выход во внешние сети

Сообщение Val » 30.10.2009 13:22

Далее идем на уровень выше.
SQUID - бесплатный прокси сервер. Настроек много, функций тоже много, в моем случае это взаимодействие с контроллером домена для проверки имени-пароля и получение доменных групп и пользователей.
например пустим в асю только тех, кто состоит в доменной группе inet_icq.
...
acl addr_icq1 dst 64.12.161.0/24 64.12.24.0/24 64.12.30.0/24 205.188.153.0/24 205.188.179.0/24 64.12.200.0/24
acl inet_icq external nt_group inet_icq
acl icq_ports port 5190
http_access allow inet_icq CONNECT addr_icq1
...
и главное - все что проходит через него он логирует с нужной информацией:

Код: Выделить всё

1256892876.540    253 192.168.22.26 TCP_MISS/200 1215 GET http://www.dni.ru/export/dnilink2vz_news.html val DIRECT/83.222.2.212 -
1256892876.775    234 192.168.22.26 TCP_MISS/304 331 GET http://www.dni.ru/js/ptl.js?ts=1256403155000 val DIRECT/83.222.2.212 -
1256892877.450      2 192.168.22.26 TCP_DENIED/407 2044 GET http://www.vz.ru/inc/b/left_rian_iframe.html - NONE/- text/html
1256892877.585    809 192.168.22.26 TCP_MISS/200 5345 GET http://www.vz.ru/proxy/realty_export.xml?24604 val DIRECT/217.16.28.217 -
1256892877.611    171 192.168.22.26 TCP_MISS/200 2170 GET http://www.vz.ru/inc/b/top_730x90_inner_iframe.html?2 val DIRECT/217.16.28.217 -
1256892877.696    111 192.168.22.26 TCP_MISS/301 509 GET http://dni.ru/inc/banner-240x400.html val DIRECT/83.222.2.212 -

Сам SQUID не имеет удобной высокоуровневой системы фильтрации, точнее удобнее для этого использовать SQUIDGuard - бесплатное приложение фильтрующее запросы web. У него есть базы данных в которых содержаться домены

Код: Выделить всё

...
1000films.com
100jahre-derfilm.de
109films.ifrance.com
123MovieDownload.com
...

и urlы

Код: Выделить всё

...
01vlog.com/play.php
disney.de/DisneyKinofilme/
disney.de/DisneyVideos/
theonion.com/content/video
...

которые надо запретить/разрешить (готовые базы есть в инете).
В настройках squidGuard типа такого (локальные пользователи - откуда берется список имен - чуть позже, назначение - порно-сайты и др, разрешаем доступ к инету локальным описанным в файле default.sams везде кроме назначений перечисленных с восклицательным знаком:

Код: Выделить всё

...
src usersfu {
    userlist /etc/squid/default.sams                                    
}           
...
dest porn2 {
    domainlist porn2/domains
    urllist porn2/urls
    log porn2.log
}
...
usersfu {
      pass !porn2 !movies !music !adv !dating !socialnet !redirector !updatesites all
      redirect http://192.168.22.251/cgi-bin/squidGuard.cgi?clientaddr=%a&srcclass=%s&targetclass=%t&url=%u&clientname=%n&clientident=%i
   }


Если юзер щимится туда куда не надо, то получает:
guard_1.gif

ну и конечно, как любое порядочное свободное ПО, SquidGuard ведет логи:

Код: Выделить всё

2009-10-28 14:25:36 [26254] Request(usersfu/porn2/-) http://readme.ru/testjs.php?id=2784 192.168.22.26/- val GET
2009-10-28 15:38:22 [14050] Request(usersfu/porn2/-) http://readme.ru/informer/18662.js 192.168.22.26/- val GET
2009-10-28 15:38:30 [14050] Request(usersfu/porn2/-) http://readme.ru/testjs.php?id=2784 192.168.22.26/- val GET
2009-10-28 16:20:55 [14050] Request(usersfu/porn2/-) http://readme.ru/informer/18662.js 192.168.22.26/- val GET
2009-10-28 16:21:33 [14050] Request(usersfu/porn2/-) http://readme.ru/testjs.php?id=2784 192.168.22.26/- val GET
2009-10-28 16:48:39 [14050] Request(usersfu/porn2/-) http://readme.ru/informer/18830.js 192.168.22.26/- val GET
2009-10-28 17:12:31 [14050] Request(usersfu/porn2/-) http://readme.ru/informer/18662.js 192.168.22.26/- val GET
2009-10-28 17:46:54 [14050] Request(usersfu/porn2/-) http://readme.ru/informer/18662.js 192.168.22.26/- val GET
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Выход во внешние сети

Сообщение Val » 30.10.2009 13:42

Наверно самая важная задача - подсчет трафика юзеров и обрубание в случае превышения лимита. Существует немало связок для решения, но пока работает Sams и тестируется Netams.
Sams - web интерфейс - система учета трафика по логам Squid и обрубание тех, кто наглеет.
Вешает демона, который считает трафик по логам Squid, результаты хранит в своей базе. Настроек не шибко много, но хватает для моих нужд.
Главное окно по юзерам:
main.gif

дерево настроек:
conf.gif

отчет по файлам, которые юзер качал:
files.gif

отчет по посещенным сайтам:
sites1.gif

и еще один:
sites2.gif

Есть еще несколько отчетов, в т.ч. по всем юзерам сразу.
Разрешенных в настройках пользователей в моем случае хранит в файле /etc/squid/default.sams. При превышении лимита - имя юзера удаляется из этого файла и сбрасывается в другой (в котором запрещенные). И новые коннекты запрещенного пользователя уже не будут разрешены:
zapret.gif

Все хорошо, но, если у юзера было 10Мб остатка, он поставил на скачку 100Мб файл, то этот файл скачается в большинстве случаев, т.к. установленные коннекты рваться не будут. Для этого Sams имеет настройку на выполнение скрипта в случае превышения пользователем лимита. Я туда вешаю скрипт, который рвет все TCP коннекты. Пришлось его переделать под себя и после этого он отличается крайне странным поведением :-)
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Val
зам. председателя совета директоров
зам. председателя совета директоров
Сообщения: 2029
Зарегистрирован: 09.06.2004 08:52
Откуда: Ейск
Контактная информация:

Re: Выход во внешние сети

Сообщение Val » 30.10.2009 13:55

Netams - бесплатная система биллинга. Умеет получать данные с разных видов источников. Для некоторых источников умеет блокировать пользователя при превышении лимита. Для других - только считает.
На текущий момент у меня работает только учет. В комплекте идет утилита ulog2netflow, которая преобразует данные полученные от Ulogd в поток netflow (формат циски насколько я понял), этот поток идет на порт netasm и там подсчитывается. Имеется возможно подстичитывать по юзерам (не знаю как), адресам, группам, сетям и т.п. Например политика даст возможность подсчитать траффик в обе стороны по 110 порту (POP)

Код: Выделить всё

policy oid 08601C name forward_pop target proto tcp port 110

будем брать из логов ulogd все записи относительно сети 192.168.22.0.24, подсчитывать по ним траффик в разрезе различных политик, в случае если адрес из этой сети обменивался с кем то, а у нас не был описан, то он добавиться автоматом, имя возьмется из dns.

Код: Выделить всё

auto-units 1 type host naming by-dns group NETWORK
unit group oid 059E79 name NETWORK acct-policy forward_all
unit net oid 0FA27E name funet ip 192.168.22.0/24 auto-units 1 no-local-pass acct-policy forward_web forward_pop forward_smtp forward_imap forward_icq forward_jabber forward_other

Все результаты подсчета в базе mysql. Мы видим главное окно:
netams_main.gif

отчет по группе:
netams_group.gif

отчет по сети:
netams_net.gif
У вас нет необходимых прав для просмотра вложений в этом сообщении.


Вернуться в «ПО для наших нужд»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя

cron