Неправильно работает ipfw или я не так понимаю?

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
EARL
мл. сержант
Сообщения: 85
Зарегистрирован: 2010-05-24 9:05:18
Откуда: Тамбов

Неправильно работает ipfw или я не так понимаю?

Непрочитанное сообщение EARL » 2010-05-24 15:45:45

При попытки реализовать reply-to на ipfw столкнулся с проблемой, что подключения проходят только по одному из интерфейсов. Начал копать почему и наткнулся на странную работу skipto с флагом keep-state. На тестовом серваке решил всё проверить. Вот конфиг ipfw:

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

#!/bin/sh

fw="/sbin/ipfw -q"

# flush
${fw} flush

# loopback
${fw} add 10 allow ip from any to any

${fw} add 20 skipto 1000 tag 1 ip from any to any in recv em0 keep-state
${fw} add 30 skipto 2000 ip from any to any out xmit em0
${fw} add 40 deny ip from any to any

# in recv em0
${fw} add 1000 allow ip from any to me
${fw} add 1010 deny ip from any to any

# out xmit em0
${fw} add 2000 allow ip from me to any
${fw} add 2010 deny ip from any to any
С виду казалось бы всё должно работать, но например:

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

[root@ /etc] ping www.ru
PING www.ru (194.87.0.50): 56 data bytes
64 bytes from 194.87.0.50: icmp_seq=0 ttl=55 time=3.847 ms
ping: sendto: Permission denied
ping: sendto: Permission denied
...
Начал разбираться почему так и оказывается при первом проходе создается динамическое правило и skipto выполняется правильно, но на следующем шаге исходящий пакет почему-то попадает под созданное динамическое правило несмотря на флаги направления in recv. Собственно должы ли эти флаги учитываться тут? Судя по этой статье

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

http://nuclight.livejournal.com/124348.html
в моем примере всё должно работать.

система

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

[root@ /etc] uname -a
FreeBSD 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Mon May 17 10:25:44 UTC 2010 root@: Mon May 17 10:25:44 UTC 2010   root@:/usr/obj/usr/src/sys/IPFW  i386
На 8-ке такая же картина.

Уже задумываюсь юзать связку pf+ipfw и reply-to городить через pf, но этого очень не хотелось бы.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
EARL
мл. сержант
Сообщения: 85
Зарегистрирован: 2010-05-24 9:05:18
Откуда: Тамбов

Re: Неправильно работает ipfw или я не так понимаю?

Непрочитанное сообщение EARL » 2010-06-01 23:19:26

Короче пример по указанной мною ссылке должен работать, а вот у меня не работало, т.к. я у себя делал разделение на входящие/исходящие направления для каждого интерфейса с помощью skipto, при этом если стоит флаг keep-state, то направление не учитываются (via, in recv, out xmit), а учитываются только src-ip и dst-ip пакетов. В итоге конструкция

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

${fw} add 20 skipto 1000 tag 1 ip from any to any in recv em0 keep-state
первый срабатывает когда пакет приходит через интерфейс em0 и при этом создается динамическое правило грубо говоря такого плана

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

${fw} add 20 skipto 1000 tag 1 ip from any to any
Исправив конфиг фаервола для того, чтобы теперь всё работало правильно получим вот что

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

#!/bin/sh

fw="/sbin/ipfw -q"

# flush
${fw} flush

# loopback
${fw} add 10 allow ip from any to any

${fw} add 20 skipto 30 tag 1 ip from any to any in recv em0
${fw} add 30 skipto 1000 ip from any to any in recv em0
${fw} add 40 skipto 2000 ip from any to any out xmit em0
${fw} add 50 deny ip from any to any

# in recv em0
${fw} add 1000 allow ip from any to me
${fw} add 1010 deny ip from any to any

# out xmit em0
${fw} add 2000 allow ip from me to any
${fw} add 2010 deny ip from any to any
Наворочено конечно, но работает :smile: