|
Компьютерный форум OSzone.net » Linux и FreeBSD » Общий по FreeBSD » несколько фаерволов одновременно |
|
несколько фаерволов одновременно
|
Пользователь Сообщения: 125 |
Профиль | Отправить PM | Цитировать Возникла необходимость использовать несколько фаерволов одновременно. Удобно, когда в ipfw трафик на внешнем интерфейсе перенаправляется на разные NETGRAPH модули, pipe-ы с ограничением ширины канала и т.д. При этом, большинство правил строятся автоматически - программами. PF же используется администратором.
Пошарился по исходному коду, нашёл описание подсистемы pfil, к которой можно подцеплять сколько угодно фильтров. В том месте, где происходит регистрация обработчиков фаерволов нашёл такое место: /* * insert the input list in reverse order of the output list * so that the same path is followed in or out of the kernel. */ if (flags & PFIL_IN) TAILQ_INSERT_HEAD(list, pfh1, pfil_link); else TAILQ_INSERT_TAIL(list, pfh1, pfil_link); return 0; получается, что для каждого нового подцепляемого фильтра в систему его обработчик входящих пакетов добавляется в начало списка (т.е. он первый будет проверять этот пакет, до добавления нового фильтра) и соответственно, для исходящих пакетов каждый новый добавляемый обработчик добавляется в конец списка. (man queue) Вот так добавляет в список обрабочики фаервол ipfw: pfil_add_hook(ipfw_check_in, NULL, PFIL_IN | PFIL_WAITOK, pfh_inet); pfil_add_hook(ipfw_check_out, NULL, PFIL_OUT | PFIL_WAITOK, pfh_inet); вот так pf: pfil_add_hook(pf_check_in, NULL, PFIL_IN | PFIL_WAITOK, pfh_inet); pfil_add_hook(pf_check_out, NULL, PFIL_OUT | PFIL_WAITOK, pfh_inet); при автоматической загрузке модулей, фри грузит сначало ipfw.ko, потом pf.ko, получается, что при выходе пакета ipfw будет обрабатывать первой, а потом будет pf... путь прохождения пакетов следующий: клиентская машина с адресом 192.168.150.164, шлюз на котором проводятся тесты - 192.168.150.1 и компьютер за шлюзом 192.168.100.1 lnc0 (192.168.150.1 mask /24) - внутренняя подсеть тестового шлюза lnc1 (192.168.100.9 mask /24) - внешняя подсеть тестового шлюза ipfw.conf ipfw add 100 netgraph 61 all from any to any in via lnc1 ipfw add 200 netgraph 60 all from any to any out via lnc1 ipfw add 300 allow all from any to any на 61,60 узле висит ng_nat начинаю экспериментировать с pf.conf 1. Первый вариант естественно такой: pass in all pass out all всё работает отлично, пинги проходят с 192.168.150.164 на 192.168.100.1 2. Второй вариант block in all block out all pass on lnc0 from 192.168.150.164 to any pass on lnc0 from any to 192.168.150.164 pass on lnc1 from 192.168.100.9 to any pass on lnc1 from any to 192.168.100.9 не работает (пишу всё по памяти, но вроде проходят только ping request наружу) 3. Поэтому добиваю ещё одно правило block in all block out all pass on lnc0 from 192.168.150.164 to any pass on lnc0 from any to 192.168.150.164 pass on lnc1 from 192.168.100.9 to any pass on lnc1 from any to 192.168.100.9 pass on lnc1 from any to 192.168.150.164 работает! Изначально всё соответствует теории, если бы не результаты 2ого и третьего теста... что это, ошибка условий тестирования? мой косяк? Или получается, что после того, как меняется адрес назначения пакет проходит, через ip_input ещё раз? Вот это та часть текста ip_input, где происходит проверка: /* * Run through list of hooks for input packets. * * NB: Beware of the destination address changing (e.g. * by NAT rewriting). When this happens, tell * ip_forward to do the right thing. */ /* Jump over all PFIL processing if hooks are not active. */ if (inet_pfil_hook.ph_busy_count == -1) goto passin; odst = ip->ip_dst; if (pfil_run_hooks(&inet_pfil_hook, &m, m->m_pkthdr.rcvif, PFIL_IN, NULL) != 0) return; if (m == NULL) /* consumed by filter */ return; ip = mtod(m, struct ip *); dchg = (odst.s_addr != ip->ip_dst.s_addr); я долго ковырялся, пытаясь понять дальнейший путь пакета, но не получилось Может кто-нибудь в курсе как он дальне пойдёт после смены адреса назначения? Опять штоли на ip_input и опять через все фаерволы прогоняться будет? (изврат) p.s. писал по памяти, может где-нибудь ошибся FreeBSD 6.1 |
|
Отправлено: 09:04, 08-12-2006 |
Пользователь Сообщения: 125
|
Профиль | Отправить PM | Цитировать продолжаю тесты...
Фаерволы: # ipfw list # ng_nat 00005 allow ip from any to any via lo0 00100 netgraph 61 icmp from any to any in via lnc1 00200 netgraph 60 icmp from any to any out via lnc1 # считаем сколько суммарно icmp 00300 count icmp from any to any 00400 allow ip from any to any 65535 deny ip from any to any # pfctl -s rules No ALTQ support in kernel ALTQ related functions disabled block drop in log all block drop out log all # для ssh pass quick on lnc0 inet proto tcp from any to 192.168.150.1 keep state # внутренний интерфейс (для icmp) pass log quick on lnc0 inet proto icmp from 192.168.150.164 to any pass log quick on lnc0 inet proto icmp from any to 192.168.150.164 # внешний интерфейс (для icmp) pass log quick on lnc1 inet proto icmp from 192.168.100.9 to any pass log quick on lnc1 inet proto icmp from any to 192.168.100.9 # экспериментально определено pass log quick on lnc1 inet proto icmp from any to 192.168.150.164 Отчищаем статистику ipfw: # ipfw resetlog Logging counts reset. # ipfw zero Accounting cleared. пингуем с 192.168.150.164 хост 192.168.100.1 находящийся за маршрутизатором C:\>ping 192.168.100.1 Обмен пакетами с 192.168.100.1 по 32 байт: Ответ от 192.168.100.1: число байт=32 время=6мс TTL=127 Ответ от 192.168.100.1: число байт=32 время=3мс TTL=127 Ответ от 192.168.100.1: число байт=32 время=2мс TTL=127 Ответ от 192.168.100.1: число байт=32 время=3мс TTL=127 Статистика Ping для 192.168.100.1: Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь), Приблизительное время приема-передачи в мс: Минимальное = 2мсек, Максимальное = 6 мсек, Среднее = 3 мсек статистика ipfw: # ipfw show 00005 0 0 allow ip from any to any via lo0 00100 4 240 netgraph 61 icmp from any to any in via lnc1 00200 4 240 netgraph 60 icmp from any to any out via lnc1 00300 8 480 count icmp from any to any 00400 201 18552 allow ip from any to any 65535 0 0 deny ip from any to any как часы.... 4 туда, 4 оттуда логи pf'а: # tcpdump -n -e -tt -i pflog0 -l | grep ICMP tcpdump: WARNING: pflog0: no IPv4 address assigned tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pflog0, link-type PFLOG (OpenBSD pflog file), capture size 96 bytes 1165514378.625827 rule 3/0(match): pass in on lnc0: 192.168.150.164 > 192.168.100.1: ICMP echo request, id 1024, seq 24064, length 40 1165514378.626475 rule 5/0(match): pass out on lnc1: 192.168.100.9 > 192.168.100.1: ICMP echo request, id 1024, seq 24064, length 40 1165514378.629896 rule 6/0(match): pass in on lnc1: 192.168.100.1 > 192.168.100.9: ICMP echo reply, id 1024, seq 24064, length 40 1165514378.629899 rule 7/0(match): pass in on lnc1: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24064, length 40 1165514378.629902 rule 4/0(match): pass out on lnc0: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24064, length 40 1165514379.140342 rule 3/0(match): pass in on lnc0: 192.168.150.164 > 192.168.100.1: ICMP echo request, id 1024, seq 24320, length 40 1165514379.140420 rule 5/0(match): pass out on lnc1: 192.168.100.9 > 192.168.100.1: ICMP echo request, id 1024, seq 24320, length 40 1165514379.141851 rule 6/0(match): pass in on lnc1: 192.168.100.1 > 192.168.100.9: ICMP echo reply, id 1024, seq 24320, length 40 1165514379.141854 rule 7/0(match): pass in on lnc1: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24320, length 40 1165514379.141856 rule 4/0(match): pass out on lnc0: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24320, length 40 1165514379.661402 rule 3/0(match): pass in on lnc0: 192.168.150.164 > 192.168.100.1: ICMP echo request, id 1024, seq 24576, length 40 1165514379.661808 rule 5/0(match): pass out on lnc1: 192.168.100.9 > 192.168.100.1: ICMP echo request, id 1024, seq 24576, length 40 1165514379.662866 rule 6/0(match): pass in on lnc1: 192.168.100.1 > 192.168.100.9: ICMP echo reply, id 1024, seq 24576, length 40 1165514379.662869 rule 7/0(match): pass in on lnc1: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24576, length 40 1165514379.662871 rule 4/0(match): pass out on lnc0: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24576, length 40 1165514380.180917 rule 3/0(match): pass in on lnc0: 192.168.150.164 > 192.168.100.1: ICMP echo request, id 1024, seq 24832, length 40 1165514380.181154 rule 5/0(match): pass out on lnc1: 192.168.100.9 > 192.168.100.1: ICMP echo request, id 1024, seq 24832, length 40 1165514380.182874 rule 6/0(match): pass in on lnc1: 192.168.100.1 > 192.168.100.9: ICMP echo reply, id 1024, seq 24832, length 40 1165514380.182877 rule 7/0(match): pass in on lnc1: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24832, length 40 1165514380.182879 rule 4/0(match): pass out on lnc0: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24832, length 40 по логам pf выглядит интересной эти строки: 1165514378.629896 rule 6/0(match): pass in on lnc1: 192.168.100.1 > 192.168.100.9: ICMP echo reply, id 1024, seq 24064, length 40 1165514378.629899 rule 7/0(match): pass in on lnc1: 192.168.100.1 > 192.168.150.164: ICMP echo reply, id 1024, seq 24064, length 40 это как в корпускулярно-волновой теории одна частица проходит через две щели это так... информация для размышления, щас полезу в код |
Отправлено: 15:40, 08-12-2006 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 125
|
Профиль | Отправить PM | Цитировать проблема решена написанием патча (хака) для pf
|
Отправлено: 10:24, 11-12-2006 | #3 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать >проблема решена написанием патча (хака) для pf
А можно ли поподробнее? У Мну правда FreeBSD 6.2RC1 |
Отправлено: 19:09, 25-02-2007 | #4 |
Новый участник Сообщения: 1
|
Профиль | Отправить PM | Цитировать Цитата:
Или существует какой-либо иной способ? И в каком файле определены эти записи? |
||
Отправлено: 02:21, 30-10-2007 | #5 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Dial-Up - 2 подключения одновременно | pololo | Сетевые технологии | 1 | 21-06-2009 08:19 | |
Route/Bridge - Несколько подключений на одном пк одновременно. | busurman | Сетевые технологии | 2 | 19-05-2008 12:28 | |
win 2003 несколько IP(inet) на несколько LAN? | Alexandr_l | Сетевые технологии | 11 | 03-04-2006 15:19 |
|