Home FreeBSD FreeBSD полезные мелочи
FreeBSD полезные мелочи

Сетевое радио - mod_mp3 к apache1.3

E-mail Печать PDF

Сетевое радио - mod_mp3 к apache1.3

Автор: lissyara.
Оригинал: http://www.lissyara.su/articles/freebsd/www/mod_mp3/

Нашёл в портах интересный модуль mod_mp3 - позволяет сделать из апача сетевую радиостанцию. Причём не тупо вещщающую по списку, а несколько, индивидуально, чтоль... Короче если песня не нравится - жмёшь в ВинАмпе кнопку "следующий" - и он играет следующую :) Удобно. Я себе дома привернул - лень перестраивать список воспроизведения, если что-то добавиться-убавиться, при перезапуска апача сам заново построится :)
Ставим из портов. В портах, на данный момент, представлена версия 0.4 - хотя на сайте разработчика можно взять нестабильную 1.2. Я ставил из портов./usr/home/lissyara/>cd /usr/ports/
/usr/ports/>make search name='mod_mp3'
Port: mod_mp3-0.40
Path: /usr/ports/www/mod_mp3
Info: Apache module to allow MP3 streaming
Maint: Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
B-deps: apache-1.3.34_3 expat-1.95.8_3 perl-5.8.7_2
R-deps: apache-1.3.34_3 expat-1.95.8_3 perl-5.8.7_2
WWW: http://tangent.org/index.pl?lastnode_id=478&node_id=380

/usr/ports/>cd /usr/ports/www/mod_mp3
/usr/ports/www/mod_mp3/>make && make install && make clean
.............................
************************************************************
You've installed mod_mp3, a MP3 streaming module for Apache.

Edit your apache.conf or httpd.conf to enable and setup this
module. Have a look at the files in
${PREFIX}/share/doc/mod_mp3 for information on how to
configure it etc.

Then do this to make it work effective:

# apachectl configtest (see if there are any config errors)
# apachectl restart

************************************************************
/usr/ports/www/mod_mp3/>


Очень советую почитать документацию по программе, идущую в комплекте, особенно FAQ - там несколько толковых примеров. После осмыслении доков раскомментируем в /usr/local/etc/apache/httpd.conf следующие строки:
LoadModule mp3_module libexec/apache/mod_mp3.so
AddModule mod_mp3.c


и туда же добавляем ещё один виртуальный хост (наскока я понял - не обязательно прям уникальное имя, можно обойтись виртуальным хостом на нестандартном порту - но я изгаляться не стал):
####### модуль mod_mp3 #######
<VirtualHost *:80>
# Имя сервера (если обратиться не по имени - не подконнектится...)
# звёздочка - значит любое.
ServerName muzik.lissyara.su
# Админ сервера - если будет ошибка то выводится этот адрес
ServerAdmin Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
# Куда, собственно пишем ошибки сервера
ErrorLog /var/log/httpd-error.log
<IfModule mod_mp3.c>
# Исчо не знаю чё такое
#SetEnvIfNoCase User-Agent mozilla is_a_browser
# Собственно, включен или выключен (On/Off) модуль mp3
MP3Engine On
# Количество одновременных коннектов при воспроизведении
# музона. В оригинальной доке даже правило приводится, как
# его правильно рассчитать, в зависимости от ширины канала.
MP3LimitPlayConnections 4
# Имя Радиостанции (если слушать из-под форточек -
# надо чтобы было в кодировке cp1251, я извратился так:
# echo 'Вы слушаете радиостанцию \"Эхо унитазного бачка...\"' \
# | iconv -f koi8-r -t cp1251 >> httpd.conf
# ну а внутри httpd.conf переместил куда надо в Midnight Commander)
MP3CastName "Вы слушаете радиостанцию \"Эхо унитазного бачка...\""
# Тип радио (классика, рок, попса...)
MP3Genre "Тока RAMMS+EIN"
# Апач шерстит нижеуказанную директорию, составляет список
# всех композиций (рекурсивно) и воспроизводит их
MP3 "/usr/local/smb/movie/muzik/"
# Плэйлист - у меня так и не получилось чтоб с ним заработал
#MP3Playlist /usr/home/lissyara/playlist.txt
# Какой-то режим, наскока я понял - позволяет прилеплять
# комменты к композициям - тоже не пошло...
# MP3Stream On
# Случайное воспроизведение
MP3Random On
# Если эту опцию раскомментировать то показывается список
# всех треков на сервере, и у посетителя есть выбор - какую
# песню слушать, или слушать весь список...
# MP3DefaultOperation select
</IfModule>
</VirtualHost>


Насчёт виртуальных хостов, если будете делать как-то иначе - советую посмотреть документацию по apache. Там всё толково разжёвано. Перезапускаем апач:/usr/local/etc/apache/>/usr/local/etc/rc.d/apache.sh restart
Stopping apache.
Waiting for PIDS: 22982.
Starting apache.
/usr/local/etc/apache/>ps -ax | grep httpd
27508 ?? Ds 0:02,85 /usr/local/sbin/httpd
27685 p0 S+ 0:00,02 grep httpd
/usr/local/etc/apache/>


И по адресу и порту указанному в настройках слушаем музыку :) Надо сразу отметить - если музыки в указанной директории много (у меня 13Gb, 2500 файлов) то запуск апача займёт некоторое время - ему же надо пройтись по всем директориям и составить список. Опять-таки у меня, с тем количеством файлов, что указано, на AMD K6-II 550MHz на запуск уходит секунд 30. Ещё столько же после этого он чё-то делает и только после этого начинает играть музыка. Загрузка проца сервера не очень большая - на моей машине это было 1-2% на каждого клиента. Копейки.
Также учтите - пользователь www должен иметь право доступа к музыке - хотя б чтение. Впрочем, если Вы специально не ограничивали права на диркторию и музыкальные файлы - всё должно быть пучком.

Косяки: Если файл с "интересным" бирейтом, типа 135 и подобное, не кратное двум, то воспроизводится он вдвое быстрей чем положено :)

Обновлено 28.05.2010 13:24
 

Установка p2p-сервера на ОС FreeBSD

E-mail Печать PDF

Установка p2p-сервера verlihub

Автор: catdog_.
Оригинал - http://www.lissyara.su/articles/freebsd/programms/verlihub/

У меня в городской локалке трафик в пределах района бесплатный. Собственна решил объединить юзеров района, чтобы могли обмениваться файлами нахаляву :)
Сейчас у меня FreeBSD 6.3 BETA2, но и на 6.2 хаб вставал и работал без проблем.

Ставим сервер из портов:
cd /usr/ports/net-p2p/verlihub/
make install clean


Устанавливается без ошибок и прочих проблем.
Для работы хаба нужен запущенный сервер баз данных MySQL. Как его поставить и настроить уже писал lissyara (http://www.lissyara.su/?id=1189). Читаем, ставим, запускаем и проверяем :)
//> /usr/local/etc/rc.d/mysql-server status
mysql is running as pid 48383.


или вот так:
/usr/MY/> ps -aux | grep mysql
mysql 22262 0,0 0,2 5180 4696 p1- IN 18:38 0:00,10 /usr/local/libexec/
mysql 48349 0,0 0,1 1748 1272 p1- I 17:22 0:00,01 /bin/sh /usr/local/
mysql 48381 0,0 0,2 5180 4696 p1- SN 17:22 0:00,01 /usr/local/libexec/
mysql 48382 0,0 0,2 5180 4696 p1- SN 17:22 0:00,04 /usr/local/libexec/
mysql 48383 0,0 0,2 5180 4696 p1- IN 17:22 0:00,00 /usr/local/libexec/


Сервер БД работает - можно запускать хаб.
Сначала даем команду
vh-install


и отвечаем на несколько вопросов (в большинстве случаев достаточно нажать enter).
--------------------------------
Your name ? (root)

Hello root,
let's start with configuration of database access..

--------------------------------
mysql database for verlihub will be called? (verlihub)
mysql user to access verlihub gonna be? (verlihub)
password to access verlihub be? (1195486071)
mysql server will run where? (localhost)
--------------------------------
user = verlihub
password = 1195486071
host = localhost
database = verlihub
--------------------------------
This database account cannot be accessed
--------------------------------
Is this info correct ? (Y/N)y
Do you want to create database now? (Y/N)

--------------------------------

root, you need to choos a place for the configuration files
--------------------------------
The order of folder that verlihub is looking for is following:

1 - variable $VERLIHUB_CFG - -inexisting-
2 - ./.verlihub - /root/.verlihub -inexisting-
3 - /root/.verlihub - /root/.verlihub -inexisting-
4 - /usr/local/etc/verlihub - /usr/local/etc/verlihub -inexisting-
5 - /etc/verlihub - /etc/verlihub -inexisting-
if two or more of these exist, lower number has priority
--------------------------------

--------------------------------
what is will be the configuration folder ? (/etc/verlihub)
The config folder /etc/verlihub does not exist and would be created
--------------------------------
Do you want to continue with these settings
(if not then select another folder) ? (Y/N)y
--------------------------------
Written: /etc/verlihub/dbconfig

--------------------------------

ERROR: Your installation is NOT complete
Either you were unable to create database or config folder
Without both valid I cannot continue
Come back with necessary info, permissions and running mysql server and run me again


Странно, но нарисовало ошибку :) Пробуем снова
/root/> vh_install
--------------------------------
Your name ? (root)

Hello root,
let's start with configuration of database access..

--------------------------------
mysql database for verlihub will be called? (verlihub)
mysql user to access verlihub gonna be? (verlihub)
password to access verlihub be? (1195486071)
mysql server will run where? (localhost)
--------------------------------
user = verlihub
password = 1195486071
host = localhost
database = verlihub
--------------------------------
This database account cannot be accessed
--------------------------------
Is this info correct ? (Y/N)y
Do you want to create database now? (Y/N)y
--------------------------------
Ok preparing mysql..
You probably need administrator access to mysql database
mysql administrator username? (root) root

--------------------------------

You'll be now promted by mysql client for password of root@localhost
Enter password:
--------------------------------
This database account exists
--------------------------------

--------------------------------

root, you need to choos a place for the configuration files
--------------------------------
The order of folder that verlihub is looking for is following:

1 - variable $VERLIHUB_CFG - -inexisting-
2 - ./.verlihub - /root/.verlihub -inexisting-
3 - /root/.verlihub - /root/.verlihub -inexisting-
4 - /usr/local/etc/verlihub - /usr/local/etc/verlihub -inexisting-
5 - /etc/verlihub - /etc/verlihub drwxrwxrwx
if two or more of these exist, lower number has priority
--------------------------------

--------------------------------
what is will be the configuration folder ? (/etc/verlihub)
This config folder already exists and may be overwitten (with a backup)
--------------------------------
Do you want to continue with these settings
(if not then select another folder) ? (Y/N)y
Do you want to overwrite the existing configuration ? (Y/N)y
--------------------------------
FYI: original configuration has been moved to /etc/verlihub/_backup
Written: /etc/verlihub/dbconfig

--------------------------------

Wait few seconds..
/usr/local/bin/vh_install: line 65: 22060 Killed: 9 $bindir/verlihub 22 >&/dev/null
--------------------------------
root, now I will ask you few more questions about your future hub, if you permit..

--------------------------------
Try to not put many special characters, you'll be able to put some laer

Give me your DC hub master nickname.. ([SU]root) Catdog
Choose your password.. (1195486402) 12345
Which will be default ONE hub port number? (411)
What will be your hub hostname? (catdog.sampo.ru)
Give me the name of your hub (hub of root) MyHub
--------------------------------
Hub: 'MyHub'
url: 'dchub://catdog.sampo.ru:411'
Master user: 'Catdog'
Master's password: '12345'
--------------------------------
Is this info correct ? (Y/N)y
FYI: settings are going to be created or updated
/etc/verlihub
/etc/verlihub
/etc/verlihub
will invoke the command
class is 10
nick is Catdog
password is 12345
done


На этот раз успешно :) Пришло время запустить наконец сервер (не забудь добавить в /etc/rc.conf строку verlihub_enable="YES"):
/root/> /usr/local/etc/rc.d/verlihub start
Starting verlihub.
/root/>


Теперь нужно выбрать клиента, и законнектиться с хабом. Я выбрал linuxdc (на старых версиях у него были проблемы при скачке с кодировками, сейчас все ОК)
cd /usr/ports/net-p2p/linuxdcpp/
make install clean


Теперь заходим на хаб из linuxdc под главной учеткой (у меня Catdog) с паролем (у меня 12345). В приват придут поздравления :)
Рулить хабом очень просто.
Чтобы получить текущие настройки, дай команду
!getconfig


Список настроек упадет в приват. Чтобы изменить настройку, скажи
!set "что меняешь" "на что меняешь"


, например,
!set hub_name NewName


Это изменит текущее имя хаба на NewName. После смены настроек дай команду
!reload


Я обычно изменяю следующие настройки: переименовываю ботов, ставлю минимальную шару (1гб), ограничиваю длину ников и сообщений юзеров. Остально по желанию :).
Сообщение дня (motd) - выводится когда входишь на хаб, правила, фак - обычные текстовые файлы, находящиеся в папке с конфигом хаба (помните: what is will be the configuration folder ? (/etc/verlihub)). Там можно понаписать (или нарисовать в ASCII) чего угодно :) (возможно так же сделать разные сообщения для разных юзеров типа админов, простых смертных, операторов и т. д.)
Кикать юзера (без кавычек)
!kick "ip" "причина"


банить не сложнее
!ban_2w "ip" "причина"


время задается цифрой с буквой: Second - s; Minute - m; Hour - h; Day - d; Week - w; Month - M; Year - y.
Разбанить
unban "ip" "причина"


Послать широковещательный спам можно командой
!broadcast Хаб отправляется в ребут. Заходи через минуту или пошел ты нафек :))


Осталось зарегать соседа в качестве админа, чтобы самому не делать грязную работу и готово :) (5 - это группа админов)
!regnewuser user 5


Ну вот и все. Нафлудил на районном форуме о хабе и народ потянулся :).
P.S. Полный мануал по хабу инсталлится сюда
/usr/local/share/doc/verlihub/verlihub_manual.html

Обновлено 28.05.2010 18:14
 

Мониторинг ICQ-переписки с помощью AimSniff

E-mail Печать PDF

Оригинал: http://www.lissyara.su/articles/freebsd/programms/aimsniff/
Постановка задачи
Необходимо создать систему, позволяющую перехватывать, хранить и отображать в удобной форме ICQ-переписку сотрудников компании. Судя по диалогам на соответствующих форумах, рассматриваемая задача периодически возникает, поэтому я описал один из способов ее решения, примененный в нашей Компании.

Исходные данные
Имеется сервер с FreeBSD, через который сотрудники компании тем или иным способом (NAT, прокси-сервер и т.п.) выходят в Интернет. Для установки системы не требуется какая-либо перенастройка этого сервера. Самое главное - Вы должны тем или иным способом ограничить список портов, которые могут использовать клиенты ICQ, чтобы продвинутые пользователи не смогли "обмануть" сниффер.
В качестве сниффера мы будем использовать AimSniff, для хранения перехваченныйх сообщений - сервер MySQL (процесс настройки сервера MySQL не расматривается в данной статье за исключением создания базы данных и пользователя aimsniff), для просмотра отчетов - Web Aim Sniff (WAS) и Web-сервер Apache (процесс настройки сервера Apache не рассматривается в данной статье за исключением добавления возможности отображения необходимых отчетов). Почти все перечисленное программное обеспечение будет устанавливаться из портов, поэтому я настоятельно рекомендую Вам обновить их перед выполнением действий, описанных ниже (лично я использовал FreeBSD 7.0 и последние на конец 2008 года версии портов для нее). Ссылки на источники информации будут приводиться применительно к конкретным разделам статьи.

Установка и настройка AimSniff
Установку AimSniff необходимо выполнить из портов:cd /usr/ports/security/aimsniff
make install clean


Сразу после завершения установки необходимо выполнить команду: aimsniff -d=bge1 --nodb


Естественно, bge1 необходимо заменить на имя внутреннего интерфейса. Данная команда запускает мониторинг пакетов ICQ, проходящих через заданный интерфейс, и отображение содержимого декодированных пакетов на экране без записи в базу данных. Если после выполнения команды вместо сообщений "INCOMINMG MESSAGE..." и "OUTGOING MESSAGE..." выдается сообщение: "Can't locate GDBM_File.pm in @INC (…) at /usr/local/bin/aimsniff line 47. BEGIN failed--compilation aborted at /usr/local/bin/aimsniff line 47., следует пересобрать Perl с поддержкой GDBM: cd /usr/ports/lang/perl5.8
make deinstall
make WITH_GDBM=yes reinstall


По умолчанию AimSniff "не понимает" интересующие нас сообщения в кодировке UTF-8. Для исправления такого поведения необходимо загрузить пропатченную версию скрипта AimSniff и установить порт p5-Unicode-Map8 (если он не был установлен ранее): fetch http://www.aimsniff.com/releases/aimSniff.Cyr-005.tar.gz
tar -xf aimSniff.Cyr-005.tar.gz
chmod 555 aimSniff.Cyr-005.pl
mv aimSniff.Cyr-005.pl /usr/local/bin
cd /usr/ports/converters/p5-Unicode-Map8
make install clean


Для проверки работоспособности руссифицированного AimSniff необходимо выполнить команду: aimSniff.Cyr-005.pl -d=bge1 --nodb


После того, как первичная настройка будет завершена, необходимо создать базу данных aimsniff и пользователя aimsniff для работы с этой базой данных. Для этого нужно запустить клиент MySQL командой: mysql -u <имя пользователя-администратора> -p


ввести пароль и выполнить три SQL-запроса: CREATE DATABASE aimsniff;
GRANT ALL ON aimsniff.* TO aimsniff@localhost IDENTIFIED BY 'aimsniff';
FLUSH PRIVILEGES;


После завершения работы клиента MySQL необходимо создать таблицы базы данных aimsniff: mysql -u <имя пользователя-администратора> -p aimsniff \
< /usr/local/share/doc/aimsniff/table.struct


После завершения подготовки базы данных необходимо создать файл конфигурации AimSniff. В моем случае он называется aimSniff.cfg, находится в папке /usr/local/etc и имеет следующее содержимое: dev=bge1
filter='tcp and port 3128'
daemon=1
host=localhost
database=aimsniff
user=aimsniff
password=aimsniff
useSyslog=1


В данном файле заданы следующие значения параметров: dev - имя интерфейса; filter - фильтр, определяющий какие пакеты следует "вылавливать" (зависит от способа выхода клиентов ICQ в Интернет, в моем случае для выхода клиентов ICQ в Интернет используется прокси-сервер, "слушающий" порт 3128); daemon - признак работы в режиме демона; host / database / user / password - параметры доступа к базе данных; useSyslog - признак использования syslog'а для записи служебных сообщений.
Самым последним этапом настройки AimSniff является доработка скрипта автозапуска, выполняемого при запуске операционной системы. Образец такого скрипта поставляется в составе AimSniff (файл rc.aimsniff в папке /usr/local/share/doc/aimsniff), однако его нужно немного адаптировать. Во-первых, нужно указать корректный интерпретатор shell в первой строке (в моем случае это /bin/sh), а во вторых заменить имя скрипта и файла конфигурации в шестой строке на: /usr/local/bin/aimSniff.Cyr-005.pl -C=/usr/local/etc/aimSniff.cfg


После этого необходимо сделать скрипт исполняемым и скопировать его в папку usr/local/etc/rc.d: cd /usr/local/share/doc/aimsniff
chmod 555 rc.aimsniff
cp rc.aimsniff /usr/local/etc/rc.d/aimsniff.sh


На этом настройка AimSniff заканчивается. Перезагрузите сервер, и после запуска операционной системы демон AimSniff начнет "вылавливать", декодировать и записывать перехваченные сообщения ICQ в базу данных.

Установка и настройка WAS
WAS (Web Aim Sniff) - Web-интерфейс для доступа к базе данных AimSniff, написанный на языке PHP. К сожалению, пока он не добавлен в коллекцию портов FreeBSD, в связи с чем придется ставить его из исходных тестов. Перед началом установки WAS необходимо добавить в файл конфигурации необходимого виртуального хоста Apache следующие строки:Alias /was "/usr/local/www/was/"
<Directory "/usr/local/www/was">
AuthName "This server require authorization!"
AuthUserFile /usr/local/etc/apache/htpasswd
AuthType Basic
Require user <Список пользователей, которым разрешен доступ>
Order deny,allow
Deny from all
Allow from ...
Allow from ...
</Directory>


Как видно из фрагмента файла конфигурации для установки WAS была выбрана папка /usr/local/www/was, доступ к которой разрешен только с определенных IP-адресов и только после прохождения процедуры Basic-аутентификации. Вам нужно подставить реальные IP-адреса в директивы Allow from и добавить необходимых пользователей в файл htpasswd и директиву Require user. О том, как это сделать, подробно написано в разделе Authentication, Authorization, and Access Control официальной документации Apache. Не забудьте перезапустить Web-сервер после внесения изменений в его конфигурацию.
Когда Web-сервер будет подготовлен, необходимо загрузить, распаковать и переместить WAS в нужную папку, удалить все лишнее и сделать владельцем файлов WAS пользователя, от имени которого работает Web-сервер:mkdir /usr/local/www/was
cd /usr/local/www/was
fetch http://aimsniff.com/releases/was-0.1.2b.tar.gz
tar -xf was-0.1.2b.tar.gz
mv was-0.1.2b/* was-0.1.2b/.[a-zA-Z]* .
rm -Rf was-0.1.2b was-0.1.2b.tar.gz
chown -R www:www * .[a-zA-Z]*


После этого необходимо слегка подкорректировать файлы WAS. Во-первых, в файлах .header.php и index.html неоходимо исправить charset=iso-8859-1 на charset=koi8-r (это приведет к корректному выбору кодировки браузером и, соответственно, корректному отображению русских символов). Во-вторых, в файле index.php необходимо исправить img src=./typesGraph.php на img src=./images/typesGraph.php (это исправит ошибку, допущенную разработчиком WAS). В третьих, мне показалось более удобным видеть в списке сообщений не IP-адреса, а имена компьютеров локальной сети. Если Вы согласны со мной, исправьте в файле .global.php <td><B>IP</td> на <td><B>Computer</td>, а также исправьте в теле функции printMessages $rs["ip"] на ucwords(gethostbyaddr($rs["ip"])). Вообще, следует заметить, что WAS - очень "сырой" пакет. К сожалению, у меня нет времени на его адаптацию, да и PHP я знаю лишь поверхностно, поэтому в настоящий момент приходится довольствоваться тем, что есть. Все работает, хотя за эргономику я бы не поставил больше тройки.
После доработки файлов WAS необходимо открыть в браузере URL http://host.company.com/was/admin.php, естественно, изменив host.company.com на имя используемого Вами виртуального хоста. В браузер будет загружена страница, на которой можно задать параметры WAS. В первую очередь необходимо изменить параметры Database User / Database Password и нажать кнопку Submit. Остальные параметры могут быть изменены или не изменены, исходя из личных предпочтений. На этом настройка WAS заканчивается.

Заключение
С учетом простоты рассмотренной системы с одной стороны и огромной популярностью ICQ с другой Вам скорее всего удастся выявить не один и не два эпизода неправильного использования рабочего времени, а возможно и "слива" конфиденциальной информации. Бесспорно, система не является панацеей, однако даже несколько выявленных случаев с лихвой окупят время, потраченное на ее настройку.

Обновлено 28.05.2010 13:41
 

Построение виртуального свитча из нескольких сетевых карт с использованием Netgraph.

E-mail Печать PDF

Построение виртуального свитча из нескольких сетевых карт с использованием Netgraph.




Итак
Виртуальный свич из нескольких сетевух на нетграфе.
Ситуация такая:
на сервере интерфейс rl0 смотрит наружу, в локалку провайдера 10.*.*.*.
а vr0 и vr1 смотрят во внутреннюю сеть 192.168.0.*
Для удобства хотелось бы чтобы в домашнюю сеть смотрела одна сетевуха, а все компы домашней сети были подключены к серверу через свич. Реализуем задуманное на основе ядерного модуля ng_bridge!


Кому лень читать статью полностью, выкладываю свой скрипт. Скрипт предоставляется "As Is" - что то тут лишнее, что то кривое... Конструктивная критика приветствуется. Наличие необходимых зависимостей подразумевается. #!/bin/sh
ngCtl="/usr/sbin/ngctl "
Sleep="/bin/sleep"
PFcmd="/sbin/pfctl"
Head="/usr/bin/head"
Tail="/usr/bin/tail"
Echo="/bin/echo"
Rm="/bin/rm"

PidFile="/var/run/mybridge.pid"

if1="vr0"
if2="vr1"
ifng="ngeth0"
Switch="switch"

case $1 in
start)
if [ -s $PidFile ]; then
${Echo} Bridge already runned!
exit 1
fi
${Echo} Starting bridge
${ngCtl} debug 2
${ngCtl} mkpeer $if1: bridge lower link0
${ngCtl} name $if1:lower $Switch
${ngCtl} connect $if1: $Switch: upper link1
${ngCtl} connect $if2: $Switch: lower link2
${ngCtl} connect $if2: $Switch: upper link3
${ngCtl} msg $if1: setpromisc 1
${ngCtl} msg $if2: setpromisc 1
${ngCtl} msg $if1: setautosrc 0
${ngCtl} msg $if2: setautosrc 0
${ngCtl} mkpeer $Switch: eiface link5 ether
${ngCtl} name $Switch:link5 $ifng
${Sleep} 2
${Head} -n7 /etc/pf.conf.bak > /etc/pf.conf
${Echo} 'int_if="'$ifng'"' >> /etc/pf.conf
${Tail} -n79 /etc/pf.conf.bak >> /etc/pf.conf

ifconfig $if1 -alias
ifconfig $ifng inet 192.168.0.1 netmask 255.255.255.0

${PFcmd} -f /etc/pf.conf
${Echo} "runned" >> $PidFile

;;
stop)
if [ ! -s $PidFile ]; then
${Echo} Bridge is not runned!
exit 1
fi
${ngCtl} shutdown $Switch:
${ngCtl} shutdown $ifng:
${Head} -n7 /etc/pf.conf.bak > /etc/pf.conf
${Echo} 'int_if="'$if1'"' >> /etc/pf.conf
${Tail} -n79 /etc/pf.conf.bak >> /etc/pf.conf
ifconfig $if1 inet 192.168.0.1 netmask 255.255.255.0

${Rm} $PidFile
${PFcmd} -f /etc/pf.conf
;;
*)
if [ -s $PidFile ]; then
${Echo} State: Up
else
${Echo} State: Down
fi
;;
esac


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

Начнем с необходимого - с нетграфа. Вот список того, что стоит у меня:# kldstat -v |grep ng
202 ng_socket
181 ng_car
201 ng_rfc1490
200 ng_pptpgre
177 ng_async
199 ng_ppp
180 ng_bridge
198 ng_one2many
197 ng_nat
176 ng_UI
196 ng_mppc
195 ng_lmi
179 ng_bpf
194 ng_l2tp
175 ng_netflow
193 ng_ksocket
192 ng_ipfw
191 ng_ip_input
190 ng_iface
189 ng_hole
188 ng_gif_demux
187 ng_gif
186 ng_framerelay
185 ng_ether
184 ng_echo
183 ng_deflate
207 ng_vjc
206 ng_tty
205 ng_tee
204 ng_tcpmss
203 ng_ng_split
182 ng_cisco
2 1 0xc0945000 2fd4 ng_eiface.ko
1 ng_eiface
# kldstat -v |grep netgraph
178 netgraph


Как видно из всего этого необходим минимум ng_eiface, который я забыл(или поленился) положить в ядро. Кроме того нам понадобятся модули ng_ether и ng_bridge. Но никто не запрещает побаловаться с ng_tee, ng_ipfw и чем-нибудь подобным для подсчета трафика, шейпинга et cetera...

После загрузки модулей нужных модулей смотрим что мы имеем# ngctl list
There are 6 total nodes:
Name: <unnamed> Type: eiface ID: 0000001e Num hooks: 0
Name: rl0 Type: ether ID: 00000001 Num hooks: 0
Name: vr0 Type: ether ID: 00000002 Num hooks: 0
Name: vr1 Type: ether ID: 00000003 Num hooks: 0
Name: ngeth0 Type: ether ID: 00000003 Num hooks: 0
Name: ngctl38473 Type: socket ID: 0000be26 Num hooks: 0



Мы должны видеть узлы типа ether по числу реальных интерфейсов, виртуальный интерфейс ngeth0 и соответствующий ему и узел socket, который служит для связи ngctl с ядром(это уже мои измышления. Подробнее - man ng_socket && man ngctl). Еще мы видем один безымянный узел - это родственник ngeth0, они создаются и уничтожаются только вместе.

Далее нам надо сделать мост. Но просто так его нельзя создать, его надо на что то прицепить. Прицепим хук link0 к хуку lower сетевухи vr0. Сказано - сделано. Попутно обзовем его каким нибудь нехорошим именем, типа switch# ngctl mkpeer vr0: bridge lower link0
# ngctl name vr0:lower switch


Вот тут надо остановиться и поподробнее рассказать о том, что такое хуки(hooks), узлы(nodes), какие они бывают и с чем их едят. Нетграф - это система, которая строит граф, по которому бегают данные. В графе есть узлы и ребра. Иногда узел может просто висеть в воздухе(как например узлы наших сетевух), но чаще чтобы добавить какой то узел надо его к чему ни будь прикрутить. Прикручивание происходит соединением хуков разных узлов. После соединения между хуками появляется ребро по которому могут бегать данные от одного узла к другому. Хуки бывают разные и у каждого типа узла они свои. Какие то пропускают пакеты только в одну сторону, какие то пускают только пакеты верхних сетевых протоколов, подробнее про типы узлов написано в манах, а пока про насущное.
У сетевух(узлов типа ether) есть три хука - upper, lower, и orphans. Грубо говоря, lower работает с нижними протоколами(ethernet), upper - с верхними, а про orphans не помню, но он мне не вроде не подошел. У bridge - до NG_BRIDGE_MAX_LINKS(у меня на 7.2 в src/sys/netgraph/ng_bridge.h:55 говорится про 32 хука) хуков с именами типа link0 link1 link2... У eiface только один хук, - ether - через который бегают все пакеты.
При обращении к локальным узлам пишем двоеточие в конце имени. Обращаться можно как по имени, так и по ID. в последнем случае вместо <node_name>: пишется [0x<node_id>]:

С теорией вроде закончил, перейдем к практике. Продолжаем строит свич: цепляем к мосту остальные хуки сетевушек# ngctl connect vr0: switch: upper link1
# ngctl connect vr1: switch: lower link2
# ngctl connect vr1: switch: upper link3


Идем далее. Сетевухи имеют свойства выпуская пакет прописывать в нем поле отправитель себя и игнорировать пакеты, предназначенные не ей. Отучаем их от этих нехороших привычек:# ngctl msg vr0: setpromisc 1
# ngctl msg vr1: setpromisc 1
# ngctl msg vr0: setautosrc 0
# ngctl msg vr1: setautosrc 0


Свич почти готов. цепляем к нему виртуальную сетевуху, чтобы общаться с ним
# ngctl mkpeer switch: eiface link5 ether
# ngctl name switch:link5 ngeth0


И далее самое интересное. снимаем ипы с реальных сетевух(порты свича не имеют ипов) и ставим внутренний ип(у меня это 192.168.0.1) машины на виртуальную сетевуху. Реальные карточки должны быть без ипов только в состояниии UP# ifconfig vr0 up
# ifconfig vr1 up
# ifconfig vr0 -alias
# ifconfig vr1 -alias
# ifconfig ngeth0 inet 192.168.0.1 netmask 255.255.255.0


Вроде бы и все.
Смотрим что у нас получилось:# ifconfig
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8<VLAN_MTU>
ether <XXX>
inet 10.XXX.XXX.XXX netmask 0xffffXXX broadcast 10.XXX.XXX.XXX
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST>
metric 0 mtu 1500
options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
ether <XXX>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vr1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST>
metric 0 mtu 1500
options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
ether <XXX>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
ngeth0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 00:00:00:00:00:00
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
<overquoting deleted>
# ngctl list
There are 17 total nodes:
Name: <unnamed> Type: ksocket ID: 0000be23 Num hooks: 1
Name: <unnamed> Type: pptpgre ID: 0000be22 Num hooks: 2
Name: <unnamed> Type: eiface ID: 0000001e Num hooks: 1
Name: ng0 Type: iface ID: 0000bd94 Num hooks: 1
Name: rl0 Type: ether ID: 00000001 Num hooks: 0
Name: switch Type: bridge ID: 00000014 Num hooks: 5
Name: vr0 Type: ether ID: 00000002 Num hooks: 2
Name: vr1 Type: ether ID: 00000003 Num hooks: 2
Name: mpd16513-stats Type: socket ID: 0000bd9a Num hooks: 0
Name: ngctl38842 Type: socket ID: 0000be2a Num hooks: 0
Name: mpd16513-cso Type: socket ID: 0000bd92 Num hooks: 0
Name: mpd16513-eso Type: socket ID: 0000bd93 Num hooks: 0
Name: mpd16513-lso Type: socket ID: 0000bd91 Num hooks: 1
Name: ngeth0 Type: ether ID: 0000001f Num hooks: 0
Name: mpd16513-B1-mss Type: tcpmss ID: 0000be24 Num hooks: 2
Name: mpd16513-B1 Type: ppp ID: 0000bd95 Num hooks: 3
Name: mpd16513-L1-lt Type: tee ID: 0000bd96 Num hooks: 2

# arp -a
? (10.XXX.XXX.XXX) at <XXX_MAC> on rl0 [ethernet]
------------------------``----------------------------------
? (192.168.0.2) at <XXX_MAC> on ngeth0 [ethernet]
? (192.168.0.3) at <XXX_MAC> on ngeth0 [ethernet]
? (192.168.0.255) at ff:ff:ff:ff:ff:ff on ngeth0 permanent [ethernet]


Примечание: записи вида ? (10.XXX.XXX.XXX) at <XXX_MAC> on rl0 [ethernet] - адреса из локалки провайдера)

Как видно, сетевухи vrX смирились со своей ролью в качестве портов свича и на них не висят маки соседих машин. Все выглядит так, будто у нас есть свич, в который воткнуты кабеля машин внутренней сети и кабель от нашего компа с интерфейса ngeth0(любопытно, что ifconfig и arp по разному определяют его мак). самого свича, как и полагается, не видно

Дальше разруливаем все пакеты файером, в нем разрешаем прохождение пакетов через реальные внутренние сетевухи(или шейпим/режем по надобности), ставим нат с внешней сетевухи на ngeth0, раздача инета между сетевухами моста будет регулироваться нетграфом. В общем ведем себя так, как будто у нас появился свич и исчезли две сетевухи.






Обновлено 28.05.2010 13:42
 

portdowngrade - откатываем нужный порт до любой ранее версии

E-mail Печать PDF

portdowngrade - откатываем нужный порт до любой ранее версии



Статья не моя, но хотелось чтобы всё было на одном ресурсе, чтобы вдруг чего не мучать бедный гугл.
Автор статьи: DonRumata

И так, буду цитировать со своими поправками, так как его статья уже старовата, думаю автор злиться не будет.
Поехали:

Иногда случается, что обновленный порт отказывается работать или несовместим с уже установленным старым софтом. Вот в этом случае иногда проще вернуть все как было, но как это сделать?

В этом случае весьма полезной оказывается утилита portdowngrade.
Итак, первым делом устанавливаем эту самую утилиту:# cd /usr/ports/ports-mgmt/portdowngrade
# make DEFAULT_CVS_SERVER=" Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript :/home/ncvs" install clean
# rehash


Далее как работает данный софт:

portdowngrade ведет логи на установленном по умолчанию cvs сервере (или определенном опцией -s ) и просматривает все изменения, потом отображает предыдущие версии и обновляет дерево портов (только выбранный порт). То есть если надо откатить большое кол-во портов, придётся откатывать по отдельности.

Например, апгрейд до php 5.2.0 прошел неудачно и остались мы без пхп совсем, хочеться вернуться на версию 5.1.x. Первым делом сообщим утилите portdowngrade(1) вывести результаты о php5.# portdowngrade lang/php5

portdowngrade 0.6 by Heiner Eichmann
Please note, that nothing is changed in the ports tree
unless it is explicitly permitted in step 6!

Seeking port lang/php5 ...

Found several matches:
1: lang/php5
2: lang/php5-extensions

Please choose one: 1


В данном случае выбрали версию 1. Теперь утилита обратится к CVS и предложит выбрать до какой ветки вернуть порт. Downgrading port: lang/php5

Step 1: Checking out port from CVS repository
CVS root directory: Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript :/home/ncvs
The authenticity of host 'anoncvs1.freebsd.org (216.38.206.185)' can't be established.
DSA key fingerprint is 4d:59:19:7b:ea:9b:76:0b:ca:ee:da:26:e2:3a:83:b8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'anoncvs1.freebsd.org' (DSA) to the list of known hosts.

Step 2: Reading the port history from the CVS repository

Step 3: Analyzing the port history from the CVS repository

Step 4: Load port version numbers and present results
Keys: <space> : next page d : details
p : previous page
<enter> : leave presentation and downdgrade if wanted


Далее пойдет список версий, с комментариями о добавлении/фиксах в продуктеnumber date portversion comment
1 2006/11/12 19:43:12 5.2.0 Update suhosin patch to 0.9.6.2 release.
2 2006/11/06 17:43:10 5.2.0 Update to 5.2.0 release.
3 2006/10/27 19:11:17 5.1.6 Update suhosin patch to 0.9.6 release.
4 2006/10/16 09:30:58 5.1.6 - fix open_basedir vulnerability in php4 and php5 [1]
5 2006/10/06 17:24:21 5.1.6 Enable suhosin patch by default.
6 2006/10/05 20:59:17 5.1.6 Added safety checks against integer overflow.
7 2006/09/29 19:11:40 5.1.6 Update suhosin patch to 0.9.5 release.
8 2006/09/10 16:37:43 5.1.6 Add support for QDBM.
9 2006/09/09 12:35:33 5.1.6 Update suhosin patch to 0.9.3 release.
10 2006/09/04 07:59:15 5.1.6 - Add experimental suhosin protection system support
11 2006/08/31 14:37:05 5.1.6 Update to 5.1.6 release.
12 2006/08/18 16:41:29 5.1.5 Update to 5.1.5.
13 2006/08/18 16:40:18 5.1.4 Allow php5-ldap to be built with SASL support enabled.
14 2006/07/11 13:21:54 5.1.4 Add databases/php5-oci8:
15 2006/05/23 06:19:19 5.1.4 Try to fix build on 4.X.
16 2006/05/18 22:17:32 5.1.4 - Holy Batman! Chase rerolled distfile.
Only chance is an addition of a file
17 2006/05/10 14:46:43 5.1.4 Chase gmp library and bump PORTREVISION.
Total lines: 152. Command:


Далее нажимаем Enter, или Пробел для прокрутки списка(не приходилось) и выбираем номер версии до которой нужно откатиться, на пример до версии 5.1.6 - номер 3 в списке.Enter version number to change port to (0: exit): 3


Далее подтверждаем выбор нажатием Enter и ждём :)Step 5: Checking out choosen date of the port from the CVS repository

Step 6: Modifying the port
Port: lang/php5
at : 2006/10/27 19:11:17
Type 'yes' to bring the port to the state of the date above
or 'no' to exit without changing anything. Note, that this only changes
the port, not the installed software! yes or no:yes


Подтверждаем физический откат порта, пишем "yes", что нам и нужно.
Если мы хотим посмотреть изменения, без физического отката, пишем "no"

Вот собственно и произошел откат порта.
Добиваем наше дело до конца:# portupgrade -f php5*


Ну и проверяем какая картина получилась:# pkg_info | grep php5


Вот собственно и всё, очень полезная утилита, выручила при откате erlang(ejabberd не совместим с erlang-r13*, только с ветками r12 и ниже)

Обновлено 28.05.2010 13:42
 


Страница 3 из 5.

  • Вопросы по поводу написанных статей можно обсудить в нашем сообществе в Вконтакте / Questions about written articles can be discussed in our community in Vkontakte Вопросы по поводу написанных статей можно обсудить в нашем сообществе в  Вконтакте / Questions about written articles can be discussed in our community in Vkontakte
Яндекс.Метрика