UltraViolet

Эквилибриум

Эмоциональное преступление

Apache 2.0 mod_rewrite - подводные камни - гавноподелие
UltraViolet
[info]paranoidchaos
Кароче два часа ночи вожусь с одним проектом точнее с модулем новостей и настраиваю под него реврайт рулы у долбанного апача




кста версия старая 2.2.9

вот обычный рул (изменил для проверки)

RewriteEngine on
RewriteBase /

# News content

RewriteRule ^news([0-9]+)/([0-9]+)/(.*)\.html$ news_content.php?id=$1&p=$2 [L]


# Default news list

RewriteRule ^news(.*)$ news.php [F]
                
Первый рул реврайтит ссылку вида http://localhost/news54/3/werwer.html в /news_content.php?id=54&p=3
здеся news54 это идентификатор новости, а /3/ номер текущей страницы (если было место листанию страниц в списке новостей)

Заметим что в конце рула стоит [L] - по документации означает если совпало с паттерном то остановить дальнейшую сверку по рулам (не тут то было - читаем далее)


Второй рул работает по дефроту - реврайтит ссылки вида http://localhost/news(и дальше что угодно) в /news.php [F]
В конце [F] поставлен для проверки (иначе там стоит [L])

И в чём же проблема ?

Так вот - при таком запросе http://localhost/news54/3/werwer.html срабатывает рул по дефолту и соответсвенно получаю форбидден, а должен был получить контент.


Почему так ? - идём дальше


вот логи реврайта

(3) [perdir /usr/local/htdocs/] add path info postfix: /usr/local/htdocs/news54 -> /usr/local/htdocs/news54/3/werwer.html
(3) [perdir /usr/local/htdocs/] strip per-dir prefix: /usr/local/htdocs/news54/3/werwer.html -> news54/3/werwer.html
(3) [perdir /usr/local/htdocs/] applying pattern '^news([0-9]+)/([0-9]+)/(.*)\.html$' to uri 'news54/3/werwer.html'
(2) [perdir /usr/local/htdocs/] rewrite 'news54/3/werwer.html' -> 'news_content.php?id=54&p=3'
(3) split uri=news_content.php?id=54&p=3 -> uri=news_content.php, args=id=54&p=3
(3) [perdir /usr/local/htdocs/] add per-dir prefix: news_content.php -> /usr/local/htdocs/news_content.php
(2) [perdir /usr/local/htdocs/] trying to replace prefix /usr/local/htdocs/ with /
(1) [perdir /usr/local/htdocs/] internal redirect with /news_content.php [INTERNAL REDIRECT]
(3) [perdir /usr/local/htdocs/] strip per-dir prefix: /usr/local/htdocs/news_content.php -> news_content.php
(3) [perdir /usr/local/htdocs/] applying pattern '^news([0-9]+)/([0-9]+)/(.*)\.html$' to uri 'news_content.php'
(3) [perdir /usr/local/htdocs/] strip per-dir prefix: /usr/local/htdocs/news_content.php -> news_content.php
(3) [perdir /usr/local/htdocs/] applying pattern '^news(.*)$' to uri 'news_content.php'
(2) [perdir /usr/local/htdocs/] forcing responsecode 403 for /usr/local/htdocs/news_content.php


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

3) [perdir /usr/local/htdocs/] applying pattern '^news([0-9]+)/([0-9]+)/(.*)\.html$' to uri 'news54/3/werwer.html'
(2) [perdir /usr/local/htdocs/] rewrite 'news54/3/werwer.html' -> 'news_content.php?id=54&p=3'
(3) split uri=news_content.php?id=54&p=3 -> uri=news_content.php, args=id=54&p=3

и дальше по идее происходит интернал редирект (после чего согласно [L] дальнейий проход по рулам должен останавливаться)
так вот при [INTERNAL REDIRECT] апча умудряется ещё раз пропустить реврайнутый запрос (/news_content.php) через реврайт рулы. и это поведение не правильное и не соответсвует действительному по документации  параметра [L] - последний.



и как быть ?

решение есть - если переименовать имя скрипта news_content.php на чё нить подобное ncontent.php и которое бы не пересекалось с регулярными паттернами то всё работает как положенно. То есть при интернал редиректе запрос /ncontent.php не будет матчиться рулу по дефолту.

вот и всё вот такое гавно эти реврайты - при каждом интернал редиректе он будет перепроверять заного все рулы

надобы попробовать сделать лупинг )))


 ps:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
 

Метки: , ,

XDDD я плакал
UltraViolet
[info]paranoidchaos
 http://habrahabr.ru/blogs/erlang/112110/#comment_3584711

Если вы считаете их мусором — Вы, к сожалению, не поняли важной роли исключений в бизнес логике.

Допустим пользователь хочет сохранить текст в файл.
Возможные варианты развития событий:
1) данные успешно сохранились
2) имя файла невалидно
3) такой файл уже существует
4) доступ запрещен (например файл находит на удаленном диске, только для чтения)
5) у пользователя закончилось место на диске.

Если вы обработали только первую ситуацию — вы реализовали всего 20% задачи.

Поездите-ка на машине, разработчики которой уверены, что:
а) везде асфальт
б) вы не ездите под дождем
в) снега не существует
г) аварийный сигнал не нужен (с завода же вышла целая машина)
д) экстренное торможение — это нонсенс!



ну на хрена нужны эти все языки программирования ?

пс: отныне обработка исключений в коде является мусором (синтаксическим) БЛЯЯЯЯЯЯЯЯЯЯЯЯ
Метки:

Вопрос дня: Знание сила
UltraViolet
[info]paranoidchaos

О чем вы хотели бы больше всего узнать и почему?

Прислал(а) [info]willflytosky

Читать ответы (1262)






P = NP

Метки:

infosecurity.ru - null-byte уязвимость
UltraViolet
[info]paranoidchaos
ЫЫ сёдня наткнулся на баг (точнее баги - куда не сунь %00) на сайте http://www.infosecurity.ru 

вот парочка скринов и хеш от аккаунта какого-то

infosec:$1$UMe.btpA$W0ZaqFGN.phL5gmZqV3O9.






Вопрос дня: Любить или быть любимым?
UltraViolet
[info]paranoidchaos

Вы считаете, что в отношениях люди должны быть наравне или думаете, что кто-то все равно отдает больше, чем другой? Что бы вы выбрали - любить или быть любимым?

Прислал(а) [info]shesawhiplash

Читать ответы (1103)


любить
Метки:

Вопрос дня: Любовь к кумиру
UltraViolet
[info]paranoidchaos

Какой ваш самый любимый теле-персонаж всех времен? Почему он на вас так повлиял? Собираете ли вы что-то памятное о нем? Повлиял ли он на вас как-либо в творческом плане?

Прислал(а) [info]call_me_lovey

Читать ответы (855)


ВИКТОР ЦОЙ - ЖИВ !!!
Метки:

http://www.president.nkr.am/ - HACKED - А вам слабо
UltraViolet
[info]paranoidchaos
ну шо бля хацкерьё хайское ???? с джава сервлетами не справились ??? и тупо новость перепостили ?????


UP


СОСИТЕ ХУЙ ГАНДОНЫ

hacked
hacked

hacked

UPD: http://zone-h.org/mirror/id/10605295

Iptables string module, TC HFSC per-user traffic shaping, youtube bandwidth limit
UltraViolet
[info]paranoidchaos
Задача была такая (типичная), что надо было ограничивать пропускную способность канала на каждого пользователя в локальной сети ибо один качает другие сидят и по возможность уменьшить всякое там ютубное видео.

Сразу отмечу канал довольно широкий и пользователей порядка 250.
Схема простая файервол натировал весь трафик идущий на 80 порт прозрачно на сквид (прокси сервер Squid).

1. Трафик шейпинг - больное место.

Сначало сделал шейпинг на уровне сквида (ака delay_pools) вроде работает хех но не тут то было если ставил скорость 512 кбит/с и смотрел ежедневную статистику, то количество использованного трафика было намного больше чем возможно скачать за день на данной скорости. Вывод - пулы работают хренова (особенно если для каждого пользователя (а их 250) прописывать свой пулл).

Поехали дальше - TC (забыл отметить что всё делалось на моей любимой оси RHEL5). Ну про TC рассказывать не буду - у него куча вариантов шейпинга, н отак и не нашёл я чтобы можно было ограничивать скорость по пользователю. Прочёл вариант с HFSC. Он делит канал на куски, что мне и понравилось но примера разделения канала на 250 пользователей я не нашёл. Были банальные типа вот скорость веб трафика и вот скорость остальных и всё. Ну всё же рискнул сделать на каждого пользователя пулл. (о результатах ниже)

2. Ютуб и прочая закачка
Скороть ограниченна качаем смотрим ютуб и нихрена остальные сайты не открываются ну и конечноже звонки звонки а почему скорость слабая ЁПТА

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

3. Как определить закачку ведь любоё сёрфинг по вебу и есть своего рода закачка

Да перво-наперво это типа снифать пакеты и и определять контент и по нему резать (точнее маркировать и отправлять в пулл - об этом ниже). Прогуглив наткнулся на тот же самый layer-7 filter который мог определять разного рода траффик, но как известно из предыдущего поста я от него отказался. Прогуглив ещё наткнулся на модуль STRING от Iptables. Вот он и помог. Модуль просто позволяет искать строку в пакете. Тупа сначало думал буду определять контент по строке Content-Type: video/x-flv в заголовке http пакета, но он не срабатывал всегда. Почитав подробно маны по модулю наткнулся на поиск строки в виде гекса (hex) и понял что определять трафик надо по сигнатурам. Опять тупа сначало начал открывать гексредактором всякие экзешки рары зипы и медиа файлы чтобы достать сигнатуры а потом в сети нашёл сайтик (их много ссылок не даю) где для каждого типа файлов есть сигнатуры. Выбрал все медиа и в основном скачиваемые файлы. И оставалось только пихнуть в правила фаервола.

РЕАЛИЗАЦИЯ

1. Шейпинг
Приведу примеры рабочего шейпинга

#!/bin/bash

TC="/sbin/tc"

for dev in "eth0" "eth1"
do
         ${TC} qdisc add dev ${dev} root handle 1: hfsc default 2
         ${TC} class add dev ${dev} parent 1: classid 1:1 hfsc sc rate 102400kbit ul rate 102400kbit
         ${TC} class add dev ${dev} parent 1:1 classid 1:2 hfsc sc umax 1500b dmax 30ms rate 921600kbit ul rate 921600kbit

         for cid in $(seq 3 250)
         do
                 ${TC} class add dev ${dev} parent 1:1 classid 1:${cid} hfsc sc umax 1500b dmax 53ms rate 512kbit ul rate 512kbi
                 ${TC} filter add dev ${dev} parent 1: prio 1 protocol ip handle ${cid} fw flowid 1:${cid}
         done
done

Задается цикл первый по интерфейсам  (ставим пулы на два интерфейся как на внешний так и на внутренний чтобы ограничивать как скачку так и закачку), потом создаются корневая очередь и дальше корневой класс под номером 1 у которого установил скорость равную скорости сетевой карточки 100Мбит (ака
102400kbit)  и от этого класса создаём ещё один (дефолтовый) клас но скорость его конечноже занижаем ибо будет неправильной (я взял 921600kbit). Как раз в этот дефолтовый класс будут попадать весь прочий траффик.

Далее идёт цикл (уже от 3) и по ровное количество числа всех ваших пользователей. И каждому соответсвенно устанавливается класс со своей скорость и фильтр который будет отправлять траффик маркированный под номером
${cid} в соответствующий пулл-класс шейпера.

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

Далее уже настройки самого фаервола

Для начала посмотрим на табличку ната который натирует пакетики в мир и соответсвенно редиректирует веб трафик прозрачно на прокси. (Показываю содержимое файла правил фаервола /etc/sysconfig/iptables)

*nat
:PREROUTING ACCEPT [36:2655]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -i eth1 -s 10.0.0.0/255.255.255.0 -p tcp --dport 80 -j DNAT --to 10.0.0.1:3128
-A POSTROUTING -s 10.0.0.0/255.255.255.0 -j MASQUERADE
COMMIT


тут всё ясно натируем на прокси пакеты идущие на 80 на порт где слушает сквид.

далее смотрим таблицу mangle

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:SMARK - [0:0]

здесь я создал отдельный чеин
SMARK чтобы динамически легче было работать с добавлением и удалением правил (нах всё стираю и заного по новым правилам заполняю таблицу)

далее следуюут основные правила маркировки (восстанавлениие марки и пропускать пакеты с маркой 0)

-A POSTROUTING -p tcp -j CONNMARK --restore-mark
-A POSTROUTING -p tcp -m mark ! --mark 0x0 -j ACCEPT


я собрал сигнатуры файлов по группам (здесь идуший трафик от сквида --sport 3128 проверяется на сигнатуры и отправляется в чаин который мы создали -- двойное попадание по сигнатурам я думаю не возможно ибо поверка происходит от начала пакета по 600 оффсета )

# Windows EXE           --------  Исполняемые файлы винды

-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|4d 5a 90 00 03 00 00 00 04|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|4d 5a 3c 00 01 00 00 00 02|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|4d 5a 50 00 02 00 00 00 04|" --algo bm --to 600 -j SMARK


# Adobe FWS, CWS, FLV   ----- Адобовский флеш (как копрессированный так и чистый) ну и флв типа там ютубного видео

-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|43 57 53|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|46 57 53|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|46 4c 56 01 05 00 00 00 09|" --algo bm --to 600 -j SMARK


# MP3 (standart), WMA-WMV (ASF), AIFF, AMR, 3GP, AVI, FLAC, MP3_FF, OGG, MOV (QUICKTIME), RM (STREAMING), RA, SHN (LOSLESS), WAV, IVR    ---- это музычка собрал наиболее известные форматы

-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|49 44 33 03|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|30 26 b2 75 8e 66 cf 11 a6 d9 00 aa 00 62 ce 6c|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|46 4f 52 4d 00|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|23 21 41 4d 52 0a 34|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|00 00 00 20 66 74 79 70 33 67 70|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|1e 41 56 49 20 4c 49 53 54 7e|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|66 4c 61 43 00 00 00 22|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|33 44 49|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|4f 67 67 53 00 02 00 00 00 00 00 00 00 00|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|6d 6f 6f 76|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|2e 52 4d 46|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|2e 72 61 fd 00|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|61 6a 6b 67 02 fb|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|57 41 56 45 66 6d 74 20|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|2e 52 45 43|" --algo bm --to 600 -j SMARK



# GZIP, TAR.Z, 7Z, ARC, BZ, ISO, CRU, ZIP (ZIPPK), RAR, ZIP (WINZIP), TAR, RPM  ---- всякие там  архивы

#-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|1f 8b 08|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|1f 9d 90|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|37 7a bc af 27 1c|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|41 72 43 01|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|42 5a 68|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|43 44 30 30 31|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|43 52 55 53 48 20 76|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|50 4b 03 04|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|52 61 72 21 1a 07 00|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|57 69 6e 5a 69 70|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|75 73 74 61 72|" --algo bm --to 600 -j SMARK
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|ed ab ee db|" --algo bm --to 600 -j SMARK

Незнаю заметили или нет но я там закоментировал вторую строчку поиска сигнатур
так вот эта сигнатура поиска GZIP архивов и закоментировал я её потомучто многие веб сервера при отдаче контента сайта гзипуют (сжимают для экономии траффика) контент и в этом случае наше правило срабатывают и сайти гзипованные будут попадат ьв пул на которых будет влиять скорость НО НАМ ЭТОГО НЕ НАДО - сайтики должы открываться быстро

# ELF (Unix/Linux)
-A POSTROUTING -p tcp --sport 3128 -m string --hex-string "|7f 45 4c 46|" --algo bm --to 600 -j SMARK

ну а это исполняемый файлы юниксов ЭЛЬФЫ )) 

Далее нам надо добавлять правила маркировки в чозданный нами чаин
SMARK

-A SMARK -t mangle -s ${ip}/32 -j MARK --set-mark ${class}
-A SMARK -t mangle -d ${ip}/32 -j MARK --set-mark ${class}
-A SMARK -t mangle -p tcp -m mark --mark ${class} -j CONNMARK --save-mark

я каждому пользователю определил свою марку (класс) и содаю для каждого пользователя вы показанные правила
первое для исходящего, второе для входящего и третье правило это сохранение марки

вот как будет выглядеть правила в живую (пример из
/etc/sysconfig/iptables)

-A SMARK -s 10.0.0.2/32 -j MARK --set-mark 0x3
-A SMARK -d 10.0.0.2/32 -j MARK --set-mark 0x3
-A SMARK -p tcp -m mark --mark 0x3 -j CONNMARK --save-mark

-A SMARK -s 10.0.0.3/32 -j MARK --set-mark 0x4
-A SMARK -d 10.0.0.3/32 -j MARK --set-mark 0x4

-A SMARK -p tcp -m mark --mark 0x4 -j CONNMARK --save-mark

марки указанны в гекс (hex) виде так требует конфиг (а в коммандной строке можно смело писать 1,2,3 в данном случае марки 3 и 4 так как у нас пулы пользовательские начинаются именно с 3 класса)

ну и в конце таблички msngle коммит

COMMIT

Так вроде всё готова проверяем пулы

tc -s class show dev eth1

ну и видем чёто наподобии этого (врубаем конечноже закачки и смотрим с какой скоростью будет качать)

class hfsc 1:3 parent 1:1 sc m1 0bit d 29.6ms m2 512000bit ul m1 0bit d 0us m2 512000bit
      Sent 1284781459 bytes 251959 pkt (dropped 0, overlimits 0 requeues 0)
      rate 0bit 0pps backlog 0b 0p requeues 0
      period 76329 work 1284781459 bytes rtwork 1284781459 bytes level 0

class hfsc 1:4 parent 1:1 sc m1 0bit d 29.6ms m2 512000bit ul m1 0bit d 0us m2 512000bit
       Sent 1185355201 bytes 665714 pkt (dropped 0, overlimits 0 requeues 0)
       rate 0bit 0pps backlog 0b 0p requeues 0
       period 135250 work 1185355201 bytes rtwork 1185355201 bytes level 0
ну я ставил скорость 512 кбит/с
а вот эта строка говорит о том что пакетики попадают в пулл

Sent 1284781459 bytes 251959 pkt

чтобы смотреть в режими реального времени текующее состояния пулов можно воспользоваться перловым скриптом

http://pawilcz.eu/tc-viewer/tc-viewer.html

запускаем 

./tc-viewer --iface=eth1 --hfsc --sort --unit=kbit

и любуемся типа вот этого

Mon Jan 18 15:38:48 2010

        Mode: HFSC        ^C to QUIT


 1:1             -   9345.1 kbit/s  (702pps)
    1:2             -   3931.7 kbit/s  (479pps)
    1:80            -    514.5 kbit/s  (  6pps)
    1:183           -    509.6 kbit/s  (  1pps)
    1:92            -    509.5 kbit/s  (  6pps)
    1:21            -    504.4 kbit/s  (  6pps)
    1:203           -    499.3 kbit/s  (  6pps)
    1:165           -    487.9 kbit/s  (  6pps)
    1:91            -    450.1 kbit/s  ( 53pps)
    1:79            -    406.4 kbit/s  ( 19pps)
    1:118           -    397.3 kbit/s  (  5pps)
    1:154           -    271.0 kbit/s  ( 24pps)
    1:104           -    240.3 kbit/s  ( 25pps)
    1:101           -    230.1 kbit/s  ( 26pps)
    1:114           -    213.1 kbit/s  ( 18pps)
    1:33            -    179.9 kbit/s  ( 21pps)

немного не привычн отам показывает номер класса но думаю не составляет труда переделать скрипт который будет ассоциировать номер класса с айпи адресом пользователя

ну или можно ещё посмотреть статистику попадания под правила на фаерволе

iptables -L --verbose -t mangle

запускаем и видим счётчики на против правил

вроде всё

пс: система работает гарантированно и не грузит сервак (простаивает по полной)
нагрузка от 250 пользователей не маленькая порядка 150 запросов в секунду на сквид а авг не больше 0.3
слут пулов не наблюдался и превышение или обход пула тоже не зафиксирован
каждый получает поровну

а как это всё менеджить через веб админку это уже другая история (я вроде с этим справился)



Iptables IPP2P
UltraViolet
[info]paranoidchaos
Пишу этот пост из-за того что многие сталкиваются с проблемой p2p траффика



и нет нормального средства для по его управлению.

Задача стоит в дропанье данного вида трафика
Система RHEL 5.4

Первые ссылки по поиску решения вели на http://l7-filter.sourceforge.net/
фильтр 7 слоя который состоит из патчей к ядру и модулей к фаерволу (ака iptables)

поставить его не получилось по той причине что RHEL 5.4 это коммерческая ОС и исходников нет есть только девел пакеты

взял установил пакеты kernel-devel и iptables-devel

дальше нашёл http://ipp2p.org/

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

в файле Makefile в наглую заменяю значение строки IPTABLES_SRC = на IPTABLES_SRC = /usr (ибо туда по дефолту устанавливаются девел пакеты из рпм)

соответсвенно IPTABLES_INCLUDE будет иметь значение IPTABLES_INCLUDE = -I$(IPTABLES_SRC)/include

компиляция и сборка проходит нормально но не работает шаред библиотека

погуглив нашёл что надо заменить линковщик

далее переходим к мейк рулу который будет собирать шаред библиотеку

libipt_ipp2p.so: libipt_ipp2p.c ipt_ipp2p.h
$(CC) $(CFLAGS) $(IPTABLES_OPTION) $(IPTABLES_INCLUDE) -fPIC -c libipt_ipp2p.c

ld -shared -o libipt_ipp2p.so libipt_ipp2p.o

в данном куске надо заменить третью строчку и заменить линковщик на gcc

$(CC) -shared -o libipt_ipp2p.so libipt_ipp2p.o

сборка модуля ядра пройдёт нормально но шаред библиотека не собралась вывалилась ошибка

gcc -shared -o libipt_ipp2p.so libipt_ipp2p.o
libipt_ipp2p.o: In function '_init':
libipt_ipp2p.c: (.text+0x20): multiple definition of '_init' /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../lib64/crti.o:(.init+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [libipt_ipp2p.so] Error 1


ошибка говорит о том что функция инит уже определена в файле crti.o

пошарил в сети а именно в мануалах по написанию шаред библиотек и наткнулся на вот эту ссылку http://mech.math.msu.su/~zubr/library.html

ниже отрывок

########################################################################################

Функции _init и _fini.
В библиотеке могут содержаться функции со специальными именами _init и _fini. Функция _init выполняется всегда непосредственно перед загрузкой библиотеки. Функция _fini выполняется всегда непосредственно перед выгрузкой библиотеки. Покажем на примере, как скомпилировать библиотеку, содержащую функцию _init. Файл libhello.c сделаем таким:


#include
void _init(void){
printf("Load library!\n");
}
void hello(void){
printf("Hello, library world?\n");
}

Объектный файл libhello.o создается без проблем. При попытке создать библиотеку получаем ошибку

gcc -g -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 libhello.o -lc
libhello.o: In function `_init':
/home/zubr/demo_library/shared/libhello.c:2: multiple definition of `_init'
/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crti.o(.init+0x0): first defined here
collect2: ld returned 1 exit status

Для прояснения проблемы добавим в ключи компилятора -v. Этот ключ позволяет получить подробности работа компилятора.

gcc -v -g -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 libhello.o -lc

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)
/usr/lib/gcc-lib/i386-redhat-linux/2.96/collect2 -m elf_i386 -shared -o libhello.so.1.0 /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crti.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtbeginS.o -L/usr/lib/gcc-lib/i386-redhat-linux/2.96 -L/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../.. -soname libhello.so.1 libhello.o -lc -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtendS.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crtn.o
libhello.o: In function `_init':
/home/zubr/demo_library/shared/libhello.c:2: multiple definition of `_init'
/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crti.o(.init+0x0): first defined here
collect2: ld returned 1 exit status

Отсюда видно, что компилятор gcc указывает среди объектных файлов, подлежащих компиляции командой collect2, файл /usr/lib/crti.o, который содержит функцию _init. Коль скоро имеем две функции с одним и тем же именем, получаем ошибку. Получить желаемое следующим образом. Явно вызовем collect2 с теми же аргументами, которые, за исключением /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crti.o .

/usr/lib/gcc-lib/i386-redhat-linux/2.96/collect2 -m elf_i386 -shared -o libhello.so.1.0 /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtbeginS.o -L/usr/lib/gcc-lib/i386-redhat-linux/2.96 -L/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../.. -soname libhello.so.1 libhello.o -lc -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtendS.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crtn.o

Это успешно создает libhello.1.0. Далее создание библиотеки происходит стандартным образом.

/sbin/ldconfig -n .
gcc -Wall -g -c demo_use.c -o demo_use.o
gcc -g -o demo_use1 demo_use.o -L. -lhello

Теперь при выполнении demo_use1 получаем

LD_LIBRARY_PATH="." ./demo_use1
Load library!
Hello, library world?

То есть происходит неявный вызов _init, что и требовалось. Примечание: На вашей машине файл, содержащий стандартную функцию _init, может иметь другое имя. Смотрите внимательно в диагностическую информацию gcc. Ключ -nostartfiles для компилятора gcc позволяет не линковать стартовые файлы, в которых присутствуют функции _init и _fini по умолчанию. Использование этого ключа также решает проблему.


#################################################################################################

указанный первый способ меня не устроил я решил добавить ключ -nostartfiles
окончательно строка имеет вид

$(CC) -shared -nostartfiles -o libipt_ipp2p.so libipt_ipp2p.o

после чего модуль собрался нормально и скомпилировалась шаред библиотека
но не тут то было модуль не работал и выдавал ошибку

kernel: ip_tables: ipp2p match: invalid size 16 != 8

догадаться можн обыло сразу в чём дело ибо я уже прочёл мануал по написанию модулей для фаервола но по старинке просто потянуло к гуглу

вот ссылочка http://www.debian-administration.org/articles/562 описание установки этого модуля и все в коментах ругают мол нифига не пашет и смотрю ошибочка вроде как у меня и в низу ответ на коммент


Gentoo people had fixed it. Try:

http://gentoo.mirror.solnet.ch/net-firewall/ipp2p/files/ipp2p-0.8 .2-matchsize.patch

It worked for me.


хех смотрим патчик он такой

diff -Nru ipp2p-0.8.2.orig/ipt_ipp2p.c ipp2p-0.8.2/ipt_ipp2p.c
--- ipp2p-0.8.2.orig/ipt_ipp2p.c 2006-09-27 12:52:00.000000000 +0300
+++ ipp2p-0.8.2/ipt_ipp2p.c 2007-01-14 18:26:23.000000000 +0200
@@ -843,15 +843,6 @@
}


-// TODO: find out what this structure is for (scheme taken
-// from kernel sources)
-// content seems to have a length of 8 bytes
-// (at least on my x86 machine)
-struct ipp2p_match_info {
- long int dunno_what_this_is_for;
- long int i_also_dunno_what_this_is_for;
-};
-
static struct ipt_match ipp2p_match = {
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
{ NULL, NULL },
@@ -870,7 +861,7 @@
.name = "ipp2p",
.match = &match,
.family = AF_INET,
- .matchsize = sizeof(struct ipp2p_match_info),
+ .matchsize = XT_ALIGN(sizeof(struct ipt_p2p_info)),
.checkentry = &checkentry,
.me = THIS_MODULE,
#endif



как видно из патчика всеголишь в файле ipt_ipp2p.c закоментируем (или удалим в случае патча) структуру

struct ipp2p_match_info {
long int dunno_what_this_is_for;
long int i_also_dunno_what_this_is_for;
};

и заменяем красную строчку на синию

.matchsize = sizeof(struct ipp2p_match_info),
.matchsize = XT_ALIGN(sizeof(struct ipt_p2p_info)),


выполняем make clean && make и всё модуль готов к работе
незабываем скопировать полученный кернель модуль и шаред библиотеку в нужные места а именно

cp ipt_ipp2p.ko /lib/modules/2.6.18-164.el5/kernel/net/netfilter/ipt_ipp2p.ko

сменить права доступа к файлу а именно

chmod 744 /lib/modules/2.6.18-164.el5/kernel/net/netfilter/ipt_ipp2p.ko

и скопируем шаред библиотеку (у меня архитектура x86_64 и модули фаервола лежат в директории /lib64)

cp libipt_ipp2p.so /lib64/iptables/libipt_ipp2p.so

выполняем

depmod -a

и всё вроде всё готова запускаем iptables (service iptables start)
и следуем инструкциям ридми файла

iptables -m ipp2p --help покажет нужную инфу по использованию

iptables -A FORWARD -m ipp2p --bit -j DROP добавляем к примеру правило блокирования битторрент протокола

запускаем на клиентской машине биттореент клиен и пытаемся поставит что-либо на скачку

чтобы увидеть статистику работоспособности модуля выполняем

iptables -L -v -n и видем строчку на подобии этой


Chain FORWARD (2 preferences)

pkts bytes target proto opt in out source destination

0 0 ACCEPT all -- lo * 0/0 0/0

3194 737K DROP all -- * * 0/0 0/0
ipp2p v0.8.2 --ipp2p

видно как попадают пакетики торрета и дропаются

усё

пс: осталась ещё одна задача ограничить всякое там потоковое видео ютуб и другой медиа контент
думаю писать модуль под фаервол (хотя модуль стринг чтото не сработал)
Метки: , , ,

Rest In Peace.
UltraViolet
[info]paranoidchaos

Умер John Birrell, один из коммитеров проекта FreeBSD

John Birrell
В результате инсульта скончался Джон Биррел (John Birrell), известный разработчик проекта FreeBSD, более 12 лет участвующий в развитии проекта. Среди разработок Джона можно отметить портирование технологии динамической трассировки DTrace, разработку библиотеки libdwarf, портирование FreeBSD на архитектуры DEC Alpha и Sun UltraSPARC-T1 (Niagara), создание многопоточной (pthread) библиотеки libc_r.
Одна из последних разработок Джона, которая к сожалению осталась незавершенной, - система сборки jbuild, над которой он работал в компании Juniper Networks и которая должна была заменить в будущем стандартные механизмы сборки FreeBSD. По сути jbuild представляет собой модифицированный вариант утилиты make, в который добавлены расширенные средства для контроля зависимостей, работающие через слежение за всеми операциями записи и чтения данных, благодаря интеграцией с DTrace или специальным модулем ядра filemon. Разработка позволяет значительно сократить число операций при выполнении действий подобных "make universe" и "make buildworld".
Кроме FreeBSD Джон Биррел принимал участие в разработке таких систем, как SysVR2/3, Solaris, AIX, HP-UX, OSF/1, SCO, VxWorks, LynxOS и Microware's OS9, был вовлечен в открытые проекты NetBSD и OpenBSD.

пс: пусть земля ему будет пухом, нам его будет не хватать

Вы читаете журнал [info]paranoidchaos