Подсчёт трафика с помощью trafd

Подсчёт трафика с помощью trafd

Хорошая статья о возможностях trafd находится здесь — http://www.hub.ru/archives/2061 В своей заметке я выбрал лишь то, что нужно действительно мне и подправил пару неточностей.

Установим trafd:

# cd /usr/ports/net-mgmt/trafd
# make install clean

Создаем файл, куда будет писаться статистика (fxp0 — название интерфейса с которого будем собирать статистику):

# touch /usr/local/var/trafd/trafd.fxp0

Запускаем сам сбор статистики:

# /usr/local/bin/trafd -i fxp0

Эту же строчку добавим в /etc/rc.conf для автоматического старта при запуске. В идеале в /etc/rc.conf нужно прописать
trafd_enable=»YES»
trafd_ifaces=»fxp0″

но с этими строчками trafd не запустился, поэтому для автоматического старта прописываем в cron  такую строчку:

@reboot /usr/local/bin/trafd -i fxp0
Проверяем работу демона:

ps ax | grep trafd

7753 ?? Ss 0:00.07 /usr/local/bin/trafd -i fxp0
7826 p0 R+ 0:00.00 grep trafd

Добавим задачу в crontab чтобы данные сохранялись каждые 3 часа:

0 */3 * * * /usr/local/bin/trafsave fxp0

Посмотреть отчет за период со времени последнего сохранения:

# traflog -n -i fxp0 (-n указывает не преобразовывать IP адреса)

Посмотреть перечень записей:

# traflog -l -i fxp0

Примерный вывод результата:

# Started Dumped Data All Recs
001 Dec 10 16:44:46 Dec 10 16:49:54 18638 25246 7
002 Dec 10 16:49:54 Dec 10 16:50:45 22 55 1
003 Dec 10 16:50:45 Dec 10 16:51:15 8607 9111 1
004 Dec 10 16:51:15 Dec 10 20:00:01 68463394 72252858 349
005 Dec 10 20:00:01 Dec 11 00:00:01 1552189274 1621174536 577

Допустим, перед нами стоит задача посчитать сколько трафика скачано с определенного IP за весь период подсчётов. Выяснить это можно так:

traflog -n -i fxp0 -s from all to 10.10.51.79 | grep Summary

Если требуется высчитать трафик за определенный период, то добавляем ключи, указывающие на начало и конец отчетного периода (параметры -b <первая запись> -e <последняя запись>):

traflog -n -i fxp0 -s -b1 -e33 from all to 10.10.51.79 | grep Summary

Команда » | grep Summary» отсекает вывод излишне подробной статистки, откуда и сколько байт пришло, это бывает полезно, если нужно смотреть статистику используя медленные каналы связи.

Один из примеров использования trafd — подсчет трафика одной из игрушек, использующей порты 2106 и 7777, прошедшего через внешний интерфейс за определенный период:

traflog -n -i tun0 -b1 -e28 -s port 7777 port 2106 | grep Summary

Ссылки:

Установка SAMS с NCSA и IP авторизацией на FreeBSD из портов

Что такое SAMS, его возможности и принцип работы хорошо описаны здесь — http://www.permlug.org/wiki/sams. К сожалению в свое время я не нашел хорошей пошаговой инструкции по установке SAMS из портов в системе FreeBSD, поэтому написал собственную шпаргалку. Надеюсь, она поможет начинающим обойти те подводные камни, которые попались мне.

Установка проводилась на FreeBSD 6.3, на момент установки в системе присутствовали следующие пакеты:

mysql-5.0.51a
php5-5.2.6
apache-2.2.9
samba-3.0.31_1

Связка Apache2 + PHP + MySQL без проблем работала (о её установке читайте в предыдущих заметках), оставалось поставить из портов последние доступные версии squid-2.7.5 и sams-1.0.3.

Ставим squid, обязательно выбираем опцию — Enable delay pools:

# cd /usr/ports/www/squid

# make install clean

В /usr/local/etc/squid/squid.conf включаем ncsa авторизацию (это важный пункт, т.к. SAMS этого сам не сделает). Раскомментируем и подправим следующие строчки:

auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/ncsa.sams
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

Создаем файл ncsa.sams. По идее SAMS сделает его самостоятельно, но нам сейчас нужно, чтобы Squid запустился еще до SAMS с целью тестирования его работы.

# touch /usr/local/etc/squid/ncsa.sams

Запускаем Squid:

# rehash
# squid -z
# /usr/local/etc/rc.d/squid start

Проверяем работу Squid. Должно показаться что-то вроде:

# ps -ax | grep squid
18859 ?? Is 0:00.00 /usr/local/sbin/squid -D
18861 ?? S 0:00.18 (squid) -D (squid)
18862 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
18863 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
18864 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
18865 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
18866 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)

Приступаем к установке SAMS из портов. При конфигурации выбираем поддержку Apache 2 (у меня он и стоит):

# cd /usr/ports/www/sams
# make config
# make
# make install
# cp /usr/local/etc/sams.conf.sample /usr/local/etc/sams.conf
# make setup

Здесь нужно будет ввести пароль  пользователя root  в MySQL, согласиться на создание баз данных и пользователя sams и назначить ему пароль.

# make clean

После завершения инсталяции следуем выданным инструкциям. В конфиг Apache добавляем:

Alias /sams/ «/usr/local/share/sams/»
<Directory «/usr/local/share/sams/»>
AllowOverride AuthConfig
Options Indexes MultiViews
Order allow,deny
Allow from all
</Directory>

В файл /etc/rc.conf добавим:

sams_enable=”YES”
squid_enable=”YES”

Прописываем правильные пути в файле /usr/local/etc/sams.conf. Мой файл выглядит так:

[client]
SQUID_DB=squidlog
SAMS_DB=squidctrl
MYSQLHOSTNAME=localhost
MYSQLUSER=sams
MYSQLPASSWORD=samspasswd
MYSQLVERSION=5.0
SQUIDCACHEFILE=access.log
SQUIDROOTDIR=/usr/local/etc/squid
SQUIDLOGDIR=/usr/local/squid/logs
SQUIDCACHEDIR=/var/spool/squid
SAMSPATH=/usr/local
SQUIDPATH=/usr/local/sbin
SQUIDGUARDLOGPATH=/var/log
SQUIDGUARDDBPATH=/var/db/squidGuard
RECODECOMMAND=/usr/local/bin/iconv -f KOI8-R -t 866 %finp > %fout
LDAPSERVER=servername_or_ipadress
LDAPBASEDN=your.domain
LDAPUSER=DomainAdministrator
LDAPUSERPASSWD=passwd
LDAPUSERSGROUP=Users
REJIKPATH=/usr/local/rejik
SHUTDOWNCOMMAND=/sbin/shutdown -h now
CACHENUM=0
MYSQLUSER=sams
MYSQLPASSWORD=123456
MYSQLHOSTNAME=localhost

Запускаем sams:

# samsdaemon

Проверяем запустилось ли всё что нужно:

# ps -ax | grep sams
25865 ?? I 0:00.00 /usr/local/bin/samsf
25868 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
25869 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
25870 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
25871 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
25872 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
22678 p0- S 0:13.77 samsdaemon
26153 p0 R+ 0:00.00 grep sams

Заходим в веб-интерфейс SAMS — http://ip_server/sams/ по умолчанию пользователь admin, пароль qwerty.
SAMS -> SAMS administration -> SAMS settings выбираем NCSA авторизацию, ставим галочку на «Insert SQUID logs in database». Записывам настройки.

ВАЖНО!!! Обязательно изменить в «templates» тип авторизации на NCSA (по умолчанию стоит по IP). Если не сделать этого, то в консоли будет вываливаться сообщение о пуcтом файле default.sams.
Добавляем новых пользователей. Делаем переконфигурирование — SAMS -> SQUID -> SQUID reconfiguration -> Reconfigurate

Идем в браузер, прописываем настройки прокси и пробуем выйти в Интернет. Если всё настроено правильно, то должно появится окно авторизации, вводим логин и пароль ранее добавленного пользователя и выходим на бескрайние просторы Интернета.

Теперь, когда настроена авторизация по логину/паролю, можно без труда настроить авторизацию по IP адресу. Для этого нужно создать дополнительный шаблон и указать в нём тип авторизации «IP», затем добавляем новых пользователей указав в их профиле новый шаблон, а также IP адрес с которого должен работать пользователь, пароль указывать не нужно, но в браузере всё так же требуется прописать настройки прокси-сервера.

Решение разных проблем

Спустя некоторое время после использования SAMS выяснилось, что периодически падает демон samsf отвечающий за непрерывную обработку логов Squid. Оказалось, что разработчики более не поддерживают его и рекомендуется использовать опцию «Discret parser» SAMS -> SAMS administration -> SAMS settings. Периодичность я поставил 1 минуту. После этого всё нормализовалось.

Если при реконфигурировании SAMS новые пользователи не добавляются в ncsa.sams то можно попробовать убить процессы samsdaemon и samsf и запустить samsdaemon заново.

Другой частый вариант при первых запусках SAMS — не стартует squid или ругается на несуществующий процесс. В этом случае нужно в ручную создать файл /usr/local/etc/squid/ncsa.sams (даже если вы его создавали в начале установки, то при реконфигурировании SAMS он скорей всего был удален), затем в папке /usr/local/squid/logs удаляем файл squid.pid (иногда также помогает удаление |access.log) после этого лучше перезагрузиться.

Ещё один нюанс настройки SAMS — при перезапуске сервера SAMS норовит стартовать раньше MySQL, в результате чего он не может открыть нужные таблицы. Есть несколько способов это устранить, один из них дополнить в файле /usr/local/etc/rc.d/sams строчку:

# REQUIRE: LOGIN cleanvar

до

# REQUIRE: LOGIN cleanvar mysql

Другой вариант — убрать из /etc/rc.conf строчку sams_enable=”YES” и прописать в crontab строчку:

@reboot /usr/local/etc/rc.d/sams start
Перезагружаем сервер, смотрим работу SAMS, если всё нормально, то на этом настройку можно считать завершенной.

Следует иметь в виду, что в SAMS есть масса других подводных камней, которые могут проявиться при попытке настроить авторизацию по NTLM и т.д. Есть также вероятность, что в один не очень хороший день SAMS может упасть без видимой причины. В этих случаях я советую искать ответы на форуме http://www.permlug.org/forum/sams/ Многие подобные ситуации уже обсуждались и ответы были найдены, нужно лишь искать.

На всякий случай приведу примеры файлов конфигурации.

Пример файла /usr/local/etc/rc.d/sams

#!/bin/sh
# $FreeBSD: ports/www/sams/files/sams.sh.in,v 1.1 2006/12/29 20:18:35 miwi Exp $

# PROVIDE: sams
# REQUIRE: LOGIN cleanvar mysql — очень важно, без mysql не будет стартовать при загрузке ОС
# KEYWORD: shutdown

# Define these sams_* variables in one of these files:
# /etc/rc.conf
# /etc/rc.conf.local
# /etc/rc.conf.d/sams
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
#
sams_enable=${sams_enable-«NO»}
sams_flags=${sams_flags-«»}
sams_pidfile=${sams_pidfile-«/var/run/samsdaemon.pid»}

. /etc/rc.subr

name=»sams»
rcvar=`set_rcvar`
command=»/usr/local/bin/samsdaemon»

load_rc_config $name

pidfile=»${sams_pidfile}»

run_rc_command «$1»

Пример файла /usr/local/etc/squid/squid.conf:

auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/ncsa.sams

auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
acl _sams_4934254f2ae45 src «/usr/local/etc/squid/4934254f2ae45.sams»
acl _sams_4934254f2ae45_time time MTWHFAS 00:00-23:59
acl _sams_default proxy_auth «/usr/local/etc/squid/default.sams»
acl _sams_default_time time MTWHFAS 00:00-23:00
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access allow _sams_4934254f2ae45 _sams_4934254f2ae45_time
http_access allow _sams_default _sams_default_time
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /usr/local/squid/logs/access.log squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
acl shoutcast rep_header X-HTTP09-First-Line ^ICY\s[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
delay_pools 2
delay_class 1 2
delay_class 2 2
delay_access 1 allow _sams_4934254f2ae45
delay_access 1 deny all
delay_parameters 1 524288/524288 524288/524288
delay_access 2 allow _sams_default
delay_access 2 deny all
delay_parameters 2 64000/64000 64000/64000
coredump_dir /usr/local/squid/cache

ipfw + natd + tun0

Исходные данные: имеем сервер FreeBSD 6.3 с двумя сетевыми картами в одну подключен модем ADSL в режиме bridge, в другую локальную сеть
Задача: разрешить выход в интернет компьютерам локальной сети и дать возможность доступа по определенным портам из интернета на компьютеры в сети.

Для начала работы ipfw пересоберем ядро с нужными опциями:

# Включаем поддержку ipfw
options IPFIREWALL
# Включаем логирование пакетов,
# которые попадут под правило log
options IPFIREWALL_VERBOSE
# Ограничение размера журнального файла,
# на случай DDoS атаки
options IPFIREWALL_VERBOSE_LIMIT=100
# Пригодится, если понадобится воспользоваться
# возможностью перенаправления пакетов
# (например, при создании transparent proxy).
options IPFIREWALL_FORWARD
# Дайверт, для того, чтобы работал NAT, если
# нужно выпустить в Интернет локальную сеть
options IPDIVERT
# Эта опция пригодится, в случае задания
# шейпов для ограничения скорости.
options DUMMYNET

Файл с настройками для дозвона модема:

/etc/ppp/ppp.conf

default:
set device PPPoE:rl0:vtc
set speed sync
set mru 1492
set mtu 1492
set ctsrts off
set timeout 0
set redial 0 0

# Link Quality Request
enable lqr
set lqrperiod 5

vtc:
set authname login # наш логин
set authkey password # наш пароль
add default HISADDR

/etc/rc.conf

defaultrouter=»192.168.1.1″
hostname=»gorod.vera.local»
ifconfig_re0=»inet 10.10.38.100 netmask 255.255.255.0″
ifconfig_rl0=»inet 192.168.1.2 netmask 255.255.255.0″

gateway_enable=»YES»
natd_enable=»YES»
#NAT будет работать на внешнем интерфейсе модема
natd_interface=»tun0″
natd_flags=»-f /etc/natd.conf»

firewall_enable=»YES»
firewall_type=»/etc/rc.firewall»
#включаем логирование пакетов
firewall_logging=»YES»

#включаем дозвон модема
ppp_nat=»NO»
ppp_enable=»YES»
ppp_mode=»ddial»
ppp_profile=»vtc»

Файл с настройками ipfw (делаем его исполняемым — 754)

/etc/rc.firewall

#!/bin/sh —

fw=»/sbin/ipfw -q»

inif=»re0″
outif=»tun0″
inip=»10.10.38.100″
outip=»85.192.x.x»
innet=»10.10.38.0/24″

${fw} -f flush
${fw} add allow all from any to any via lo0
${fw} add deny log all from any to 127.0.0.0/8
${fw} add deny log all from 127.0.0.0/8 to any

${fw} add divert natd log all from ${innet} to any out via ${outif}
${fw} add divert natd log all from any to ${outip} in via ${outif}

${fw} add allow tcp from any to any via ${outif} established
${fw} add allow tcp from ${inip},${outip} to any out xmit ${outif} setup

${fw} add allow all from ${innet} to any out via ${inif}
${fw} add allow all from any to ${innet} in via ${inif}

##### Правила для UDP протокола ####
#
# — для сервера
# Разрешаем все исходящие UDP запросы с самого сервера
# Без этого не работают такие команды как traceroute
# Хотя, как вариант, можно обойтись и без этого если
# использовать traceroute -P icmp
${fw} add allow udp from ${outip} to any out via ${outif}
# Разрешаем входящие DNS запросы к нашему DNS серверу
# если конечно таковой испольуется на этой машине.
${fw} add allow udp from any to ${outip} 53 in via ${outif}
# Разрешаем ответы от DNS серверов на запросы
# от нашего хоста.
${fw} add allow udp from any 53 to ${outip} in via ${outif}
# Разрешаем ответы от серверов времени на запросы
# от нашего хоста
${fw} add allow udp from any 123 to ${outip} in via ${outif}
#
# — для локальной сети
# Разрешаем DNS запросы/ответы для всей сети
${fw} add allow udp from ${innet} to any 53
${fw} add allow udp from any 53 to ${innet}
# Разрешаем запросы/ответы к серверам времени для всей сети
${fw} add allow udp from ${innet} to any 123
${fw} add allow udp from any 123 to ${innet}

${fw} add allow tcp from ${innet} to any in via ${inif}
${fw} add allow tcp from any to ${innet} out via ${inif}

${fw} add allow all from any to any
${fw} add deny log all from any to any

При настройке сервера я долго не мог понять почему не работает данная связка. Ответ оказался простым — natd не стартовал на интерфейсе tun0 т.к. его еще нет при старте системы, а появляется он после того как модем дозвонился. Проверить включен ли нат можно командой:

# /etc/rc.d/natd status

Если работает, то ответ получаем примерно такой:

natd is running as pid 1175.

Если не работает, то запустить можно командой:

# /etc/rc.d/natd start

Решение данной проблемы может быть таким: прописываем задачу в cron чтобы natd стартовал при каждой загрузке компьютера принудительно.

# crontab -e

@reboot /etc/rc.d/natd start

Если нужно пробросить порты с внешнего интерфейса на компьютеры внутри сети, то редактируем файл /etc/natd.conf. К примеру нужно открыть доступ по 5000 порту на компьютер с IP 10.10.38.200. Для этого добавляем в файл строчку:

redirect_port tcp 10.10.38.200:5000 5000

На этом настройку можно считать законченной.

Статья на основе которой я  настраивал связку — http://live.daemony.org/freebsd/ipfw-natd-tun0.html

Установка webmin

Данная программа может оказаться полезной для новичков изучающих Unix системы.

Устанавливаем сам webmin:

# cd /usr/ports/sysutils/webmin
# make install clean

Для запуска webmin при старте системы сконфигурируем файл /etc/rc.conf добавив в него строчку:

webmin_enable=»YES»
Для конфигурирования webmin запустим скрипт:

# /usr/local/lib/webmin/setup.sh

Отвечаем на вопросы конфигуратора. Если предлагаемую настройку менять не нужно, то нажимаем Enter:

Web server port (default 10000): [Press Enter]
Login name (default admin): [Press Enter]
Login password: [наш пароль]
Password again:
Use SSL (y/n): y

Зайти в программу можно введя следущий адрес:

https://your-server-ip:10000

Авторизация на сервере FreeBSD по SSH ключам

Исходные данные: имеется сервер на базе FreeBSD, имеются клиентские машины с которых надо периодически заходить на этот сервер. В качестве SSH-клиента используется PuTTY.
Задача: избавить себя от постоянного ввода паролей вручную и проходить авторизацию с помощью специальных ключей.

Для подключения клиента требуется сгенерировать два ключа — закрытй и публичный. В клиенте PuTTY это делается утилитой puttygen.exe. В открывшемся окне меняем значение Number of bits in a generated key с 1024 на более сложное, например 2343. Нажимаем кнопку Generate и водим мышкой чтобы создать случайный код.

По завершении генерации станут активными две кнопки — Save public key и Save private key. Нажимаем на первую кнопку и сохраняем публичный ключ с названием, к примеру, rsa-pub. Второй ключ сохраним как rsa-private. При этом программа напомнит, что нужно ввести еще секретную фразу т.к. это увеличит безопасность, но мы откажемся т.к. задача соединяться не вводя пароли.

Теперь соединяемся с нашим сервером и заходим в домашнюю папку того пользователя под которым будем соединяться с сервером. Создаем там директорию .ssh

$ mkdir .ssh

Ставим на папку права 700

Копируем туда наш публичный ключ. И в этой же директории выполняем следующую команду:

# ssh-keygen -i -f rsa-pub > authorized_keys

Открываем PuTTY выбираем нашу запись для соединения с сервером, и добавляем в раздел Connection — SSH — Auth путь к нашему приватному ключу. Всё, теперь можно коннектиться. Если всё сделано правильно то мы попадем в директорию пользователя без запроса пароля.

Есть другой вариант переноса публичного ключа на сервер. Необходимо создать в директории .ssh файл authorized_keys

$ touch authorized_keys

Открыть для редактирования этот файл и скопировать туда наш публичный ключ. Ключ должен идти в одну строчку. Перед ключом должно быть написано ssh-rsa и поставлен пробел.

Пример:
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAZYQ69twq6e39+S6LxO62E37wtlGvVknomrTSdGD/QRTiNKwCI0WzFmOjvshFbzi+ARYRUcIQpxjO1nVfcO+RfJHCjX3vjgEeq1vxhag0PQs8mJLaddeCISpW37zpxYczDPTwEC7vVnzW9H1YcB1x42V9dL4JJzhbRUmHWEuNw1h+MM0eOnJLcUHZuHmxiP6M8y41UPenuVnAt2FaNWzxxMUjSKg6zCj3q07Td/ilrCvARs7/hFERG7pn6QN9At/EpTQvyn/aYDByPc4xUkeGTapzaMBYSrRIVpyYvDjJza3TAgIYejwLgV+gwlXMYKkvErsdm1hh+K4Ioe0zkbGzkaYUA+a7q3tzjY5taCDp/9LFjwhuMVcswnNAjLX+ct+sSIvZn/KnZjafcywjdmZc1Nhrl6b9AxnJ+h9PJ2BC73h90ZWvr5EASiXSgyI8A2y1ObVpLvoNIJu0DeKnIZnKarTbhXvQFAAeOzsxkTzb95ceX+llRUHqyOBpnB7D2DR8Im1tdVaQy9v9dZ329+Ogjg2BXKfL5Oh