Часто при использовании FreeBSD в качестве шлюза совместного доступа в Интернет необходимо вести учет трафика для различных нужд. Такая необходимость есть как у больших, так и у малых организаций и иногда у частных лиц. Конечно, можно и применять proxy сервер и это даже удобней! Благодаря таким системам как SCT или другим написанным добрыми людьми. Однако, если сервер является шлюзом с NAT или он создает туннели для передачи шифрованной информации, или распределяет доступ к WEB-серверам. Идеальным в таком случае будет наличие системы считающей трафик на основном шлюзе и на proxy сервере, который дает доступ в Интернет пользователям.
Предлагаю для учета трафика на шлюзе с помощью ipfw свой скрипт на Perl.
Положительные стороны:
1) Использование mySQL. Использование СУБД делает удобным дальнейшую обработку информации. И удобство доступа и хранения mySQL обеспечивает, так же как и безопасность.
2) Стабильность работы скрипта. Учет трафика корректно происходит после аварийного отключения сервера, при добавлении правил. При рестарте системы или фаервола. При изменении какого-либо из правила, оно автоматически регистрируется в системе как новое и для него с этого момента тоже считается трафик, однако вся информация по старому правилу тоже хранится в базе. Если СУБД временно не доступна, то это не станет критическим обстоятельством потери информации относительно трафика.
3) Доступ к статистике через WEB-интерфейс. (еще не доделал, некогда - сессия
4) Простота и доступность системы. Многие и сами бы написали подобный скрипт, но быстрее переделать этот под свои нужды ;-)
5) Минимум программного обеспечения.
На типовом сервере (у меня под FreeBSD-7.0) должно быть:
# pkg_info
bash-3.2.25 The GNU Project's Bourne Again SHell
gettext-0.16.1_3 GNU gettext package
glib-2.14.2 Some useful routines of C programming (current stable versi
gmake-3.81_2 GNU version of 'make' utility
libiconv-1.11_1 A character set conversion library
libtool-1.5.24 Generic shared library support script
mc-4.6.1_6 Midnight Commander, a free Norton Commander Clone
mysql-client-4.1.22 Multithreaded SQL database (client)
mysql-server-4.1.22 Multithreaded SQL database (server)
p5-DBD-mysql41-4.006 MySQL 4.1 driver for the Perl5 Database Interface (DBI)
p5-DBI-1.60.1 The perl5 Database Interface. Required for DBD::* modules
p5-Storable-2.18 Persistency for perl data structures
pcre-7.4 Perl Compatible Regular Expressions library
perl-5.8.8_1 Practical Extraction and Report Language
pkg-config-0.22_1 A utility to retrieve information about installed libraries
Если вы планирете использовать WEB-интерфейс для анализа данных статистики тога еще необходимо поставить и настроить:
apache-1.3.41
ну и все PHPшное добро.. я в веб-прграммировании perl не использую.
И еще одна пересборка ядра, с минимумом дополнительных опций:
options IPFIREWALL
options IPDIVERT
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
В тонкости установки ПО углубляться не стану. Описаний этого процесса полно!
Так же рассчитываю на то, что читатель знает как настраивается ipfw и nat.
===========2. Установка.===========
Создаем базу ipfw_stat
Таблица statistic собственно и содержит все записи по статистике
CREATE TABLE `statistic` (
`id` int(8) NOT NULL auto_increment,
`time` time default NULL,
`date` date default NULL,
`id_law` int(5) default NULL,
`traffic` int(8) default NULL,
`pac` int(8) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
поле 'pac' необязательно, его можно убрать (ВАЖНО! не забудьте тогда поправить скрипт)
Таблица law содержит правила ipfw и коменты к ним (непосредственно из ipfw.conf)
и ваши, которые вы бы хотели видеть скажем через WEB-интерфейс
CREATE TABLE `law` (
`id` int(5) NOT NULL auto_increment,
`contents` char(100) NOT NULL default '',
`label` char(100) default NULL,
`about` char(100) default NULL,
PRIMARY KEY (`id`,`contents`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
Необходимо сделать двух пользователей для статистики. Все права на чтение и редактирование
других баз обязательно у них заберите.
1) statist_admin - его надо наделить неущербными правами на ipfw_stat (минимум select, update)
2) statist_look - этому оставьте права только на select из ipfw_stat
Как создавать пользователей и разграничивать их права в mySQL вы можете найти в рунете.
Рекомендую не использовать одного пользователя с правами на все, а всетаки создать отдельных
и даже с учетом хостов.
Возможно только сразу для простоты сделать себе одного пользователя - администратора.
GRANT ALL PRIVILEGES ON *.* TO admin@"<ip вашего ПК>" IDENTIFIED BY 'password' WITH GRANT OPTION;
С помощью удаленного администрирования графическими средствами (SQLyog Enterprise например)
удобней расставлять права.
Ну и пароль на root у mySQL тоже рекомендую поменять на сервере.
set password for 'root'@'localhost' = password('password');
После расстановке прав, не забудте выполнить FLUSH PRIVILEGES;
Из-за того, что скрипт выбирает комментарии из конфигурационного файла ipfw
есть определенные рекомендации:
1) не оставляйте строчки с закомментированными правилами
2) не пишите комментарии в несколько строчек, пишите их сразу за правилом
(Можете, конечно, исправить все по своему усмотрению)
Вот примерно такое содержание части конфа с skipto позволит скрипту корректно отрабатывать:
add 14 skipto 20 tcp from me 22 to any xmit le0 #Out ssh
add 15 skipto 20 icmp from any to any via le0 #all ICMP
add 17 skipto 20 udp from any 53 to me via le0 #In dns
add 18 skipto 20 tcp from any to me 22 via le0 #In ssh
add 19 skipto 20 tcp from any to me 3306 via le0 #In mySQL
add 20 skipto 20 tcp from me 3306 to any xmit le0 #Out mySQL
Теперь скопируем скрипт на сервер и настроем его.
Рекомендуемое для него место скажем тут: /usr/scripts/ipfw_count.pl
Выставим ему права, пусть он будет вот такой:
# ls -l /usr/scripts/ipfw_count.pl
-rwx------ 1 root wheel /usr/scripts/ipfw_count.pl
Откроем и зададим несколько параметров.
#=========options============
$enable=0; Опция выставляющее использование скрипта. 0 – отключен. Пока оставим выключенным
$base = "ipfw_stat"; Название БД
$host="localhost:3306"; Хост и порт
$user="statist_admin"; Пользователь mySQL
$pass="*******"; его пароль
$logfile="/var/log/ipfw_stat.log"; Файл в котрорый логируются ошибки
$conf="/etc/ipfw.conf"; Конфиг вашего ipfw
$show_tmp = "/var/log/ipfw.show.log"; Этот файл нжен для работы скрипта
$last_check_file = "/var/log/ipfw.show"; и этот тоже
#===========================
Теперь самое время создать запись в crontab, чтобы система периодически запускала скрипт
*/3 * * * * root /usr/scripts/ipfw_count.pl
периодичность рекомендую от 2 до 5 минут.
Все готово для начала эксплуатации
теперерь обнуляем счетчик трафика /etc/rc.d/ipfw restart
и правим в скрипте $enable=0; на $enable=1; Рекомендую его запустить вручную первый раз.
Все! Сваливание статистики началось! =)
Сам скрипт и еще кое что к нему тут: http://slil.ru/25824479
p.s. Строго не судите! Писал себе - меня устраивает. Просто нужда в решении такой задачи часто встречается у пользователей нашего любимого FreeBSD. Вот решил оформить как статейку для друзей. Ну для тех, кто тут почитает
Если кто-то затестит - пишите тут.