воскресенье, 30 ноября 2008 г.

Установка Debian на ARM архитектуру

Установка эмулятора
sudo apt-get install qemu

Поиск initrd инсталлятора
Идём на список зеркал Дебияна http://www.debian.org/mirror/list

Вот примерно по такому пути "debian/dists/etch/main/installer-arm/current/images/rpc/netboot/" на (почти, если данных папок нету -- смените зеракало на другое) любом из зеркал вы можете скачать необходимый нам файл: initrd.gz (это собственно и есть инсталлятор)

Создаём образ жесткого диска:
qemu-img create -f qcow debian_arm_hda.img 2G

Поиска ядра под данную платформу
Вот здесь http://people.debian.org/~aurel32/arm-versatile/ требуется скачать файлик vmlinuz-2.6.18-6-versatile это ядро, специально собранное под процессор ARM versatile. Также надо стянуть файлик initrd.img-2.6.18-6-versatile, он нам понадобится после окончания установки.

Запуск инсталляции
После того, как все необходимые файлы получены, можно попробовать запустить инсталляцию.

/usr/bin/qemu-system-arm -M versatileab -kernel '/home/nrg/arm_debian/vmlinuz-2.6.18-6-versatile' -append 'root=/dev/ram' -initrd '/home/nrg/arm_debian/initrd.gz' -hda '/home/nrg/arm_debian/debian_arm_hda.img' -m 128

Инсталляция
Ну вот и всё :) Должны пойти буковки загрузки Линукс ядра и через некоторое время вы увидите обычный инсталлятор Дебияна. Внимание! Установка будет производиться по сети, так что запаситесь нормальным соединением и кучей трафика :) Также в процессе установки будет варнинг "Continue the install without loading kernel modules", с этим стоит согласиться, модули мы подсунем позже :)

Далее получим варнинг о том, что "No installable kernel was found in the defined APT sources" (т.е. ядра необходимого нам нету в пакетном менеджере), соглашаемся на установку без ядра.

Финальная настройка
После того, как установка закончена ждем ребута и во время следующей загрузки выключаем машинку.
Теперь нам надо ребутнуца в рабочем окружении:
/usr/bin/qemu-system-arm -M versatileab -kernel '/home/nrg/arm_debian/vmlinuz-2.6.18-6-versatile' -append 'root=/dev/sda1' -initrd '/home/nrg/arm_debian/initrd.img-2.6.18-6-versatile' -hda '/home/nrg/arm_debian/debian_arm_hda.img' -m 128

Как видите, мы заменили intrd инсталлятора на родной и сменили root раздел :)
Теперь запускаем систему, ждём пока отработает fsck (почему он запускается -- большой вопрос) и радуемся полноценной системе на ARM платформе %)



Проблемы
При таком подходе у меня загрузка доходила до fsck, потом зависала или ребуталась т.к. fsck не завершался успешно. Сначала попробовал -m поставить в 256, тестирование прошло почти мгновенно, но вылете по ошибки в самом конце. Вторым этапом было конвертирование образа винта из QCOW в RAW формат, как это сделать читайте здесь, потом просто меянем диск на -hda '/home/nrg/arm_debian/debian_arm_hda_raw.img'

После всего этого запускаем систему так:
/usr/bin/qemu-system-arm -M versatileab -kernel '/home/nrg/arm_debian/vmlinuz-2.6.18-6-versatile' -append 'root=/dev/sda1' -initrd '/home/nrg/arm_debian/initrd.img-2.6.18-6-versatile' -hda '/home/nrg/arm_debian/debian_arm_hda_raw.img' -m 128

Ещё очень желательно добавлять ключик -localtime при запуске, так будет время нормальное ;)

Установка родных модулей ядра

apt-get install initramfs-tools
wget http://people.debian.org/~aurel32/arm-versatile/linux-image-2.6.18-6-versatile_2.6.18.dfsg.1-18etch1+versatile_arm.deb (актуальную ссылку смотрите на сайте с патченым ядром, он указан выше; а вообще, лучше сам сайт откройте прямо с arm машинки в links)
dpkg -i linux-image-2.6.18-6-versatile_2.6.18.dfsg.1-18etch1+versatile_arm.deb



Использованные материалы
Основано на замечательной статье: http://www.goitexpert.com/entry.cfm?entry=ARM-Emulation-With-QEMU

четверг, 20 ноября 2008 г.

Vim и CentOS 5

У товарищей довольно странный подход к именованию пакетов, поэтому sudo yum install vim меня обрадовал сверхадекватным "No package vim available", неприятно, да. Правильный ответ был:
sudo yum install vim-enhanced

Установка vsftpd на Centos5

Для начала ставим пакет ФТП сервера:
sudo yum install vsftpd
Затем его запускаем:
sudo /etc/init.d/vsftpd start
Добавляем первого фтп юзера:
sudo /usr/sbin/useradd expand_backup -G ftp -m
Ставим юзеру пароль:
sudo passwd expand_backup

Ну вот, собственно, и всё :)
Единственное, хотелось бы запретить этому пользователю доступ по SSH, у кого есть идеи, как это сделать?

пятница, 14 ноября 2008 г.

HTML::Template vs Template::Alloy

Встала необходимость заменить HTML::Template на что-то более удобоваримое (кроме TT), заменили, довольны :)

Вот пример кода:
http://paste.org.ru/?l6ybly где закомменчено -- H::T

А вот пример шаблона:
http://paste.org.ru/?1aju7w где [% %] -- Template::Alloy, где монструозные -- HTML::Template.

понедельник, 10 ноября 2008 г.

Найти все используемые в проект Perl модули

Все Perl модули, от которых зависит проект можно найти командой:
grep -hiR '^use' * | sort -u

А есть более Perl way: http://search.cpan.org/~smueller/Module-ScanDeps-0.89/lib/Module/ScanDeps.pm

Ruby + gem + RubyOnRails + Debian 4 Etch

Ну для начала apt-get install ruby
ruby -v
ruby 1.8.5 (2006-08-25) [i486-linux]


Теперь нам надо поставить gem и Ruby On Rails.
Что первый, что второй есть в репозитории -- rubygems / rails
Апдейтим рельсы: sudo gem install rails

Список всех существующих пакетов довольно широк:
gem list -r

Список установленных пакетов можно посмотреть вот так:
gem list -l

Найти какой-либо пакет по имени можно так:
sudo gem query -r --name-matches часть_имени_пакета

Удаление пакета:
sudo gem uninstall progressbar

Обновление всех пакетов:
sudo gem update

А вот для просмотра документации есть просто ЗАШИБЕННЫЙ способ:
gem_server
после этого идём по адресу: ваш_хост:8808 и читаем документацию в НУ ОЧЕНЬ удобном виде :)

Ну для начала хватит :)

суббота, 8 ноября 2008 г.

Немного жизненных принципов

# Автор текста: А. Дементьев

Никогда ни о чем не жалейте вдогонку,
Если то, что случилось нельзя изменить.
Как записку из прошлого, грусть свою скомкав,
С этим прошлым порвите непрочную нить.

Никогда не жалейте о том, что случилось,
Иль о том, что случиться не может уже.
Лишь бы озеро вашей души не мутилось,
Да надежды, как птицы, парили в душе.

Не жалейте своей доброты и участья,
Если даже за все вам - усмешка в ответ.
Кто-то в гении выбился, кто-то в начальство...
Не жалейте,что вам не досталось их бед.

Никогда, никогда ни о чем не жалейте,
Поздно начали или рано ушли.
Кто-то пусть гениально играет на флейте,
Но ведь песни берет он из вашей души.

Никогда, никогда ни о чем не жалейте,
Ни потерянных дней, ни сгоревшей любви.
Пусть другой гениально играет на флейте,
Но еще гениальнее слушали вы.

среда, 5 ноября 2008 г.

Биллинг, сам код

Все файлы можно скачать вот отсюда: http://slil.ru/26302780
А теперь все файлы доступны в svn репо на Гугле, прошу:
svn checkout http://mybill.googlecode.com/svn/trunk/ mybill-read-only

Немного потюненая таблица для ulogd:
DROP TABLE IF EXISTS `ulog`;
CREATE TABLE `ulog` (
id INT UNSIGNED AUTO_INCREMENT UNIQUE,

raw_mac VARCHAR(80),

oob_time_sec INT UNSIGNED,
oob_time_usec INT UNSIGNED,
oob_prefix VARCHAR(32),
oob_mark INT UNSIGNED,
oob_in VARCHAR(32),
oob_out VARCHAR(32),

ip_saddr INT UNSIGNED,
ip_daddr INT UNSIGNED,
ip_protocol TINYINT UNSIGNED,
ip_tos TINYINT UNSIGNED,
ip_ttl TINYINT UNSIGNED,
ip_totlen SMALLINT UNSIGNED,
ip_ihl TINYINT UNSIGNED,
ip_csum SMALLINT UNSIGNED,
ip_id SMALLINT UNSIGNED,
ip_fragoff SMALLINT UNSIGNED,

tcp_sport SMALLINT UNSIGNED,
tcp_dport SMALLINT UNSIGNED,
tcp_seq INT UNSIGNED,
tcp_ackseq INT UNSIGNED,
tcp_window SMALLINT UNSIGNED,
tcp_urg TINYINT,
tcp_urgp SMALLINT UNSIGNED,
tcp_ack TINYINT,
tcp_psh TINYINT,
tcp_rst TINYINT,
tcp_syn TINYINT,
tcp_fin TINYINT,

udp_sport SMALLINT UNSIGNED,
udp_dport SMALLINT UNSIGNED,
udp_len SMALLINT UNSIGNED,

icmp_type TINYINT UNSIGNED,
icmp_code TINYINT UNSIGNED,
icmp_echoid SMALLINT UNSIGNED,
icmp_echoseq SMALLINT UNSIGNED,
icmp_gateway INT UNSIGNED,
icmp_fragmtu SMALLINT UNSIGNED,

pwsniff_user VARCHAR(30),
pwsniff_pass VARCHAR(30),

ahesp_spi INT UNSIGNED,

KEY index_id (id),
INDEX (ip_saddr),
INDEX (ip_daddr),
INDEX (oob_time_sec)
);


Модуль работы с БД DB.pm:
#!/usr/bin/perl
#===============================================================================
#
# FILE: DB.pm
#
# USAGE: use DB;
#
# DESCRIPTION: Some functions for work with db.
#
# REQUIREMENTS: DBI.
# BUGS: ---
# NOTES: ---
# AUTHOR: Pavel Odintsov (nrg),
# COMPANY:
# VERSION: 1.0
# CREATED: Mon Dev 10 23:53:08 SAMT 2007
# REVISION: ---
#===============================================================================

package DB;

use strict;
use warnings;
use Exporter 'import';
use DBI;

our @EXPORT = qw(db_connect db_disconnect vquery query );
our $VERSION = '1.0';

our %DB_CONFIG = (); # hash for db settings
my $data_base_handle = ''; # variable for database handle
my $last_error = 'no error';


# connect to db, save db handle in private module variable $data_base_handle
sub db_connect {
my $db_connect_string = "DBI:mysql:database=$DB_CONFIG{'db_name'};" .
"host=$DB_CONFIG{'db_host'};" .
"port=$DB_CONFIG{'db_port'}"; # db connection string
$data_base_handle = DBI->connect($db_connect_string, $DB_CONFIG{'db_user'}, $DB_CONFIG{'db_passwd'}, { PrintError => 1, 'RaiseError' => 1 })
}


# disconnect from db
sub db_disconnect {
if ($data_base_handle) {
return ($data_base_handle->disconnect) ? 1 : 0;
}
return 0;
}


# execute query to db with data (preferably for SELECT)
sub query {
if ($data_base_handle) {
unless ($data_base_handle && $data_base_handle->FETCH('Active') && eval { $data_base_handle->ping }) { # check db connect
db_connect() or return;
}
map {
$_->execute(@_); # execute query
@{$_->fetchall_arrayref({})};
} $data_base_handle->prepare(shift)
} else {
return;
}
}


# execute query to db without data (proferably for INSERT, DELETE, UPDATE)
sub vquery {
if ($data_base_handle) {
unless ($data_base_handle && $data_base_handle->FETCH('Active') && eval { $data_base_handle->ping }) { # check db connect
db_connect() or return;
}
my $sql_request = shift;
$data_base_handle->do($sql_request, undef, @_) if $data_base_handle; # standard DBI do request
} else {
return;
}
}

1;



Основной файл:

#!/usr/bin/perl

use strict;
use warnings;
use lib qw/./;

use DB;
use Data::Dumper;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw/:standard/;


%DB::DB_CONFIG = (
'db_name' =] 'traffic',
'db_port' =] q(),
'db_user' =] 'root',
'db_passwd' =] q(phahde4I),
'db_prefix' =] q()
);

my %dev_names = (
'00:e0:29:90:05:91:00:1c:f0:a9:78:9c:08:00 ' =] 'nrgs eeePC 900', # trailing space!!
);

# check entered date
sub check_date {
my $date = shift;

if ( $date =~ /\d{4}\-\d{1,2}\-\d{1,2}/ ) {
return 1;
}

return 0;
}

sub error_params {
print '[font color="red"]Диапазон дат указан неверно!!![/font]';
print '[/body][/html]';
exit;
}

print "Content-type: text/html\n\n";
print '[html][head][meta http-equiv="Content-Type" content="text/html; charset=utf8" /][/head][body]';

db_connect() or die "DB not avaliable\n";


my @devices = query("SELECT INET_NTOA(ip_daddr) AS dip, raw_mac FROM ulog GROUP BY ip_daddr ORDER BY ip_daddr");

my @month_dates = query("SELECT LAST_DAY(CURDATE()) AS last_day,
DATE_SUB( CURDATE(), INTERVAL DAY(CURDATE()) day) AS first_day;"); # -1 if last_day required

print [[DOC;
[a href ="/cgi-bin/bill.pl"]Статистика за сегодня[/a][br/]
[a href ="/cgi-bin/bill.pl?start_date=$month_dates[0]-]{first_day}&end_date=$month_dates[0]-]{last_day}"]Статистика за текущий месяц[/a][br/]
[form action="/cgi-bin/bill.pl" method="GET"]
Выдать статистику с [input type="text" name="start_date"] по [input type="text" name="end_date"]
[input type="submit" value="Сделать запрос"][br/]
Формат даты: YYYY-MM-DD (год-месяц-число)
Например, чтобы получить статистику за 1е января 2002года нужно ввести: 2002-01-01 2002-01-02
[/form]
[br][br]
DOC

if (@devices) {
print "В системе обнаружены следующие устройства:\n";

print '[ul]';
for (@devices) {
my $name = $dev_names{ $_-]{raw_mac} } || 'n/a';
print "[li]IP: $_-]{dip} Mac: $_-]{raw_mac} Имя: $name[/li]\n"
}
print '[/ul]';
}

my $start_date = param('start_date');
my $end_date = param('end_date');

my $posix_start_time = '';
my $posix_end_time = '';


if ( $start_date && $end_date ) {
if ( check_date($start_date) && check_date($end_date) ) {

my @period = query("SELECT UNIX_TIMESTAMP(?) AS start_period,
UNIX_TIMESTAMP(?) AS end_period", $start_date, $end_date );

if ( ($a = $period[0]-]{start_period} ) && ( $b = $period[0]-]{end_period} ) ) {
### print "[h3]Ы, параметры верны -- $a $b[/h3]";
( $posix_start_time, $posix_end_time ) = ( $a, $b );
} else {
error_params();
print 1;
}
} else {
error_params();
print 2;
}


} else {
# если диапазон не выбран, то текущий день
my @curr_day = query("SELECT UNIX_TIMESTAMP(CURDATE()) AS start_period,
UNIX_TIMESTAMP( date_add( CURDATE(), interval 1 day)) AS end_period,
CURDATE() AS cur_day,
DATE_ADD(CURDATE(), interval 1 day) AS next_day
;");


### print Dumper (\@curr_day);

( $posix_start_time, $posix_end_time ) = ( $curr_day[0]-]{start_period}, $curr_day[0]-]{end_period} );
( $start_date, $end_date ) = ($curr_day[0]-]{cur_day}, $curr_day[0]-]{next_day});

unless ($start_date && $end_date) {
print '[font color="red"]Хм, неожиданная ошибка[/font]';
print '[/body][/html]';
exit;
}
}


print "Статистика за указанный период ($start_date - $end_date):[br/][p][table]";
for (@devices) {
my @result = query("
SELECT SUM(ip_totlen) / 1024 / 1024 AS summ_traffic
FROM ulog
WHERE oob_time_sec ]= ? AND oob_time_sec [= ? AND ip_daddr = INET_ATON(?)",
$posix_start_time, $posix_end_time, $_-]{dip}
);
### print Dumper( [ '333', $posix_end_time, $posix_start_time] );
# ip_saddr
print "[tr][td]IP: $_-]{dip}[/td][td]Трафик: @{ [ $result[0]-]{summ_traffic} || 0 ] } mb[/td][/tr]\n";
}
print '[/table][/p]';

print "[/body][/html]";


Перед использованием заменить все [ на > и ] на >.

Вспомогательная инфа:

mysql -uroot -pphahde4I -Dtraffic -e 'source scheme.sql;'
http://192.168.155.51/cgi-bin/bill.pl?start_date=2002-1-1&end_date=2010-1-22
sudo tar -cjf nrgs_billing.tar.bz2 *



Собственно, сия программенция (web-интерфейс) умеет показывать через трафик, собранный демоном ulog.
Умеет показывать "за сегодня", "за текущий месяц", "за требуемый диапазон". Лицензия -- Artistic.
Пожелания, исправления, запросы фич -- приниманиются :) // хотя навряд ли кому такое нуна, но все же :)

вторник, 4 ноября 2008 г.

Веб мордочка для биллинга на Perl (Debian + ulogd-mysql): начало

Стоит задача красиво показывать сегодняшний трафик (здесь и далее -- входящий) клиентов по айпи, трафик за месяц, суммарный трафик + банить (todo) клиентов при преодолении порога по трафику.

Бан осуществляется так:
sudo iptables -A FORWARD -s 192.168.1.10 -j DROP разбанедь
sudo iptables -D FORWARD -s 192.168.1.10 -j DROP забанедь


Выборки по мак адресу производятся так:
select FROM_UNIXTIME(oob_time_sec), raw_mac, INET_NTOA(ip_saddr) as sip,INET_NTOA(ip_daddr) as dip, sum(ip_totlen) / 1024 / 1024 from ulog group by raw_mac;

Для показа нашей мордочки будем юзать lightttpd, ставим и настраиваем его мы так:

sudo apt-get install lighttpd bzip2
sudo lighty-enable-mod cgi # включаем cgi
/etc/init.d/lighttpd force-reload

Идём в папку: /usr/lib/cgi-bin
sudo vim bill.pl
и туда:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";


sudo chmod 755 bill.pl

Потом открываем http://192.168.155.51/cgi-bin/bill.pl и должны увидеть соотв-ую надпись :)
Всё, с подготовительными работами всё, продолжение читайте дальше =)

Подсчёт трафика на Debian Linux

Ставим: ulogd-mysql

Вот так выглядит дефалтовый конфиг: /etc/ulogd.conf

# Example configuration for ulogd
# $Id: ulogd.conf.in 714 2005-02-19 21:33:43Z laforge $
# Adapted to Debian by Achilleas Kotsis

[global]
######################################################################
# GLOBAL OPTIONS
######################################################################

# netlink multicast group (the same as the iptables --ulog-nlgroup param)
nlgroup=1

# logfile for status messages
logfile="/var/log/ulog/ulogd.log"

# loglevel: debug(1), info(3), notice(5), error(7) or fatal(8)
loglevel=5

# socket receive buffer size (should be at least the size of the
# in-kernel buffer (ipt_ULOG.o 'nlbufsiz' parameter)
rmem=131071

# libipulog/ulogd receive buffer size, should be > rmem
bufsize=150000

######################################################################
# PLUGIN OPTIONS
######################################################################

# We have to configure and load all the plugins we want to use

# general rules:
# 1. load the plugins _first_ from the global section
# 2. options for each plugin in seperate section below


#
# ulogd_BASE.so - interpreter plugin for basic IPv4 header fields
# you will always need this
plugin="/usr/lib/ulogd/ulogd_BASE.so"


# output plugins.
plugin="/usr/lib/ulogd/ulogd_LOGEMU.so"
#plugin="/usr/lib/ulogd/ulogd_OPRINT.so"
#plugin="/usr/lib/ulogd/ulogd_MYSQL.so"
#plugin="/usr/lib/ulogd/ulogd_PGSQL.so"
#plugin="/usr/lib/ulogd/ulogd_SQLITE3.so"
#plugin="/usr/lib/ulogd/ulogd_PCAP.so"


[LOGEMU]
file="/var/log/ulog/syslogemu.log"
sync=1

[OPRINT]
file="/var/log/ulog/pktlog.log"

[MYSQL]
table="ulog"
pass="changeme"
user="laforge"
db="ulogd"
host="localhost"

[PGSQL]
table="ulog"
schema="public"
pass="changeme"
user="postgres"
db="ulogd"
host="localhost"

[SQLITE3]
table="ulog"
db="/path/to/sqlite/db"
buffer=200

[PCAP]
file="/var/log/ulog/pcap.log"
sync=1


Вот так выглядит конфиг iptables, где пакеты отправляются в ULOG:

#!/bin/sh
INET="eth0" # internet iface
INETIP="192.168.155.51"

# сбрасываем все правила
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT

# политика по умолчанию
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

# это правило и отправляет пакеты на анализ ULOG
iptables -A FORWARD -i $INET -j ULOG --ulog-prefix "FORWARD" --ulog-cprange 0 --ulog-qthreshold 50

iptables -t nat -A POSTROUTING -o $INET -j SNAT --to-source $INETIP
echo "1" > /proc/sys/net/ipv4/ip_forward



Делаем sudo /etc/init.d/ulogd start, перезапускаем фаерволл и смотрим лог проходящих пакетов:
tail -f /var/log/ulog/syslogemu.log там должны замелькать записи :)

Теперь надо переключиться на MySQL для приёма логов, т.к. в таком виде их парсить... нет уж.
sudo apt-get install mysql-server
Потом запускаем mysql_secure_installation и выбираем новый пароль на root, пусть это будет: phahde4I

Теперь идём в /usr/share/doc/ulogd-mysql и там ищем файлик: mysql.table
Создаём БД для хранения трафика: mysqladmin -uroot -pphahde4I create traffic
Создаём таблицу во вновь созданной базе: mysql -uroot -pphahde4I -Dtraffic -e 'source mysql.table;'


Идём в настройки ulogd.conf и делаем следующее:
# output plugins.
#plugin="/usr/lib/ulogd/ulogd_LOGEMU.so"
#plugin="/usr/lib/ulogd/ulogd_OPRINT.so"
plugin="/usr/lib/ulogd/ulogd_MYSQL.so"
#plugin="/usr/lib/ulogd/ulogd_PGSQL.so"
#plugin="/usr/lib/ulogd/ulogd_SQLITE3.so"
#plugin="/usr/lib/ulogd/ulogd_PCAP.so"


и ещё правим блок:

[MYSQL]
table="ulog"
pass="phahde4I"
user="root"
db="traffic"
host="localhost"


Далее ребутаем ulogd: sudo /etc/init.d/ulogd restart и топаем в базу:
mysql -uroot -pphahde4I -Dtraffic
А там следим за ростом числа: select count(*) from ulog; -- это число перехваченных и записаных пакетов.

Итого ulogd конфиг принимает вид:

# Example configuration for ulogd
# $Id: ulogd.conf.in 714 2005-02-19 21:33:43Z laforge $
# Adapted to Debian by Achilleas Kotsis

[global]
######################################################################
# GLOBAL OPTIONS
######################################################################

# netlink multicast group (the same as the iptables --ulog-nlgroup param)
nlgroup=1

# logfile for status messages
logfile="/var/log/ulog/ulogd.log"

# loglevel: debug(1), info(3), notice(5), error(7) or fatal(8)
loglevel=5

# socket receive buffer size (should be at least the size of the
# in-kernel buffer (ipt_ULOG.o 'nlbufsiz' parameter)
rmem=131071

# libipulog/ulogd receive buffer size, should be > rmem
bufsize=150000

######################################################################
# PLUGIN OPTIONS
######################################################################

# We have to configure and load all the plugins we want to use

# general rules:
# 1. load the plugins _first_ from the global section
# 2. options for each plugin in seperate section below


#
# ulogd_BASE.so - interpreter plugin for basic IPv4 header fields
# you will always need this
plugin="/usr/lib/ulogd/ulogd_BASE.so"


# output plugins.
#plugin="/usr/lib/ulogd/ulogd_LOGEMU.so"
#plugin="/usr/lib/ulogd/ulogd_OPRINT.so"
plugin="/usr/lib/ulogd/ulogd_MYSQL.so"
#plugin="/usr/lib/ulogd/ulogd_PGSQL.so"
#plugin="/usr/lib/ulogd/ulogd_SQLITE3.so"
#plugin="/usr/lib/ulogd/ulogd_PCAP.so"


[LOGEMU]
file="/var/log/ulog/syslogemu.log"
sync=1

[OPRINT]
file="/var/log/ulog/pktlog.log"

[MYSQL]
table="ulog"
pass="phahde4I"
user="root"
db="traffic"
host="localhost"

[PGSQL]
table="ulog"
schema="public"
pass="changeme"
user="postgres"
db="ulogd"
host="localhost"

[SQLITE3]
table="ulog"
db="/path/to/sqlite/db"
buffer=200

[PCAP]
file="/var/log/ulog/pcap.log"
sync=1



Собственно, настройка системы подсчета трафика закончена, далее вопрос за её анализом и красивым отображением, но это в следующих статьях :)

Роутер на Debian4

Собственно, тут почти всё очевидно, так что приведу только конфиги.

Ставим Debian 4 Etch как "только standard system".

Правим /etc/apt/sources.list -- убираем строку, начинающуюся deb cdrom, иначе apt-get будет просить диск.

sudo apt-get install sudo bind vim mc ssh

В файл /etc/sodoers добавляем строку:
nrg ALL=(ALL) ALL
где nrg -- имя вашей пользовательской учётной записи, это позволит использовать sudo.

Заранее оговорюсь, что eth0 -- интерфейс, смотрящий на провайдера, а eth1 соответственно внутренний.

/etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0 eth1

iface eth0 inet static
address 192.168.155.51
netmask 255.255.255.0
network 192.168.155.0
gateway 192.168.155.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 192.168.155.1 192.168.155.88
# судя по доке, использования этих днс
# опций нужно поставить resolvconf, но оно воркает и без него :)

iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0



/etc/network/if-up.d/nat (chmod +x)

#!/bin/sh
INET="eth0" # internet iface
INETIP="192.168.155.51"

# сбрасываем все правила
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT

# политика по умолчанию
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

iptables -t nat -A POSTROUTING -o $INET -j SNAT --to-source $INETIP
echo "1" > /proc/sys/net/ipv4/ip_forward


А этот конфиг скорее для юзерских машин, т.к. серверу он не нужен (т.е. всё работает даже тогда, когда он вообще пуст), все лучше делать через /etc/network/interfaces.
/etc/resolv.conf
nameserver 192.168.155.1
nameserver 192.168.155.88


Ещё может понадобится команда ручной установки шлюза:
sudo route add default gw 192.168.1.1

Конфиги частично взяты с http://linuxopen.ru/2008/07/03/nastrojjka-marshrutizatora-na-osnove.html .