понедельник, 7 декабря 2009 г.

Default size в Gnome Terminal

В настройках Gnome Treminal я не нашел, где меняется размер терминала.

Менять нужно вручную командой:

gconftool-2 /desktop/gnome/applications/terminal/exec --type string -s 'gnome-terminal --geometry=132x43'

среда, 2 декабря 2009 г.

Если в Centreon Reporting показывает статус UNDETERMINED

Бывает, чтов разделе  Reporting системы мониторинга Centreon статус по сервисам и хостам становится UNDETERMINED.

Я знаю два варианта решения проблемы:
1. Выполнить последовательно пару команд:
/usr/share/centreon/bin/logAnalyser -a
/usr/share/centreon/cron/archiveDayLog -r


2. Процитирую:
In the Centreon 2.0 webinterface go to

Configuration > Centreon > ndomod.cfg > Poller Prinzipal (or however it is named)

Now have a look at “Data processing options”. If it is set to “-1”
nothing will be written to the database. In order to get it working you
need to enter the correct value. Use “67108863” if “everything” should
be written to the database. The German company Consol offers a free online calculator for the data_processing_options-setting.

четверг, 17 сентября 2009 г.

Как в Midnight Commander открывать файлы приложениями по-умолчанию


Рецепт не мой, взял здесь. Итак, как, например, файл с расширением .pdf открывать из Midnight Commander?


Очень просто, нужно Коммандер научить использовать default приложения DE. Эта настройка делается в файле ~/.mc/bindings. В случае KDE файл выглядит так:

### Default ###

# Default target for anything not described above
default/*
Open=kfmclient exec %f
View=

### EOF ###


Для GNOME:
### Default ###

# Default target for anything not described above

default/*
Open=gnome-open %f
View=
#
#
# ### EOF ###
#
Ну, а чтобы при открытии из mc не лез всякий мусор и лишние строки, после команды запуска лучше написать: >/dev/null 2>&1
Т.е. команда примет вид:

Open=gnome-open %f >/dev/null 2>&1

UPD. Если есть gnome, но вдруг нет gnome-open, можно поставить libgnome2-0.

понедельник, 10 августа 2009 г.

Что делать с blocked updates в ubuntu?

Это тоже бекап памяти, ну и для поисковиков. Что-то теперь начиная с версии 9.04 у меня в Kubuntu при обновлении пакетов несколько остаются необновленными с пометкой blocked updates. Все не могу запомнить параметр full-upgrade )). В общем, лечится так:

sudo aptitude update
sudo aptitude full-upgrade

Как узнать версию ubuntu?

Этот пост - бекап памяти для себя. Часто нужно посмотреть версию убунту, а uname -a сообщает информацию о ядре. Информация о версии дистрибутива лежит в файле /etc/issue. Так что:

cat /etc/issue

среда, 10 июня 2009 г.

Activex в Linux

Бывает нужно. Рецепт нашел здесь

http://www.gagme.com/greg/linux/activex-linux.php

вторник, 26 мая 2009 г.

Если Openoffice не запускается после обновления

Сегодня поставил ooo 3.1 от Инфраресурса, и он отказывался запускать writer, calc и пр. Запускался только мастер создания документов.

В консоли при этом была ошибка:

terminate called after throwing an instance of 'com::sun::star::uno::RuntimeException'

Проблема решилась после удаления из домашней директории скрытой папки .openoffice.org:

rm -rf ~/.openoffice.org

среда, 20 мая 2009 г.

Проблемы с клавиатурой в Vmware+гостевая FreeBSD в Linux

Часто при установке виртуальной FreeBSD в VMWare Workstation под линуксом возникают проблемы с клавиатурой. Тупо не работают клавиши.

Решение представляет собой одну строку, которую нужно добавить в конец файла /etc/vmware/config:

xkeymap.nokeycodeMap = "TRUE"

вторник, 7 апреля 2009 г.

Доступ к shell в m0n0wall

Если к девайсу с m0n0wall на борту подключить монитор и клавиатуру, то доступ в shell будет предоставлен. Но как сделать это удаленно? Ведь в последних версиях m0n0wall и Nano Wall уже нет ssh.

Очень просто. Это можно сделать из web-интерфейса. Все ясно из рисунка, достаточно лишь в строке адреса добавить exec.php


вторник, 31 марта 2009 г.

Kill dash nine (к 1 апреля :-))

Фифтицент поет про то, что было близко ему - улицы и бандитизм. Этому парню близка жизнь в университетском городке и phd, поэтому он исполняет песенки в стиле nerdcore. Приветствуем Monzy с песенкой про kill -9.




Computer Science rap at Stanford

Как распаковать многотомный архив rar в Linux

Сегодня столкнулся сам и при поиске решения увидел, что многие не знают, как разархивировать побитый на части rar-архив. Делается так.

unrar имя_последнего_файла_архива


В некоторых версиях unrar нужно указать параметр e для распаковки.

unrar e имя_последнего_файла_архива

Как видим, элементарно :-)). Так что этот пост просто для поисковиков, чтобы следующим, нуждающимся в разархивации, было легче искать.

понедельник, 30 марта 2009 г.

Как сделать бекап системы на лету

Часто очень удобно делать бекап на какой-нибудь сервер в сети. SSH в сумме с такими средствами бекапа как dump/restore или dd предоставляет для этого хорошие возможности.

На самом деле, все просто. Достаточно взглянуть на команды. Вот backup с помощью dump/restore:

ssh alexey@192.168.0.1 'sudo dump -af- /dev/hda2' | dd of=hda.dump

Восстанавливается потом командой:

restore -rf hda.dump

А вот сразу с восстановлением:

ssh alexey@192.168.0.1 'sudo dump -af- /dev/hda2' | restore -rf-

а это с помощью dd:

ssh alexey@192.168.0.1 'sudo dd if=/dev/hda2' | dd of=backup.img

среда, 25 марта 2009 г.

Как работать с образами файловых систем

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

Как сделать образ CD
Делается это одной командой dd:

dd if=/dev/scd0 of=my_image.img


где /dev/scd0 - это наш cd-rom, my_image.img - файл образа.
Чтобы дело пошло быстрее, можно увеличить размер блока данных, например, до 16-ти килобайт:

dd if=/dev/scd0 of=my_image.img bs=16k

Естественно, вместо cd-rom'а может быть любое дисковое устройство. Да и вообще, образ и дисковое устройство могут поменяться местами, например, если мы восстанавливаем информацию из образа на диск:

dd if=my_image.img of=/dev/sdb bs=16K

Отлично, образ готов. Что с ним делать дальше?

Как монтировать образ
Для начала проассоциируем образ с дисковым устройством образов.
если дело в Linux:

losetup /dev/loop0 my_image.img

появится устройство /dev/loop0

если во FreeBSD:

mdconfig -a -t vnode -f my_image.img


появится устройство /dev/md0 или вроде того.

Далее можно производить монтирование:

mount /dev/loop0 /mnt/

По окончании работы с образом нужно отмонтировать его и снять ассоциацию.
в Linux:

umount /mnt
losetup -d /dev/loop0


во FreeBSD:

umount /mnt
mdconfig -d -u 0      #для md0


Как создать образ диска с нуля
Например, нужно создать образ ФС размером ~512 Мб с файловой системой ext3.

# Создадим файл образа, count отвечает за количество блоков
root@till:~/TMP# dd if=/dev/zero of=my_image.img bs=1k count=512000
512000+0 records in
512000+0 records out
524288000 bytes (524 MB) copied, 18,6485 s, 28,1 MB/s

# Создадим ассоциацию
root@till:~/TMP# losetup /dev/loop0 my_image.img

# Создадим файловую систему, тут нам помогут fdisk и mkfs
root@till:~/TMP# fdisk /dev/loop0
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x58bbc7e9.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-63, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-63, default 63): +512M
Value out of range.
# Не угадал с размером :-)
Last cylinder, +cylinders or +size{K,M,G} (1-63, default 63): +500M
Value out of range.
# Опять не угадал
Last cylinder, +cylinders or +size{K,M,G} (1-63, default 63): +450M
# Угадал!
# Установим тип фс=Linux (это номер 83)
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 83

# Запишем изменения и выйдем
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 22: Invalid argument.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

# Форматируем наш новый виртуальный диск
root@till:~/TMP# mkfs.ext3 /dev/loop0
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
128016 inodes, 512000 blocks
25600 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
63 block groups
8192 blocks per group, 8192 fragments per group
2032 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

# Готово, можно монтировать
root@till:~/TMP# mount /dev/loop0 /mnt/
root@till:~/TMP# ls /mnt
lost+found
root@till:~/TMP#

Примерно так.

понедельник, 23 марта 2009 г.

Терминальный сервер на Linux за полчаса

Один из клиентов спросил, а заработает ли на наших железках LTSP. И я решил протестировать.

Вообще LTSP - это Linux Terminal Server Project, т.е. предназначен для организации работы терминального сервера на основе Linux. Клиенты при этом грузятся по сети (PXE), т.е. на серваке связка: dhcp+tftp. Навскидку помню две сетевухи, в которых есть поддержка PXE: Realtek 8139 и Intel eepro100. Кроме бездисковой загрузки может быть загрузка с дискет и т.п. Изначально LTSP включен в дистрибутивы: Ubuntu, k12 и вроде как в федору. В остальных легко устанавливается из репозиториев. Я для тестов выбрал Ubuntu 8.10 (alternate cd). Вся установка сводится к тому, чтобы нажать в самом начале инсталляции F4 и выбрать "LTSP server" в меню, дальше происходит обычная установка убунты, после которой автоматом ставится и настраивается LTSP.



Пара замечаний: ip на серваке только статический и желательно его прописать в момент установки, если же ip после установки менялся, нужно выполнить ltsp-update-sshkeys, т.к. ltsp использует ssh. Вот магическая формула:
LTSP = DHCP + TFTP + X11 (в виде ldm display manager) + ssh.
Сразу же по окончании установки LTSP сервера я запустил наш тонкий клиент, для чистоты эксперимента отключив от него CF-флешку, с которой грузится наш софт... и спустя 2 минуты уже работал через него на серваке. По сравнению с RDP порадовало следующее: изображение лучше, скорость тоже, с раскладкой клавиатуры проблем не возникло, USB-флешка подцепилась сразу же. Клава PS/2, мышь - USB.
В общем, кому нужно быстро организовать терминальный сервер на линуксе, рекомендую LTSP.


пятница, 20 марта 2009 г.

Как сделать свою базу знаний в Firefox

Unix админам, программистам и просто увлекающимся ежедневно приходится читать массу документации online. Что-то прочесть не успеваешь, но хочешь прочесть потом; что-то настолько нравится, что хочется сохранить на будущее. Как быть? Ответом является плагин ScrapBook для Firefox.

Воспользуйтесь поиском по плагинам мозиллы и поставьте себе Scrapbook. В Меню-баре появится соответвующий пункт. Далее все просто.
Я люблю вызывать плагин комбинацией клавиш Alt+K. Слева при этом открывается список ваших папок и сохраненных страниц. Чтобы занести нужную web-страницу в базу нужно просто перетащить ссылку из строки адреса, нажимая при этом Ctrl. Появится меню с параметрами сохранения, где можно выбрать глубину ссылок (можно качать целые сайты), название заметки, скачивать ли файлы, которые есть на сайте.
Также к сохраненным страницам можно применять инструменты, имеющиеся в ScrapBook справа внизу: маркеры для выделения текста, примечания, теги, инструменты DOM. На последних остановимся подробнее.
Сайты часто обвешаны боковыми панелями с рекламой, календарями и прочими вещами, которые нам в базе знаний не нужны и которые осложняют печать текста. Так вот с помощью кнопки DOM можно удалять эти элементы с легкостью. Главное, не забыть сохранить изменения. Ниже приведены варианты страницы до и после DOM-обработки.

ДО:



ПОСЛЕ:



Естественно, есть возможность поиска по базе знаний, импорта/экспорта альбомов, упорядочивания структуры и многое другое.
За несколько лет использования на моих десктопах ScrapBook себя отлично зарекомендовал.

четверг, 19 марта 2009 г.

Полезные LiveCD

Как и многим IT специалистам, мне частенько приходится помогать с техникой родственникам, друзьям и знакомым. Так вот в этом своем эникействе я в полной мере ощутил преимущества LiveCD дистрибутивов Linux.

Нужно удалить файлы, доступ к которым блокируется виндой даже в безопасном режиме? - Пожалуйста, для LiveCD с этой т.з. все файлы одинаковы.
Нужно восстановить данные с дискеты? - dd есть практически в любом дистре.
Нужно восстановить битую таблицу из  Excel - Openoffice из той же Kubuntu вам в руки.
Нужно залить образ роутера на CF карту? - опять же dd.
Вирусы? - DrWeb LiveCD отлично с этим справится.
Для медленных компов подойдет облегченный дистрибутив типа PuppyLinux, а лучше всего его русская реализация проекта PuppyRus. Причем, для совсем старых компов лучше брать версию Retro.
В общем, рекомендую. В первую очередь тем, кто просто хочет посмотреть, что такое Linux..

Как обойтись без proxy-сервера

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

Про то, что есть DynDNS, позволяющий иметь доступ к машинкам с динамически меняющимся публичным IP знают многие. Недавно столкнулся с сервисом OpenDNS. Полезная штука. Позволяет сделать контентную фильтрацию трафика всего лишь прописав вместо провайдерских свои DNS серверы (208.67.222.222, 208.67.220.220). Причем, если на роутере есть DNS forwarder, а он есть почти везде, можно эти DNS прямо на роутере прописывать. Прежде чем начать пользоваться, нужно бесплатно зарегистрироваться на сайте OpenDNS, указать свой IP и что фильтровать. Фильтр очень гибкий, можно отсеивать порно, социальные сети, файлообменники и пр. Можно самому задавать сайты. Если IP динамический, то можно установить программку OpenDNS Updater, берется бесплатно с сайта OpenDNS. Updater периодически сообщает свой адрес, даже из-за NAT'а.
Есть такой же сервис и у Netpolice , но там, если ограничиться только прописыванием DNS-серверов (81.176.72.82б 81.176.72.83), нет настроек, а ограничения очень жесткие. Для большей гибкости нужно ставить спецприложение. Как видно, эти сервисы вполне можно использовать для родительского контроля, NetPolice, собственно, и был создан для отечественных школ.
Со стороны пользователя это выглядит так: пытается зайти на какой-нибудь запрещенный сайт и редиректится на страничку, где сказано, что доступ к сайту закрыт. Список сайтов можно самостоятельно пополнять.
Есть еще сервис DNS-o-Matic, позволяющий автоматом на многих сервисах (OpenDNS, DynDNS, No-IP и пр.) синхронизировать ваш динамический IP.
Напоследок приведу скрин, который отображает возможности фильтра OpenDNS.


среда, 18 марта 2009 г.

Автозапуск приложений в Puppy Linux

Puppy Linux и  его русская реализация PuppyRus, очень удобны для запуска на слабых компьютерах, работающих в режиме киоска. Как правило, в киоск-режиме после загрузки ОС сразу же запускается какое-то приложение, которым и ограничены возможности пользователя. Как обеспечить такой автозапуск?

Делается это довольно просто. Нужно в файле ~/.xinitrc найти и закомментировать строку:

rox -p /root/Choices/ROX-Filter/PuppyPin

и вместо нее добавить команду запуска нужного приложения.
Если приложение нужно запустить после старта window manager, то можно просто поместить скрипт запуска в директорию /root/Startup. Но тогда возможности пользователя ограничиваться не будут.
Приведенный способ с заменой строчки с rox не всегда выручает, т.к. многие программы любят работать в окружении window manager. Так, например, firefox запускается в одиночестве очень криво. Решением является использование комбинированного метода.
Во-первых комментируется приведенная строчка с rox, но вместо нее ничего не добавляется. Во-вторых скрипт запуска программы (того же firefox) кладется в /root/Startup. А чтобы пользователь был ограничен редактируется конфиг WM, в роли которого по дефолту jwm. Из конфига убираются все ненужные строки, соответствующие пунктам меню. Файлы конфига: ~/.jwmrc и ~/.jwmrc-tray.
Вот примеры таких файлов с ограничениями: .jwmrc и .jwmrc-tray.


вторник, 17 марта 2009 г.

Отправка сообщений в pidgin по ctrl+enter



Pidgin - отличный im клиент для джаббера, icq, google talk и т.п. Но многим не нравится, что в pidgin нет возможности настроить отправку сообщений по комбинации клавиш ctrl+enter. Это лечится.

Таких настроек нет в самом интерфейсе IM клиента, но никто не мешает в домашней директории найти файл с именем вроде ~/.gtkrc-2.0 (обратите внимание, что он скрытый) и прописать в конце него следующее:


binding "my-bindings"
{
bind "Return" { "insert-at-cursor" ("\n") }
bind "<ctrl>Return" { "message_send" () }
}
widget "*pidgin_conv_entry" binding "my-bindings"


Если похожего файла нет, нужно его создать. Все заработает после перезапуска pidgin.

Как подключиться к другому терминалу

Часто бывает так, что нужно ставить что-то из исходников, но близится конец рабочего дня и компилятор может не успеть. А из дома было бы интересно узнать результат компиляции и выполнить make install и т.п. Понятно, что можно почитать лог, но как это сделать не потеряв вывода на экран?

Ответом является утилита screen. Screen - это своего рода мультиплексор терминалов, позволяющий одновременную работу в одной сессии. Покажем как его использовать в приведенном выше примере.
Перед началом устанвки создаем сессию:

screen -S first

Запускаем установку и можем ехать домой. Дома же подключившись к нашему серверу по ssh набираем команду:

screen -x first

чтобы подключиться к ранее созданной сессии. Все, теперь мы видим весь процесс установки, запущенный еще на рабочем месте.
Этот метод можно использовать также и  для совместной работы в одном терминале.

Бекап КПК из-под Linux

Обладатели коммуникаторов под управлением Windows Mobile нередко чувствуют затруднения с подключением их к Linux. Оставив пока в стороне вопросы синхронизации адресной книги, расскажу, как я делаю бекап HTC 3300 из Kubuntu.

На самом деле, бекап системы на microSD карточку автоматически делается в WindowsMobile программой SpriteBackup, которая шла в комплекте с коммуникатором. Этот бекап производится раз в неделю. До недавних пор этих мер было достаточно, т.к. казалось, что с флешкой-то ничего не случится. Но в один прекрасный день получилось так, что коммуникатор заряжался от ноутбука через USB, а я тем временем перепрошивал CF карту роутера новой версией ПО. В общем перепрошитой в итоге оказалась флешка коммуникатора. Т.о. я стал делать бекап флешки (раз в месяц).
Для доступа к флешке коммуникатора из Linux я использую программу WM5torage, т.к. в моем коммуникаторе нет режима кард-ридера. Т.е. после того, как коммуникатор подключен к компьютеру и запущена WM5torage, microSD видна как обычная флешка. Дальше дело техники. Сам бекап делается с помощью tar, командой вида:

tar -X htc_exclude.txt -cvvf Backup_htc_flash_20090302.tar /media/disk-1/

где htc_exclude.txt - файл исключений, в котором перечислены директории, которые не нужно заносить в бекап, в моем случае файл выглядит так:

alexey@till:~/Backup$ cat htc_exclude.txt
/media/disk-1/Music
/media/disk-1/tmp

понедельник, 16 марта 2009 г.

Настройка VPN-клиента (PPTP) в Linux

Не секрет, что многих пользователей удерживает от перехода на linux то, что доступ в Интернет местным провайдером предоставляется на основе технологии VPN. Если быть точным, то PPTP. От этого пользователи сталкиваются с ничем не оправданными трудностями.

На самом деле все просто. Покажем это на примере Kubuntu.

Наиболее удобной программой для организации VPN подключения мне представляется kvpnc - графическая оболочка для pptp, openVPN, Cisco VPN и т.д. Как видно из приставки «k» - программа создана для KDE, так что пользователям Gnome, XFCE и пр., возможно, потребуется установить некоторые дополнительные библиотеки.

Для подключения предлагается использовать программу kvpnc.

1. Установка самой программы:

sudo apt-get install pptpd pptp-linux pppd kvpnc

2. После установки программа запускается через меню KDE и появляется мастер настройки. Нужно нажать «Далее».


3. Выбрать «Microsoft PPTP» и нажать «Далее».

4. Выбрать «Требовать MPPE» и нажать «Далее».

5. Ввести «Имя пользователя» и нажать «Далее».

6. Оставить сетевое устройство по умолчанию и нажать «Далее».


7. Выбрать «Keep default route» и нажать «Далее».

8. Оставить значения по умолчанию и нажать «Далее».


9. Оставить значения по умолчанию и нажать «Далее».

10. Ввести имя профиля и адрес VPN-сервера и нажать "Готово".

11. Нажать "Готово".


12. Зайти в настройки и в меню «Command Execution» --> «After Connect» задать маршрут в удаленную сеть через адрес, получаемый от VPN сервера.

13. Для подключения нажать "Connect".

В случае удачного подключения лог-файл /var/log/messages появится примерно такая информация:

Jun 19 10:41:51 till pppd[10123]: pppd 2.4.4 started by root, uid 0

Jun 19 10:41:51 till pppd[10123]: Using interface ppp0

Jun 19 10:41:51 till pppd[10123]: Connect: ppp0 <--> /dev/pts/4

Jun 19 10:41:52 till pppd[10123]: CHAP authentication succeeded

Jun 19 10:41:52 till pppd[10123]: MPPE 128-bit stateless compression enabled

Jun 19 10:41:54 till pppd[10123]: local IP address 192.168.0.193

Jun 19 10:41:54 till pppd[10123]: remote IP address 192.168.0.180

Таблица маршрутизации примет вид:

root@till:~# netstat -nr

Таблица маршутизации ядра протокола IP

Destination Gateway Genmask Flags MSS Window irtt Iface

192.168.0.180 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0

192.168.0.0 192.168.0.193 255.255.255.0 UG 0 0 0 ppp0

10.59.26.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

0.0.0.0 10.59.26.1 0.0.0.0 UG 0 0 0 eth0

Несколько трюков с ng_ipacct

Приведу здесь свою статью 2006 года про ng_ipacct, т.к. ip-lab'а, на котором она была размещена уже нет. В дальнейшем оттуда появится еще пара рецептов.

Инструмент ng_ipacct, разработанный Романом Палагиным, предназначен для сбора статистики о трафике и реализует Cisco ip accounting. Являясь нодой netgraph, он работает полностью в ядре системы, что существенно снижает требования к системным ресурсам. Снятие и обнуление статистики происходит с помощью утилиты ipacctctl.
Инструмент ng_ipacct, разработанный Романом Палагиным, предназначен для сбора статистики о трафике и реализует Cisco ip accounting. Являясь нодой netgraph, он работает полностью в ядре системы, что существенно снижает требования к системным ресурсам. Снятие и обнуление статистики происходит с помощью утилиты ipacctctl. Для возможности работы с ng_ipacct описанными ниже методами нужно скомпилировать ядро с опциями:

options NETGRAPH
options NETGRAPH_ETHER
options NETGRAPH_IFACE

options NETGRAPH_KSOCKET

options NETGRAPH_SOCKET

options NETGRAPH_TEE


Классический метод использования ng_ipacct предполагает, соединение через ng_tee с нодой ng_ether, т.е. трафик считается на ethernet интерфейсе. Приведем пример соответствующего скрипта, который поставляется вместе с исходным кодом самой утилиты.

/sbin/kldload ng_ipacct > /dev/null 2>&1

/usr/sbin/ngctl mkpeer rl0: tee lower right
/usr/sbin/ngctl connect rl0: lower upper left
/usr/sbin/ngctl name rl0:lower rl0_acct_tee
/usr/sbin/ngctl mkpeer rl0_acct_tee: ipacct right2left rl0_in
/usr/sbin/ngctl name rl0_acct_tee:right2left rl0_ip_acct
/usr/sbin/ngctl connect rl0_acct_tee: rl0_ip_acct: left2right rl0_out

В первой строке загружается модуль ng_ipacct, остальные строки иллюстрирует рисунок.




Таким образом, входящий в ethernet интерфейс rl0 трафик с хука lower попадает на ноду rl0_acct_tee, где происходит его копирование на хук upper ноды rl0 и на хук rl0_in ноды rl0_ip_acct. В обратном направлении все происходит аналогично - с хука upper через tee ноду на
хук lower, при параллельном копировании в ng_ipacct. Как видно из примера, нода tee служит для дублирования потоков данных проходящих через нее в обоих направлениях.
При кажущейся простоте метода, сложности все же возникают при необходимости учета трафика на gif и tun интерфейсах, а так же на интерфейсах, работающих в режиме моста, в виду особенностей их реализации. Ниже приведены приемы, позволяющие обойти эти проблемы. Наиболее универсальный способ - это использование правила tee файервола ipfw.

nodename=ipacct_${IFACE}
hookprefix=${IFACE}

/sbin/kldload ng_netflow

ngctl -f- <<-SEQ
mkpeer ipacct ctl ctl
name .:ctl ${nodename}
### хук для входящего трафика
mkpeer ${nodename}: ksocket ${hookprefix}_in inet/raw/divert
name ${nodename}:${hookprefix}_in ${nodename}_in
msg ${nodename}_in: bind inet/0.0.0.0:3021
### хук для исходящего трафика
mkpeer ${nodename}: ksocket ${hookprefix}_out inet/raw/divert
name ${nodename}:${hookprefix}_out ${nodename}_out
msg ${nodename}_out: bind inet/0.0.0.0:3022
rmhook .:ctl
SEQ


В приведенном примере две ноды типа ksocket отправляют в ng_ipacct данные, попадающие в соответствующие сокеты 0.0.0.0:3021 и 0.0.0.0:3022. В эти сокеты трафик направляется правилами файервола:

ipfw add 64021 tee 3021 ip from any to room101 via ${IFACE}
ipfw add 64022 tee 3022 ip from room101 to any via ${IFACE}


При этом следует учитывать, что все запрещающие правила, должны предшествовать правилам tee, т.к. прохождение сетевых пакетов по ipfw заканчивается на этих правилах, и пакеты считаются принятыми. Такую же схему можно реализовать используя правила divert и ноду ng_echo, которая отправляет пришедший поток данных обратно к источнику. Проиллюстрируем это на примере входящего трафика.

/sbin/kldload ng_netflow

ngctl -f- <<-SEQ
mkpeer tee dummy right2left
name .:dummy divert_tee_in
mkpeer divert_tee_in: echo right echo
mkpeer divert_tee_in: ksocket left inet/raw/divert
name divert_tee_in:left divert_sock_in
msg divert_sock_in: bind inet/0.0.0.0:3021
disconnect dummy
mkpeer divert_tee_in: ipacct left2right rl0_in
name divert_tee_in:left2right ng_ipacct
SEQ


В январе 2005 года Gleb Smirnoff опубликовал патч для ноды ng_ipfw, позволяющий копировать трафик из ipfw в netgraph, не прибегая к использованию сокета divert. Это реализуется директивой файервола ngtee. Приведем пример соединения нод.

/sbin/kldload ng_ipacct > /dev/null 2>&1
/sbin/kldload ng_ipfw > /dev/null 2>&1

ngctl -f- <<-SEQ
mkpeer ipfw: ipacct 333 rl0_in
name ipfw:333 rl0_ip_acct
connect ipfw: rl0_ip_acct: 444 rl0_out

SEQ


Трафик перенаправляется в netgraph следующими правилами ipfw:

ipfw add 100 ngtee 333 ip from any to any in
ipfw add 200 ngtee 444 ip from any to any out


Также существует директива netgraph, которую можно использовать совместно с ng_echo, аналогично тому, как это делалось в приведенном выше примере с правилом divert. Проиллюстрируем случай входящего трафика.

/sbin/kldload ng_ipacct > /dev/null 2>&1
/sbin/kldload ng_ipfw > /dev/null 2>&1

ngctl -f- <<-SEQ
mkpeer ipfw: tee 333 left
name ipfw:333 rl0_tee
mkpeer rl0_tee: ipacct left2right rl0_in
mkpeer rl0_tee: echo right qqq
SEQ


Данному примеру будет соответствовать правило ipfw:

ipfw add 100 netgraph 333 ip from any to any in

Попавший в приведенные правила файервола пакет либо будет принят, либо продолжит путешествие по правилам ipfw, в зависимости от значения sysctl переменной net.inet.ip.fw.one_pass (1 - пакет считается принятым, 0 - сравнение продолжается). При этом автор патча сообщает, что такой способ доставки трафика в netgraph более эффективен, чем трюки с tee.

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

PS. А еще добавлю, что с 2006 года в netgraph появились ноды ng_ipfw, связывающая пакетный фильтр ipfw и подсистему netgraph, а также ng_nat, позволяющая делать ядерный NAT. Возможно, позже напишу и об этом.