Не буду выкладывать, закину на форум, может кому пригодится.
Статья является дополнением статьи написанной автором сайта. Возможно, что со временем буду добавлять в статью ещё что-нибудь интересное.
Правило 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 пакетов:
и выполняем с нашего компьютера, находящего в сети (192.168.2.4) команду:ipfw add 1 count log icmp from any to any
Действие count не принимает и не отбрасывает, а только увеличивает счётчик. Count log ещё и записывает все пакеты в /var/log/security
Код: Выделить всё
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
Был посчитан и записан в файл /var/log/security пакет ICMP. С помощью таблицы ТИПОВ-ICMP понимаем, чтоFeb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 in via fxp0
ICMP:8.0 это нужный нам тип и код ICMP. А значит, мы отправили Echo request (Эхо-запрос), который был принят на внутреннем интерфейсе fxp0.
Следующая строка говорит нам, что пакет выходит через внешний интерфейс.
Тут есть поправка. Адрес отправителя 192.168.2.4 ещё не подвергся обработке NAT (Строка то у нас ПЕРВАЯ. :-) ), позже он преобразовывается и выходит в инет уже нормальный.Feb 1 12:07:52 ns kernel: ipfw: 1 Count ICMP:8.0 192.168.2.4 81.19.70.1 out via rl0
Аналогично, только приходит Echo-Reply (Ответ) от Рамблера.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
Короче, логи рулят.:-) Как всегда.
Если вы не можете понять, что пришло, что ушло, что-то не работает, включайте 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
Правим файрвол:
Код: Выделить всё
На 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
ТЕСТ 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
По 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
Тот же тест, с 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 к примеру, то это выливается в круглую сумму, особенно в месяц.