Возникла "вечная" проблема подсчета "внешнего" трафика при следующих условиях:
Система FreeBSD 4.3, два 10Mb "внешних" интерфейса (к разным провайдерам), 10Mb интерфейс
в локалку и Granch SBNI - выделенка. Из локальной сети во внешний мир выходят через natd и ipfw.
Трафик небольшой - немного "густо", затем долго "пусто".
Попробовал для этого ipacctd и trafd - цифры полученные и от того и от другого мягко говоря
совсем похожи на выдаваемыми ipfw count from any to any via ep0 и ipfw count from any to any via ep1.
Кроме того оба пакета сбрасывают в лог информацию уже _после_ диверта, т.е. не видно с какой локальной
машины пошел запрос.
Теперь чтоже я сделал и собственно из-за чего весь сыр-бор.
Почитав ман на ipfw, порывшись в исходниках ядра и немного поэкспериментировав, пришел к следующему:
1. в ipfw на все divert'ные правила добавляю log logamount 0
2. в syslog.conf security.* /var/log/security заменяю на
security.notice /var/log/security
security.=info /var/log/traffic
3. в /sys/netinet/ip_fw.c изменяю функцию ipfw_report (добавлен вывод ip->ip_len):
log(LOG_SECURITY | LOG_INFO, "%s %s %s %d out via %s%d%s\n", name, action, proto, ip->ip_len, oif->if_name, oif->if_unit, fragment);
log(LOG_SECURITY | LOG_INFO, "%s %s %s %d in via %s%d%s\n", name, action, proto, ip->ip_len, oif->if_name, oif->if_unit, fragment);
4. в crontab добавляю
0 * * * * traflog.sh
где traflog.sh (не привожу текст, т.к. в свернутом виде неудобочитаем, а в развернутом - слишком велик)
выполняет следующие функции:
1. переносит /var/log/traffic во временный файл и создает пустой /var/log/traffic
2. с помощью awk суммирует размер подряд идущих пакетов с одинаковыми адресами/портами src/dest,
а так же разворачивает записи типа last message repeated 3 times
3. сортирует получившийся файл
4. и повторяет процедуру объединения размеров подряд идущих пакетов
Что я с этого имею?
Я имею записи типа: TCP 10.0.0.14:1063 64.12.25.51:5190 out via ep1
Я имею точную цифру которая сходится с ipfw count и со счетом провайдера.
Вот только гложет меня сомнение можно ли так делать и почему до сих пор никто нигде не выступил
с подобным решением? Может быть таким образом я уменьшил устойчивость системы? Может быть...