вторник, 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. Возможно, позже напишу и об этом.