Страница 1 из 1

Несколько приёмов работы с IPFW.

Добавлено: 2007-02-01 19:20:32
dikens3
Хотел написать статью, но какая-то пурга получилась.
Не буду выкладывать, закину на форум, может кому пригодится.

Статья является дополнением статьи написанной автором сайта. Возможно, что со временем буду добавлять в статью ещё что-нибудь интересное.
Правило 1:
Каждый транзитный пакет входит на определённый интерфейс и выходит с определённого интерфейса.

Демонстрация:
Есть шлюз на FreeBSD и на нём прописан gateway_enable="YES" в rc.conf
Или через sysctl: net.inet.ip.forwarding=1
fxp0 – Внутренний интерфейс, смотрит в локальную сеть.
rl0 – Внешний, смотрит в инет.
Наш внутренний IP-Адрес 192.168.2.4
Наш внешний IP-Адрес 82.208.77.66

Воспользуемся очень полезной возможностью – записью пакетов в лог.
Добавляем первой строкой фиксирование всех ICMP пакетов:
ipfw add 1 count log icmp from any to any
Действие count не принимает и не отбрасывает, а только увеличивает счётчик. Count log ещё и записывает все пакеты в /var/log/security
и выполняем с нашего компьютера, находящего в сети (192.168.2.4) команду:

Код: Выделить всё

ping www.rambler.ru и смотрим записи в /var/log/security
Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 in via fxp0
Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 out via rl0
Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 82.208.77.66 in via rl0
Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 192.168.2.4 out via fxp0
Feb 1 12:07:53 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 in via fxp0
Feb 1 12:07:53 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 out via rl0
Feb 1 12:07:53 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 82.208.77.66 in via rl0
Feb 1 12:07:53 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 192.168.2.4 out via fxp0
Feb 1 12:07:54 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 in via fxp0
Feb 1 12:07:54 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 out via rl0
Feb 1 12:07:54 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 82.208.77.66 in via rl0
Feb 1 12:07:54 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 192.168.2.4 out via fxp0
Feb 1 12:07:55 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 in via fxp0
Feb 1 12:07:55 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 out via rl0
Feb 1 12:07:55 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 82.208.77.66 in via rl0
Feb 1 12:07:55 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 192.168.2.4 out via fxp0
Посмотрим, что же происходит:
Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 in via fxp0
Был посчитан и записан в файл /var/log/security пакет ICMP. С помощью таблицы ТИПОВ-ICMP понимаем, что
ICMP:8.0 это нужный нам тип и код ICMP. А значит, мы отправили Echo request (Эхо-запрос), который был принят на внутреннем интерфейсе fxp0.

Следующая строка говорит нам, что пакет выходит через внешний интерфейс.
Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 out via rl0
Тут есть поправка. Адрес отправителя 192.168.2.4 ещё не подвергся обработке NAT (Строка то у нас ПЕРВАЯ. :-) ), позже он преобразовывается и выходит в инет уже нормальный.
Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 82.208.77.66 in via rl0
Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:0.0 81.19.70.1 192.168.2.4 out via fxp0
Аналогично, только приходит Echo-Reply (Ответ) от Рамблера.
Короче, логи рулят.:-) Как всегда.
Если вы не можете понять, что пришло, что ушло, что-то не работает, включайте log или пользуйтесь TCPDUMP’ом. Возможно, что файрвол где-то убивает входящий/исходящий пакет.

А так ли уж нужен этот Check-State?
net.inet.ip.fw.dyn_keepalive - булева переменная. Заставляет генерировать "поддерживающие" пакеты (keep-alive) для tcp-соединений, обрабатываемых динамическими правилами keep-state. Установка в 1 понижает вероятность прерывания tcp-соединения по таймауту, но генерирует лишний трафик. Значение по умолчанию – 1
Взято тут
Здесь тоже неплохо написано
На поддержание соединений нужно какое-то количество трафика? Так ли это, и сколько именно?
Два компьютера HOST1 и HOST2 помогут нам в этом.
Создаём файл размером 100 Мб.

Код: Выделить всё

dd if=/dev/zero of=file100mb bs=1024 count=100K
ТЕСТ 1:
Правим файрвол:

Код: Выделить всё

На HOST1:
ipfw add 3 count tcp from HOST2 1234 to me in via xl0
ipfw add 5 allow tcp from me to HOST2 1234 out via xl0

На HOST2:
ipfw add 1 allow tcp from HOST1 to me 1234
Будем принимать пакеты от компьютера HOST1.

Код: Выделить всё

Выполняем следующие команды на хостах:
HOST2#nc -l 1234 > /dev/null
HOST1#nc HOST2 < file100mb

Код: Выделить всё

Полученные данные c HOST1:
00003 35568   1422728 count tcp from HOST2 1234 to me in via xl0
00005 71826 107730648 allow tcp from me to HOST2 dst-port 1234 out via xl0

Полученные данные c HOST2:
00001   71826 107730648 allow tcp from HOST2 to me dst-port 1234
Из теста видно, что количество отправленных пакетов HOST1=количеству принятых HOST2. Так же видно входящий трафик этой операции. (1,35 Мб.) Не так много, но для тех, кто считает, что отправка данных не имеет входящего трафика, будет рад это видеть.

ТЕСТ 2:
Изменяем файрвол:

Код: Выделить всё

На HOST1:
ipfw add 4 check-state
ipfw del 5
ipfw add 5 allow tcp from me to HOST2 1234 out via xl0 keep-state
Т.е. добавляем Keep-State для этой операции.

Код: Выделить всё

Выполняем следующие команды на хостах:
HOST2#nc -l 1234 > /dev/null
HOST1#nc HOST2 < file100mb

Код: Выделить всё

Полученные данные c HOST1:
00003  35539   1421568 count tcp from HOST2 1234 to me in via xl0
00004      0         0 check-state
00005 107365 109152216 allow tcp from me to HOST2 dst-port 1234 out via xl0 keep-state

Полученные данные c HOST2:
00001 71826 107730648 allow tcp from HOST1 to me dst-port 1234
Запускал эту операцию несколько раз, данные HOST2 всегда одинаковые в обоих тестах.
По HOST1 смотрите сами, входящий трафик остался примерно на том же уровне, но количество отправленных пакетов увеличилось с 71826 до 107365. Трафик тоже увеличился, но не так сильно, с 107730648 до 109152216 байт. (Незначительно изменяются данные на HOST1, если запускать эту операцию несколько раз.)
Видно реализация keep-state(check-state) так работает, раз уж пакеты отправляются с HOST1, но не приходят на HOST2.

Пробовал тестировать с помощью ab:

Код: Выделить всё

HOST1#ab -c 5 -n 100 http://IP-Адрес/ 
Результаты те же. Трафик почти одинаковый.
Сделал вывод, что время имеет значение. Нельзя с помощью быстрых тестов узнать ответ на основной вопрос. ( На поддержание соединений нужно какое-то количество трафика? Так ли это, и сколько именно?)

Решил подключить сетевой диск через mount_smbfs и посмотреть ровно через 1 час количество трафика:
Изменил файрвол на хостах и добавил в cron Подключение/Отключение:
В момент работы динамическое правило выглядит так:
## Dynamic rules (2):
00005 15 1219 (218s) STATE tcp HOST1 60937 <-> HOST2 139
Изменяем файрвол:

Код: Выделить всё

HOST1
ipfw add 1 count ip from HOST2 to me
ipfw add 5 allow ip from me to HOST2 out via fxp0

HOST2
ipfw add 1 count all from HOST1 to HOST2
ipfw add 2 count all from HOST2 to HOST1

Код: Выделить всё

Полученные данные c HOST1:
00001      198      19867 count ip from HOST2 to me
00005      367      26198 allow ip from me to HOST2 out via fxp0

Полученные данные c HOST2:
00001   367    26198 count ip from HOST1 to HOST2
00002   201    20077 count ip from HOST2 to HOST1
 
Сколько отправил HOST1, столько и получил HOST2. Есть расхождение в трафике, но несущественное.
Тот же тест, с keep-state

Код: Выделить всё

Полученные данные c HOST1:
00001    207     20122 count ip from HOST2 to me
00005    580     46409 allow ip from me to HOST2 out via fxp0 keep-state

Полученные данные c HOST2:
00001   381    26647 count ip from HOST1 to HOST2
00002   211    20516 count ip from HOST2 to HOST1
Вобщем нифига не выяснил ответ на собственный же вопрос. :-(
Есть идеи как вычислить?

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

Добавлено: 2007-02-01 22:51:35
Alex Keda
1 мегабайт на юзера в месяц.
я считал на прошлой работе...

Добавлено: 2007-02-02 11:09:21
dikens3
Да я не о самой ICQ, я о keep-state.
У меня в одном офисе при расходе трафика около 1GB расхождение получалось 30-50Mb в месяц. После отключения Keep-state всё стало в норму. Вот и хотел каким-нибудь тестом найти.
Ведь не секрет, что ICQ, для поддержания соединений, отправляет 60 байт каждую минуту.
А в случае, если ещё к ним будет добавляться keep-state должно быть больше.
Вобщем забил я на keep-state. Буду думать что-нибудь новое.

Добавлено: 2007-02-02 18:34:23
zorg
вообще не знаю, но если стоит полная аська которая крутит рекламу, то тут 60 байтами не обойдётся, за 12 часов простоя - набежало 16 метров, так что имеет смысл полную аську не ставить! :)

Добавлено: 2007-02-19 21:38:35
kolesya
на qip переходить надо ... или я не прав ?
поделитесь опытом, кто что юзает в качестве "корпоративной аськи" :P

Добавлено: 2007-02-19 22:53:10
Alex Keda
миранда

Добавлено: 2007-02-19 23:19:16
Raven2000
QIP 2005 Bild 8010

Добавлено: 2007-02-20 0:24:05
Alex Keda
локальной аськи нет чтоль?

Добавлено: 2007-02-20 9:02:02
kolesya
lissyara писал(а):локальной аськи нет чтоль?
есть, iserverd юзаю. Но может кто нить посоветует кието варианты (с посгресом пока не особо) ?

Добавлено: 2007-02-20 9:05:13
Alex Keda
я wildfire использую. Щас он уже в портах есть

Добавлено: 2007-02-20 10:05:50
Raven2000
Может опишешь установку wildfire а :?:

Добавлено: 2007-02-20 10:25:16
Alex Keda
а чё там ставить-то?
=======
реально - установка проще некуда.
========
Взял бы да сам описаЛ:)))

Добавлено: 2007-02-20 10:31:07
Raven2000
Лана лана надо просто поковырять и поставить
Взял бы да сам описаЛ))
а потом может что накатаю :)
Да к нему какой клиент приятнее на маздае?
лично ты какой импользуешь?
Базу внутреннюю или внешнюю используешь?

Добавлено: 2007-02-20 10:59:44
Alex Keda
база у меня MySQL, клиент - под виндой юзал спарк - ихний клиент, щас копете

Добавлено: 2007-02-20 11:18:38
dikens3
Raven2000 писал(а):QIP 2005 Bild 8010
Аналогично.

Re: Несколько приёмов работы с IPFW.

Добавлено: 2007-10-01 9:19:06
smilealex
плиз squid.conf в студию!

Re: Несколько приёмов работы с IPFW.

Добавлено: 2007-10-01 9:27:25
dikens3
Парень заблудился. :-)

Re: Несколько приёмов работы с IPFW.

Добавлено: 2007-10-01 9:34:38
smilealex
dikens3 писал(а):Парень заблудился. :-)
точняк)))
не))) а фигле..в фф открыто чот штук 40 вкладок.. половина с лиссяриного ресурса... вот пальцы и заблудились!!!
соре за офтоп