воскресенье, 1 августа 2010 г.

Следим за нагрузкой на сетевых интерфейсах с помощью Nagios, Nagiosgraph, check_iftraffic3, snmp на FreeBSD

Итак!

Нам необходимо наблюдать скорость на сетевых интерфейсах и наблюдать все это дело визуально с помощью nagiosgraph.

Про установку и настройку Nagios`a и Nagiosgraph писать смысла не вижу, интернет полон подробными HowTo, но к сожалению в них описана только базовая настройка с базовыми плагинами идущими вместе с nagios.

Все опыты проводились на:

#uname -a

FreeBSD xxxx.ru 8.0-RELEASE-p2 FreeBSD 8.0-RELEASE-p2 #3: Mon May 24 10:52:57 NOVST 2010 root@xxxx.ru:/usr/obj/usr/src/sys/GENERIC i386

Первым делом качаем сам плагин check_iftraffic3.pl.

После скачивания его нужно перенести в директорию /usr/local/libexec/nagios. Это директория является по умолчанию местом где лежат все плагины Nagios`a. У вас может быть по другому.

Меняем владельца и группу на этот плагин и делаем его исполняемым.

# chown nagios:nagios /usr/local/libexec/nagios/check_iftraffic3.pl

# chmod 744 /usr/local/libexec/nagios/check_traffic3.pl

Важное замечание! Данный плагин как и любой другой можно запустить с консоли ручками, но когда я тестил его, я натнулся на грабли, а именно, в консоли плагин срабатывал как нужно, но в nagios`e постоянно была ошибка. Я долго не мог понять в чем дело пока не посмотрел содержимое плагина. Там есть такая сторка my $TRAFFIC_FILE = "/tmp/traffic";. В этот временный файл плагин пишет всю собранную информацию. И так как плагин я вручную запускал с правами root`a соответственно и владельцем временного файла был root:wheel и nagios не мог получить доступ к нему. Лечилось это простым удалением файла из каталога tmp и при последующем вызове плагина nagios`om файл создавался с нужными правами.

Теперь немного про настройку конфигурационных файлов nagios`a:

После того как мы добавили плагин в соответствующую директорию его необходимо описать в файле /usr/local/etc/nagios/objects/commands.cfg

Я описал следующим образом:


define command{
command_name check_traffic
command_line $USER1$/check_iftraffic3.pl -H $ARG1$ -C $ARG2$ -i $ARG3$ -B -b 100
}

Сдесь $USER1$ это путь до папки с плагинами, $ARG1$ - аргумент передает имя хоста, $ARG2$ - аргумент передает SNMP коммунити, $ARG3$ имя интерфейса в системе. Ключ -B говорит об отбражении результатов в bits per seconds, -b 100 говорит о том что у нас интерфейс 100 мегабитный

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

Для примера:

У меня есть файл /usr/local/et/nagios/object/localhost.cfg - этот конфигурационный файл описывает плагины для мониторинга только моего локального хоста, в него я и включил мониторинг за интерфейсами.

Вот так сделано у меня:


define service{
use local-service
host_name localhost
service_description IF_traffic_extIF
check_command check_traffic!localhost!vp5fDeTk!rl0
}

Мы описали сервис для локалхоста в котором команда проверки выглядит следующим образом:

check_command check_traffic!localhost!vp5fDeTk!rl0

Разберем строку 'check_traffic!localhost!vp5fDeTk!rl0'

check_traffic - это сама команда описаная ранее с файле commands.cfg, а localhost!vp5fDeTk!rl0 это передаваемые аргументы:

$ARG1$ это localhost

$ARG2$ это vp5fDeTk (мое SNMP коммунити, у вас другое!)

$ARG3$ это rl0 (название интерфейса в системе)

! - это разделитель меджу передаваемыми аргументами.

Итак. Все что нужно мы описали, пора проверить работу нашего плагина. Если мы все правильно сделали то после перезапуска nagios`a должны (не сразу) увидеть появившийся новый плагин в веб интерфейсе и его вывод:


Обратим внимание на строчку "Performance data:". Это данные нам и понадобятся для построения графика.

Переходим к настройке Nagiosgraph`a. Если он у вас не установлен тоу вас не будет строчки "Performance data:". Описывать установку его тут не буду все ставиться просто из портов,конфигурируется тоже не сложно, гуглите, информации полно.

Приступим!

Конфиги nagiosgraph`a находятся в /usr/local/etc/nagios/nagiosgraph.

Нас интересует файл map, и lables.conf. Эти конфиги должны быть раскомментированны в главном конфиг файле nagiosgrapf.conf.

Открываем файл map вашим любимым редактором, я использую встроенный редактор в mc, мне он удобнее всех.

В самом конце файла видим описание похожее на сбор данных с сетевого интерфейса:

# Service type: unix network
# output: Received 3956221475, Transmitted = 571374458
# perfdata: rbyte=3956221475 rpacket=36097353 rerr=0 rdrop=0 rmult=0 tbyte=571374458 tpacket=62062295 terr=6 tdrop=0 tmult=0
/perfdata:rbyte=([\d]+) rpacket=([\d]+) rerr=([\d]+) rdrop=([\d]+) rmult=([\d]+) tbyte=([\d]+) tpacket=([\d]+) terr=([\d]+) tdrop=([\d]+) tmult=([\d]+)/
and push @s, [ 'data',
[ 'byte_received', COUNTER, $1 ],
[ 'byte_transmitted', COUNTER, $6 ],
[ 'packet_received', COUNTER, $2 ],
[ 'packet_transmitted', COUNTER, $7 ],
[ 'error_received', COUNTER, $3 ],
[ 'error_transmitted', COUNTER, $8 ],
[ 'drop_received', COUNTER, $4 ],
[ 'drop_transmitted', COUNTER, $9 ],
[ 'multi_received', COUNTER, $5 ],
[ 'multi_transmitted', COUNTER, $10 ]];


Нас интересует строка /perfdata:rbyte=([\d]+) rpacket=([\d]+) rerr=([\d]+) rdrop=([\d]+) rmult=([\d]+) tbyte=([\d]+) tpacket=([\d]+) terr=([\d]+) tdrop=([\d]+) tmult=([\d]+).

Но в выводе плагина на веб интерфейс мы видим другую картину.

Performance Data: inUsage=0.93%;85;98 outUsage=0.08%;85;98 inBandwidth=955.04Kbs outBandwidth=79.2Kbs inAbsolut=3451393974 outAbsolut=1392289706.

То есть переменные описанные по дефолту не совпадают с тем что нам выдает плагин. Не беда, напишем описание сами!

Дефолтное описание оставляем так как есть, после него добавим:

/perfdata:inUsage=([.\d]+)%;(\d+);(\d+) outUsage=([.\d]+)%;(\d+);(\d+) inBandwidth=([.\d]+)Kbs outBandwidth=([.\d]+)Kbs inAbsolut=(\d+) outAbsolut=(\d+)/
and push @s, [ 'data',
[ 'Input_Bandwidth', GAUGE, $7 ],
[ 'Output_Bandwidth', GAUGE, $8 ]];

Меня интересует только скорость передачи на интерфейсе, поэтому для построения графика я выбрал 2 пункта :

[ 'Input_Bandwidth', GAUGE, $7 ],
[ 'Output_Bandwidth', GAUGE, $8 ]

Переменные $7 и $8 это значения inBandwidth=([.\d]+)Kbs outBandwidth=([.\d]+)Kbs 7ое и 8ое по счету слева направо, не ошибитесь каждое ([.\d]+) или (\d) считается за отдельное значение. Также будте внимательны при описании графика, лишний пробел и вы не получите никаких данных.

Итак, описание графика мы добавили, добавим леблы в конец файла labels.conf

Input_Usage = Input Usage
Output_Usage = Output Usage
Input_Bandwidth = Input Bandwidth
Output_Bandwidth = Output Bandwidth
Input_Absolut = Input Absolut
Output_Absolut = Output Absolut

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

Данные идут в Kbs как подписать это на графике пока не придумал :)




четверг, 15 июля 2010 г.

Squid 3.1.0.13, PF. Transparent proxy on FreeBSD.

Squid — программный пакет, реализующий функцию кэширующего прокси-сервера для протоколов HTTP, FTP, Gopher и (в случае соответствующих настроек) HTTPS. Разработан сообществом как программа с открытым исходным кодом (распространяется в соответствии с GNU GPL). Все запросы выполняет как один неблокируемый процесс ввода/вывода.

Используется в UNIX-like системах и в ОС семейства Windows NT. Имеет возможность взаимодействия с Active Directory Windows Server путём аутентификации через LDAP, что позволяет использовать разграничения доступа к интернет ресурсам пользователей, которые имеют учётные записи на Windows Server, также позволяет организовать «нарезку» интернет трафика для различных пользователей.


Итак начнём!

Все манипуляции проводились на:

FreeBSD xx.xxx.ru 8.0-RELEASE-p3 FreeBSD 8.0-RELEASE-p3 #1: Mon Jul 12 07:16:57 UTC 2010 root@xx.xxx.ru:/usr/obj/usr/src/sys/GENERIC i386

Установка и настройка squid:


# cd /usr/ports/www/squid31

# make config

В разделе опций я выбрал:

[X] SQUID_DELAY_POOLS Enable delay pools  - Добавляет возможность ограничения скорости.

[X] SQUID_PF Enable transparent proxying with PF - Добавляет возможность использовать прозрачный прокси с фаерволом PF. Если вы используйте IPFW то вам достаточно изменить эту опцию на [X] SQUID_IPFW

Далее делаем

# make install clean

по окончании установки начинаем конфигурировать наш прокси.

Конфиг находится по адресу /usr/local/etc/squid/squid.conf

В версии squid`a 3.1 конфигурационный файл достаточно скуден, поэтому мы будем дописывать в него необходимое.

Ниже приведен мой конфиг:

acl manager proto cache_object

acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8

acl wifi_net src 192.168.9.0/24

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 manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access allow wifi_net
http_access allow localhost
http_access deny all

http_port 127.0.0.1:3128 transparent

hierarchy_stoplist cgi-bin ?
coredump_dir /usr/local/squid/cache

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

visible_hostname your_hostname
via off
forwarded_for off
cache_mem 256 MB
maximum_object_size_in_memory 512 KB
cache_dir ufs /usr/local/squid/cache 2048 256 512
cache_mgr your_contacts

Каждый параметр расписывать не буду. Укажу только ключевые!

http_port 127.0.0.1:3128 transparent -Указывается интерфейс и порт на котором будет сидеть squid и принимать запросы. Слово transparent говорит нам о том что прокси прозрачный.

acl wifi_net src 192.168.9.0/24 - Тут я указал acl моей локальной сети. Вы можете обозвать свою как угодно, я назвал wifi_net, так как у меня сеть беспроводная

http_access allow wifi_net - Разрешаю доступ машинам моей подсети к прокси-серверу. Дописывать данный параметр нужно обязательно перед http_access deny all.

После манипуляций с конфигом создаем своп директории командой

# squid -z

Если все выполнилось без ошибок то идем дальше!

В /etc/rc.conf дописываем строку

squid_enable="YES"

И пробуем запустить

# /usr/local/etc/rc.d/squid start

Если ошибок нет, проверяем

# ps ax | grep squid

Должен быть вывод вроде этого:

59469 ?? Is 0:00.00 /usr/local/sbin/squid
59471 ?? S 0:09.18 (squid) (squid)

Проверим порт:

#sockstat | grep 3128

Должны получить:

squid squid 59471 14 tcp4 127.0.0.1:3128 *:*

На этом конфигурирование squid`a закончено. Вы можете ознакомиться с документацией на официальном сайте http://www.squid-cache.org/ для дополнительного конфигурирования прокси.

Теперь нам нужно завернуть весь HTTP трафик с пользователей на наш проксик.

Я использую в качестве фаервола PF. Конфигурационный файл находится по адресу /etc/pf.conf. В него перед секцией NAT добавляем:

rdr on $wlan_if inet proto tcp from $wlan_net to any port www -> $proxy_if $proxy_port

где $wlan_if, $wlan_net, $proxy_if, $proxy port мои переменные интерфейсов и сетей, вам соответственно нужно подставить свои, если конечно они у вас определены!

Обновляем правила фаервола

# pfctl -f /etc/pf.conf

Если вы все сделали правильно то в /usr/local/squid/logs/access.log должны писаться сообщения о том кто куда ходит!

Статья написана грубо и примитивно, не вдаваясь в подробности. В дальнейшем напишу о том как настроить delay pools для ограничения трафика, как запретить пользователя лазить где попало и  расскажу про различные веб-морды для просмотра статистики посещений!