пятница, января 11, 2013

CentOS: ipset

### OS

Используемая ОС: centos 5.8 x32 на виртуальной машине.

shell> uname -a
Linux localhost.localdomain 2.6.18-308.el5 #1 SMP Tue Feb 21 20:05:41 EST 2012 i686 i686 i386 GNU/Linux

Система обновлена до последней версии. Стоит отметить, что когда я было начинал настройку на x64 то пакет ipset был в стандартном репозитории. А в x32 в стандартном репозитории ipset нет. По этому пришлось установить репозиторий centalt. В силу обстоятельств мне нужно было именно заставить работать ipset на x32.

### INSTALL AND RUN

Все манипуляции проводились от пользователя root.

shell> yum install ipset kmod-ipset
shell> modprobe ip_set

В файле /etc/sysconfig/iptables-config в параметр IPTABLES_MODULES надо добавить ip_set.

### UPDATE IPTABLES

После установки ipset сам по себе он и iptables друг с дружкой работать не будут. То что у iptables нет библиотеки для работы с ipset можно убедится так:

shell> iptables -m set
iptables v1.3.5: Couldn't load match `set':/lib/iptables/libipt_set.so: cannot open shared object file: No such file or directory

Проблема в том что в стандартном репозитории лежит более новая версия. А в репозиторий centalt версия старая версия пакета iptables (с поддержкой ipset). Через yum не поставить, будет предложена последняя версия. Можно конечно отключить стандартные репозитории. Но мне не хотелось ставить старую версию iptables. Тем более после обновления нужная библиотека будет утеряна. Но нам нужна всего одна библиотека libipt_set.so. Потому надо вытащить из rpm из репозитория centalt нужный нам файл.

shell> cd /tmp/
shell> wget http://centos.alt.ru/repository/centos/5/i386/iptables-1.3.5-5.6.1.el5.i386.rpm
shell> rpm2cpio iptables-1.3.5-5.6.1.el5.i386.rpm |cpio -idmv
shell> cp /tmp/lib/iptables/libipt_set.so /lib/iptables/
shell> iptables -m set
iptables v1.3.5: You must specify `--set' with proper arguments
Try `iptables -h' or 'iptables --help' for more information.

Видим что ipset теперь работает без проблем. Судя по исходникам там уже давно ничего не менялось. Думаю должно работать как надо.

### TEST/USAGE

shell> ipset -N test iphash
shell> ipset -A test 192.168.40.153
shell> ipset -A test 192.168.42.4
shell> ipset -L
Name: test
Type: iphash
References: 0
Header: hashsize: 1024 probes: 8 resize: 50
Members:
192.168.42.4
192.168.40.153
shell> iptables -A INPUT -m set --set test src -j DROP

Ключик -N создает новую таблицу, далее указываем как эта таблица будет называться и способ хеширования. Далее добавляем ip. С ключом -L можно посмотреть какие в памяти есть таблицы. В правиле iptables указано, что те ip которые в таблице test, являются источниками и все что с этих адресов поступает надо блокировать.

### END

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

Вот сама библиотека: libipt_set.so.

В очередной раз задумался о переходе на centos 6.3. Уже не первый раз когда нужных, новых пакетов нет под 5.8.

среда, января 09, 2013

CentOS: когда мало памяти...

Проявляется следующим образом: при установки системы версии 6.3 (ранее использовал 5.8, проблем не было) не запускается графический интерфейс установки, только текстовый, который довольно сильно урезан. Установка проводилась в виртуальной машине с памятью 512МБ. Погугле тему оказалось что виноват в этим именно установщик, написанный на python. Он загружает в память образ установки. Когда памяти мало для экономии выбирается текстовый режим установки.

Но проблему можно решить. На просторах интернета нашел вот это. В моем случае было достаточно изменить функцию within_available_memory. И там уже не 15МБ, а все 32 было. Работает.

So the procedure is as follows:

1. Boot to 32-bit CentOS LiveCD (CentOS-6.0-i386-LiveCD.iso) in
graphical mode (if you have at least 256MB RAM) or text mode (if you
have less than 256MB RAM).

2. Login as root.

3. Edit a file /usr/sbin/anaconda - using vim in text mode or gedit in
graphical mode - search for "within" and modify function
"within_available_memory" adding a line "return True" like this:
def within_available_memory(needed_ram):
return True
# kernel binary code estimate that is
# not reported in MemTotal by /proc/meminfo
epsilon = 15360 # 15 MB
return needed_ram < (iutil.memInstalled() + epsilon)
This would get rid of artificial hard-coded memory requirement.
PS Экспериментальным образом было выявлено, что для нормальной работы требуется ровно 632 МБ памяти.

вторник, января 08, 2013

Mac OS: Проверка орфографии в Sublime Text 2


В Sublime Text 2 присутствуем возможность проверки орфографии, но изначально есть только два словаря: английский и немецкий. Словари удобно брать из OpenOffice, только надо произвести некоторые махинации.

Стоит отметить, что "качество работы" со словарем в sublime не очень хорошее. Например нельзя одновременно проверять несколько языков, нельзя добавить свое слово (разве что напрямую редактировать словарь) и нет возможности увидеть правильный вариант слова. Если слово неверное вас просто ставят перед фактом, как написать правильно не сообщается. Это объясняется в основном потому, что этот редактор завоевал успех именно как простоя IDE ко множеству языков программирования, а не как замена MS Word...

Итак, словари скачать по ссылке. Как видим выбор большой:


Загружайте нужный словарь. Скачанный файл будет расширения .oxt. Надо просто переименовать в .rar или .zip. Распаковать. В папке из под архива нам нужно два файла с расширением .aff и .dic. Открываем эти два файла в Sublime Text 2. Скорее всего русский текст в непонятном виде. Значит кодировка файла "неправильная". В файле с расширением .aff самая первая строчка будет иметь что-то типа: SET KOI8-R. Идем в меню file - reopen with encoding и выбираем кодировку указанную выше.  В файле меняем KOI8-R на UTF-8. Далее сохраняем в новой кодировке: в file - save with encoding надо выбрать UTF-8. Со вторым файлом надо надо поступить так же (открыть с нужной кодировкой и сохранить в новой).

Теперь надо эти файлы положить в каталог где лежат словари. Есть папка ~/Library/Application Support/Sublime Text 2/Packages/Language - English/ ее можно переименовать в просто Language. В эту папку скопировать два нужных файла. Сдлать это можно так: откройте консоль и введите команду:

shell> open ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/Language/

В открывшуюся папку перетащите нужные файлы. После этого надо закрыть (cmd + q) Sublime Text 2 и открыть заново. А далее в меню выбрать нужный словарь и нажать F6:


четверг, января 03, 2013

Использование hosts.deny и hosts.allow

С помощью файлов hosts.{deny,allow} можно закрывать и открывать нужным хостам/подсетям доступ к сервису. Обычно это делают с помощью iptables. Но с помощью этих файлов можно произвести какие-то дополнительные действия. Например можно записать лог файл, отправить письмо, сообщить клиенту почему ему запрещен доступ к хосту. И такое можно применить к любому сервису. Если же использовать эти файлы как firewall, то это плохая идея. Iptables справится с этим лучше.

Простой пример как запретить доступ ко всем сервисам:

file hosts.deny
ALL : ALL

file hosts.allow
<must be empty>

Если надо открыть доступ только для ssh (для всех):

file hosts.allow
sshd : ALL

Или если надо открыть доступ к ssh только для подсети:

file hosts.allow
sshd : 192.168.1.

Или только для хоста:

file hosts.allow
sshd : 192.168.1.41
Т.е. в начале читается файл hosts.allow, если есть совпадение правил поиск прекращается, доступ разрешается. Если совпадений нет, поиск производится уже в hosts.deny.

Как видно синтаксис прост:

daemon_list : client_list : option : option ...
daemon_list - список сервисов через пробел
client_list - список клиентов через пробел
option - ALLOW, DENY, spawn, twist, severity
Вот spawn, twist уже куда интересней. Хотя severity тож интересно. Итак надо писать лог-файл когда кто-то заходит по ssh. Напишем скрипт который будет писать лог-файл:

file /root/test
#!/bin/bash
echo `date`" $1" >> /root/log

file hosts.deny
ALL : ALL

file hosts.allow
sshd : 192.168.1.41 : spawn (/root/test "%d(%p) client_ip=%a usename=%u access=allow")
В результате получим файл /root/log:

Thu Jan 3 02:55:43 MSK 2013 sshd(2448) client_ip=192.168.1.41 usename=unknown access=allow
Да, да sshd сам пишет лог. Но это, так сказать, для себя, просто понятней. Это простой пример как можно использовать свой скрипт. При помощи этого инструмента можно поменять PATH для пользователя. Или отправить письмо или еще какие действия в системе сотворить. В общем применение широкое.

Теперь давайте сообщать пользователю почему ему запрещен доступ к сервису.

file /root/test
#!/bin/bash
echo `date`" $1" >> /root/log

file hosts.deny
ALL : ALL spawn (/root/test "%d(%p) client_ip=%a usename=%u access=deny") : twist /bin/echo "You are not welcome to use %d from %h."

file hosts.allow
sshd : ALL EXCEPT 192.168.1.41
Смысл такой - разшеить всем доступ к сервису, запретить только для хоста 192.168.1.41. Чтоб увидеть сообщение надо запустить ssh с ключом -v:

debug1: ssh_exchange_identification: You are not welcome to use sshd from 192.168.1.41.
А в лог-файле будет:

Thu Jan 3 03:14:50 MSK 2013 sshd(2494) client_ip=192.168.1.41 usename=unknown access=deny
В общем широкое применение. Дополнительно надо читать:

man 5 hosts_options
man 5 hosts_access
man tcpd

среда, января 02, 2013

Установка python3 из исходников в CentOS6.3

Имеем абсолютно чистый CentOS6.3 x64. Я устанавливаю систему из образа minimal. Задача: поставить python 3.

Так как у нас, будем считать, только что поставленная система, то нам надо настроить сеть. Отредактировать в файле /etc/sysconfig/network-scripts/ifcfg-eth0 параметр ONBOOT с no на yes. А далее так (предполагается что у вас уже настроен DHCP в сети):

shell> searvice network restart
shell> yum update
shell> yum install gcc-c++ wget make
shell> wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tar.bz2
shell> bzip2 -cd Python-3.3.0.tar.bz2 |tar xf -
shell> cd Python-3.3.0
shell> ./configure --prefix=/opt/python3.3
shell> make && make install
shell> ln -s /opt/python3.3/bin/python3.3 /usr/bin/python3.3

Устанавливаем в каталог для того, чтоб избежать возможных конфликтов с установкой python через yum.

пятница, октября 19, 2012

gpg, nginx, key

При установке nginx (doc) в debian 6 вылезает ошибка:

W: GPG error: http://nginx.org squeeze Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ABF5BD827BD9BF62

Лечится так:

shell> gpg --keyserver hkp://keys.gnupg.net --recv-keys ABF5BD827BD9BF62
gpg: requesting key 7BD9BF62 from hkp server keys.gnupg.net
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 7BD9BF62: public key "nginx signing key " imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
shell> gpg -a --export 7BD9BF62 | apt-key add -
OK

вторник, октября 02, 2012

NAT

Задача: разрешить пользователям локальной сети иметь доступ к ресурсам глобальной сети (Internet).

ОС: CentOS v5.8

Все действия выполняются от пользователя root. Настроим NAT. eth0 - локальная сеть, eth1 - интернет.:

shell> iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
shell> echo 1 > /proc/sys/net/ipv4/ip_forward
shell> /etc/init.d/iptables restart

MASQUERADE - удобно использовать, если у вас динамический IP. Отредактировать в файле /etc/sysctl.conf параметр:

net.ipv4.ip_forward = 1

Применить настройки:

shell> sysctl -p

Если требуется чтоб пользователи могли из локальной сети подключатся к удаленным VPN PPTP серверам тогда потребуется модуль ip_nat_pptp.. Для этого надо отредактировать файл /etc/sysconfig/iptables-config добавив нужные модули:

IPTABLES_MODULES="ip_nat_pptp ip_nat_ftp"

И перезапустить iptables:

/etc/init.d/iptables restart

После этого больше ничего делать не потребуется.

И напоследок минимальный скрипт, который дает доступ только к http/https и разрешает пинговать внешние ресурсы:

!/bin/bash

ipt="/sbin/iptables"
lan="eth0"                      # lan
wan="eth1"                      # wan
subnet="192.168.40.0/22"        # local subnet


# flush all
$ipt -F
$ipt -X
$ipt -t nat -F
$ipt -t nat -X


# policy default
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD DROP

# allow lo
$ipt -A INPUT -i lo -j ACCEPT

# permit established
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# permit ssh
$ipt -A INPUT -p tcp --dport 22 -j ACCEPT

# permit ports
$ipt -t filter -A FORWARD -s $subnet -p tcp -m multiport --dport http,https -j ACCEPT
$ipt -t filter -A FORWARD -s $subnet -p icmp -j ACCEPT

# NAT (lan -> wan)
$ipt -t nat -A POSTROUTING -o $wan -j MASQUERADE
$ipt -t filter -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# save iptables rules
service iptables save

Этот скрипт надо запускать каждый раз когда вы вносите в него изменения. После всех изменений сами правила для iptables будут сохранены в /etc/sysconfig/iptables. Именно его система будет загружать при загрузке системы.


вторник, сентября 25, 2012

Установка ipt_NETFLOW v1.8 в CentOS 5.8 (PAE)


Сенсор ipt_NETFLOW считается самым быстрым, в прямом смысле этого слова, для отдачи статистики по протоколу netflow. Систему не грузит, работает молненосно :)

ВЕРСИЯ СИСТЕМЫ

Система centos 5.8:

shell> uname -a
Linux temp.test.local 2.6.18-308.13.1.el5PAE #1 SMP Tue Aug 21 17:50:26 EDT 2012 i686 i686 i386 GNU/Linux

УСТАНОВКА ИНСТРУМЕНТАРИЯ

Устанавливаем набор инструментов и исходники ядра:

shell> yum install iptables-devel gcc gcc-c++ kernel-headers kernel-PAE-devel make

Если у вас процессор без PAE то надо указать kernel-devel.

ИСХОДНИКИ ipt_NETFLOW

Загружаем исходники модуля:

shell> wget http://citylan.dl.sourceforge.net/project/ipt-netflow/ipt-netflow/ipt_netflow-1.8.tgz
shell> tar xf ipt_netflow-1.8.tar
shell> mv ipt_netflow-1.8 /usr/local/src/
shell> cd /usr/local/ipt_netflow-1.8/

КОМПИЛЯЦИЯ

Начинаем собирать:

shell> ./configure
(...)
  Now run: make all install
shell> make all install
make -C /lib/modules/2.6.18-308.13.1.el5PAE/build M=/usr/local/src/ipt_netflow-1.8 modules_install
make: *** /lib/modules/2.6.18-308.13.1.el5PAE/build: Нет такого файла или каталога.  Останов.
make: *** [minstall] Ошибка 2

Покавырявшись немного стало понятно - нет симлинка на исходники ядра:

shell> ln -s /usr/src/kernels/2.6.18-308.13.1.el5PAE-i686/ /lib/modules/$(uname -r)/build

Проверяем привильно ли все:

shell> file /lib/modules/$(uname -r)/build
/lib/modules/2.6.18-308.13.1.el5PAE/build: symbolic link to `/usr/src/kernels/2.6.18-308.13.1.el5PAE-i686/'

И опять собираем моудль:

shell> ./configure
(...)
  Now run: make all install
shell> make all install
(...)
shell> depmod

Проверяем установился ли модуль:

shell> modinfo ipt_NETFLOW
filename:       /lib/modules/2.6.18-308.13.1.el5PAE/extra/ipt_NETFLOW.ko
version:        1.7.2
description:    iptables NETFLOW target module
author:         
license:        GPL
srcversion:     43F3959209576499C33AB98
depends:        x_tables
vermagic:       2.6.18-308.13.1.el5PAE SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
parm:           destination:export destination ipaddress:port (charp)
parm:           inactive_timeout:inactive flows timeout in seconds (int)
parm:           active_timeout:active flows timeout in seconds (int)
parm:           debug:debug verbosity level (int)
parm:           sndbuf:udp socket SNDBUF size (int)
parm:           hashsize:hash table size (int)
parm:           maxflows:maximum number of flows (int)
parm:           aggregation:aggregation ruleset (charp)

Опа! А версия то 1.7.2.

АВТОЗАГРУЗКА МОДУЛЯ

Раз модуль относится к iptables то пусть он его и подгружает. Логично? Логично. Но не рабоатет. Редактируем файл /etc/sysconfig/iptables-config, находим там параметр IPTABLES_MODULES и приводим его к такому виду:

IPTABLES_MODULES="ip_nat_pptp ip_nat_ftp ipt_NETFLOW"

У меня тут еще кое что есть, так что ненужное можно удалить. Создаем файл /etc/modprobe.d/ipt_netflow.conf с содержимым:

options ipt_NETFLOW hashsize=160000 destination=127.0.0.1:8818

Т.е. сенсор ipt_NETFLOW будет отсылать на 127.0.0.1:8818 данные о трафике. Именно на этот IP:PORT надо вешать коллектор. Перезапускаем систему и ... Не работает. Модуль как бы загружен, но он не подвязался к сетевому интерфейсу lo. Проблема в том, что iptables загружается немного раньше, чем система начинает грузить сеть:

shell> ll /etc/rc3.d/ |grep iptables
lrwxrwxrwx 1 root root 18 Сен 17 14:45 S08iptables -> ../init.d/iptables
shell> ll /etc/rc3.d/ |grep network
lrwxrwxrwx 1 root root 17 Сен 19 13:19 S10network -> ../init.d/network

По цифаркам видно, что грузится первее. iptables загружается первым, интерфейса lo еще нет, в dmesg попадает сообщение remove destination 127.0.0.1:8818. Все пропало...

Когда встала проблема я полез в сеть искать решение. И все что я нашел было как у меня. Т.е. все запускали ipt_NETFLOW как я, через конфиг iptables. Такое чувство, что никто никогда не перезагружает сервера (я ради теста перезагружал :)). Возможно проблема в чем-то другом.

Заставить загружать модуль номально удалось лишь указав загрузку через /etc/rc.local:

shell> echo modprobe ipt_NETFLOW >> /etc/rc.local

ПРОВЕРКА РАБОТЫ СЕНСОРА

Проверить работу можно так:

shell> cat /proc/net/stat/ipt_netflow 
Flows: active 14 (peak 100 reached 0d0h5m ago), mem 0K
Hash: size 160000 (mem 625K), metric 1.0, 1.0, 1.0, 1.0. MemTraf: 304 pkt, 15 K (pdu 77, 4004).
Timeout: active 1800, inactive 15. Maxflows 2000000
Rate: 286 bits/sec, 0 packets/sec; Avg 1 min: 1630 bps, 0 pps; 5 min: 1419 bps, 0 pps
cpu#  stat: , sock: , traffic: , drop: 
Total stat:      1   1087   1216,    0    0    0    0, sock:     42 0 0, 56 K, traffic: 2303, 0 MB, drop: 0, 0 K
cpu0  stat:      0      0      0,    0    0    0    0, sock:      0 0 0, 0 K, traffic: 0, 0 MB, drop: 0, 0 K
cpu1  stat:      1   1087   1216,    0    0    0    0, sock:     42 0 0, 56 K, traffic: 2303, 0 MB, drop: 0, 0 K
sock0: 127.0.0.1:8818, sndbuf 110592, filled 0, peak 0; err: sndbuf reached 0, other 0

Незабудте убрать модуль из конфига iptables (/etc/sysconfig/iptables-config).

Все настроено. Осталось настроить правила в iptables (пример есть в исходниках - README) и настроить какой нить коллектор для принятия данных отсылаемых сенсором.

UPDATE 10/04/2012
Есть еще один способ загружать ipt_NETFLOW во время загрузки системы. В файл /etc/sysctl.conf добавить вот эти параметры:

net.netflow.flush = 0
net.netflow.maxflows = 2000000
net.netflow.aggregation =
net.netflow.destination = 127.0.0.1:8818
net.netflow.sndbuf = 110592
net.netflow.hashsize = 160000
net.netflow.debug = 0
net.netflow.inactive_timeout = 15
net.netflow.active_timeout = 1800

А в файл /etc/sysconfig/iptables-config отредактировать параметр:

IPTABLES_MODULES="ipt_NETFLOW"

Такой способ более правильный


пятница, августа 17, 2012

Проверка состояния диска в linux

Предположим есть подозрения - диск в системе стал работать плохо (битые файлы, глюки системы). Что делать? Первое и самое простое - проверить состояние дисков. Посмотреть SMART диска можно довольно просто:

shell> smartctl --all /dev/sda
(...)

В SMART атрибутах надо обратить внимание на важные параметры:

Raw_Read_Error_Rate
Reallocated_Sector_Count
Current_Pending_Sector

Первый атрибут покажет как часто возникают ошибки при чтении данных. Второй параметр покажет сколько раз была произведена операция remapping (битый сектор помечается как не рабочий). А третий указывет сколько секторов уже накрылись.

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

Проверить поверхность диска на bad блоки можно командой:

shell> badblocks -v /dev/sdb
(...)

Лучше всего в начале посмотреть SMART, проверить диск и еще раз сравнить SMART. Если атрибуты выше начнуть увеличиваться - значит диск надо срочно менять.

вторник, июля 24, 2012

Установка zabbix agent на synology

Работу сетевого хранилища можно контролировать через SNMP протокол. Параметры, которые можно контролировать, великое множество. Но это проще сказать, чем сделать. Если учесть, что производители еще и сами добавляют свои MIB в устройства, то разобираться в выдаваемых параметрах можно очень долго.

Но славо богу есть системы мониторинга. Я пользуюсь Zabbix. В нутри сетевых хранилищ Synology установлен linux. В систему можно установить менеджер пакетов - ipkg. С помощью этого менеджера можно установить различные пакеты. Zabbix среди пакетов нет. Потому будем устанавливать из исходников.

# ipkg install gcc make bison flex gconv-modules adduser
(...)
# cd
# mkdir soft
# cd soft/
# wget http://citylan.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.0.1/zabbix-2.0.1.tar.gz
# tar zxf zabbix-2.0.1.tar.gz
# cd zabbix-2.0.1
# ./configure --enable-agent

Скорее всего выскочит ошибка:

checking for ICONV support... no
configure: error: Unable to find iconv.h "no"

Делаем так:

# ln -s /opt/include/ /usr/include

Можете еще убедится что файл iconv.h находится именно в /opt/include/:

# find / -name iconv.h

Собираем и устанавливаем:

# make
# make install

Сразу создадим группу и пользователя для работы сервиса:

# addgroup zabbix
# adduser -G zabbix zabbix

И создадим каталог для логов:

# mkdir /var/log/zabbix/
# msk-soft-srv> chown zabbix:zabbix /var/log/zabbix/

Редактируем конфиг /usr/local/etc/zabbix_agentd.conf:

PidFile=/tmp/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
Server=192.168.42.4
ListenIP=192.168.41.32
ListenPort=10050
SourceIP=192.168.41.32

(Некоторые параметры не обязательны.)

Пришлось написать init скрипт. Создать файл /usr/local/etc/rc.d/zabbix_agentd.sh со след. содержимым:

#!/bin/sh

# author: Konstantin Kruglov
# email: kruglovk@gmail.com
# www: k0st1an.blogspot.com
# description: init script for use on synology devices
# version: 0.1, 07/24/2012
# usage:
# cp zabbix_agend.sh /usr/local/etc/rc.d/
# chmod +x /usr/local/etc/rc.d/zabbix_agend.sh
########################################################

ConfFile="/usr/local/etc/zabbix_agentd.conf"

if [ -e ${ConfFile} ]; then
 if [ -r ${ConfFile} ]; then
  source ${ConfFile}
 else
  echo "Config file (${ConfFile}: problem read)"
  exit 1
 fi
else
 echo "Config file (${ConfFile} not found)"
 exit 1
fi


Status=`pidof zabbix_agentd > /dev/null && echo $?`

case "$1" in

start)
 echo -n "Start zabbix_agentd..."

 if [ -z "${Status}" ]; then
  /usr/local/sbin/zabbix_agentd -c ${ConfFile}

  if [ "${?}" = "0" ]; then
   sleep 1
   echo " ok"
   exit 0
  else
   sleep 1
   echo " false"
   exit 1
  fi
 else
  echo "Zabbix already run"
  exit 1;
 fi
 ;;
stop)
 echo -n "Stop zabbix_agentd..."

 if [ -z ${Status} ]; then
  echo " not runing"
  exit 1
 fi

 if [ -e "${PidFile}" ]; then
  kill `cat ${PidFile}`
  
  if [ "${?}" = "0" ]; then
   sleep 1
   echo " ok"
   exit 0
  else
   sleep 1
   echo " false"
   exit 1
  fi
 fi
 ;;
status)
 echo -n "Status zabbix_agentd..."

 if [ -z ${Status} ]; then
  echo " not runing"
 else
  echo " runing"
 fi

 exit 0
 ;;
*)
 echo "Usage: ${0} {start|stop|status}"
 exit 1
 ;;
esac

(версия поновее)

На сервере мониторинга:

# zabbix_get -s 192.168.41.32 -k system.cpu.util[,system,]
0.938541

P.S.
Скрипт не доделан. Есть желание сделать перезапуск сервиса и дотестировать до конца. Пока проблем не замечено. У вас есть право использовать такие прифексы при компиляции как --prefix, --sysconfdir (дока)