Доброго времени суток!
Мучаюсь сегодня весь день, млин, не пойму, где что понял неправильно.
Пусть,внешний IP- X.X.X.X , внутренняя сетевая - iif, внешняя - oif, внутренняя сеть - 192.168.0.0/24
Конфиг (отбрасывая пока ограничения по спуфингу и всяким разным появлениям пакетов, там, где им не место быть, оставляя самый костяк) -#!/bin/sh
/sbin/ipfw -q -f flush
/sbin/ipfw add 100 allow all from any to any via lo
/sbin/ipfw add 200 allow all from any to any via iif
/sbin/ipfw add 250 check-state
/sbin/ipfw add 300 divert natd ip from 192.168.0.0/24 to any out via oif
/sbin/ipfw add 350 divert natd ip from any to x.x.x.x. in via oif
/sbin/ipfw add 400 allow udp from any to any 53 out via oif keep-state
/sbin/ipfw add 450 allow tcp from any to any 80 out via oif keep-state
/sbin/ipfw add 700 allow icmp from any to any
ну и по дефолту deny all from any to anyИ вот засада - с самого роутера все, что разрешил - есть, а с тестовой машины, у которой шлюзом - внутренний адрес роутера, DNS-ом - любой публичный DNS - нифига нет. Так мало того, что ничего нет (ну кроме пингов по IP), так, сволочь, даже не резолвит ничего...
Ну где я тут в трех соснах запутался - ткните, плиз, кому не трудно.
Заранее спасибо.
1) роутер включил?
2) ээ последовательность "nat, check-state, keep-state" попробуй
а форвардинг включен?
что говорит sysctl net.inet.ip.forwarding ?
> а форвардинг включен?
> что говорит sysctl net.inet.ip.forwarding ?В rc.conf - gateway_enable="YES" - присутствует, конечно.
Насколько знаю, это аналогичные вещи?
>> а форвардинг включен?
>> что говорит sysctl net.inet.ip.forwarding ?
> В rc.conf - gateway_enable="YES" - присутствует, конечно.
> Насколько знаю, это аналогичные вещи?угу!
на всякий случай попробуйте изменить правило ната на следующее
ipfw add divert natd ip4 from any to any via <нужный интерфейс>
по крайней мере именно в таком виде оно присутствует в /etc/rc.firewall
да, и посмотрите tcpdump'ом на внешнем интерфейсе, приходят ли на него пакеты с внутренних хостов
Чувствую, у меня мозг закипать начинает...))
Будем плясать от печки.
Пока у меня фаер работает должным образом только в stateless- варианте
его конфиг -#!/bin/sh
/sbin/ipfw -q -f flush
/sbin/ipfw add 100 allow all from any to any via lo
/sbin/ipfw add 200 allow all from any to any via iif
/sbin/ipfw add 300 divert natd ip from 192.168.0.0/24 to any out via oif
/sbin/ipfw add 350 divert natd ip from not 192.168.0.0/24 to x.x.x.x in via oif
/sbin/ipfw add 400 allow ip from x.x.x.x to any out via oif
/sbin/ipfw add 450 allow udp from any 53 to x.x.x.x in via oif
/sbin/ipfw add 500 allow udp from 192.168.0.0/24 to any 53 out via oif
/sbin/ipfw add 550 allow udp from any 53 to 192.168.0.0/24 in via oif
/sbin/ipfw add 600 allow tcp from 192.168.0.0/24 to any 80,53,25,110 out via oif
/sbin/ipfw add 650 allow tcp from any 80,53,25,110 to 192.168.0.0/24 in via oif
/sbin/ipfw add 700 allow icmp from any to any
#ну и всем все запретитьну, либо чуть упростив, учитывая, что правило 400 разрешает исходящий ип не только самому роутеру, но и внутренним хостам, которых до этого обработал нат в правиле 300 -
#!/bin/sh
/sbin/ipfw -q -f flush
/sbin/ipfw add 100 allow all from any to any via lo
/sbin/ipfw add 200 allow all from any to any via iif
/sbin/ipfw add 300 divert natd ip from 192.168.0.0/24 to any out via oif
/sbin/ipfw add 350 divert natd ip from not 192.168.0.0/24 to x.x.x.x in via oif
/sbin/ipfw add 400 allow ip from x.x.x.x to any out via oif
/sbin/ipfw add 450 allow udp from any 53 to x.x.x.x in via oif
#/sbin/ipfw add 500 allow udp from 192.168.0.0/24 to any 53 out via oif
/sbin/ipfw add 550 allow udp from any 53 to 192.168.0.0/24 in via oif
#/sbin/ipfw add 600 allow tcp from 192.168.0.0/24 to any 80,53,25,110 out via oif
/sbin/ipfw add 650 allow tcp from any 80,53,25,110 to 192.168.0.0/24 in via oif
/sbin/ipfw add 700 allow icmp from any to any
#ну и всем все запретитьТак, соответственно, тоже работает.
Вроде бы, на мой скромный еще взгляд, для костяка stateless-конфига не сильно страшно.(но это без всяких запрещающих правил выше диверта)
НО
Как только я пытаюсь добавить динамические правила - все, самый настоящий болт
ну например для tcp#!/bin/sh
/sbin/ipfw -q -f flush
/sbin/ipfw add 100 allow all from any to any via lo
/sbin/ipfw add 200 allow all from any to any via iif
/sbin/ipfw add 300 divert natd ip from 192.168.0.0/24 to any out via oif
/sbin/ipfw add 350 divert natd ip from not 192.168.0.0/24 to x.x.x.x in via oif
/sbin/ipfw add 400 allow ip from x.x.x.x to any out via oif
/sbin/ipfw add 450 allow udp from any 53 to x.x.x.x in via oif
/sbin/ipfw add 500 allow udp from 192.168.0.0/24 to any 53 out via oif
/sbin/ipfw add 550 allow udp from any 53 to 192.168.0.0/24 in via oif
/sbin/ipfw add 550 check-state
/sbin/ipfw add 600 allow tcp from 192.168.0.0/24 to any 80,53,25,110 out via oif keep-state
/sbin/ipfw add 700 allow icmp from any to any
#ну и всем все запретитьНифига не работает (по tcp)
Ну вот где я ошибся???
это точные копии файла с правилами?а повторение номера 550 - так и есть?
Ой, конечно нет повторения, напечатал не то..
#!/bin/sh/sbin/ipfw -q -f flush
/sbin/ipfw add 100 allow all from any to any via lo
/sbin/ipfw add 200 allow all from any to any via iif
/sbin/ipfw add 300 divert natd ip from 192.168.0.0/24 to any out via oif
/sbin/ipfw add 350 divert natd ip from not 192.168.0.0/24 to x.x.x.x in via oif
/sbin/ipfw add 400 allow ip from x.x.x.x to any out via oif
/sbin/ipfw add 450 allow udp from any 53 to x.x.x.x in via oif
/sbin/ipfw add 500 allow udp from 192.168.0.0/24 to any 53 out via oif
/sbin/ipfw add 550 allow udp from any 53 to 192.168.0.0/24 in via oif
/sbin/ipfw add 560 check-state
/sbin/ipfw add 600 allow tcp from 192.168.0.0/24 to any 80,53,25,110 out via oif keep-state
/sbin/ipfw add 700 allow icmp from any to any
#ну и всем все запретитьВот так, вообщем. Да, правила слово в слово с конфига.
> /sbin/ipfw add 560 check-state
> /sbin/ipfw add 600 allow tcp from 192.168.0.0/24 to any 80,53,25,110 out via
> oif keep-stateпопробуй убрать out.
перед этим можно посмотреть формируемые динамические правила командой ipfw -d show.
и кинуть сюда. до и после
для начала показывай реальные правила
ipfw -a list
а не скрипт ...
И так. Дело чуть сдвинулось с точки, но не намного.
Начну снова с stateless-варианта -
blabla# ipfw show
00100 0 0 allow ip from any to any via lo
00120 35 3228 allow ip from any to any via iif
00200 3 128 divert 8668 ip from 192.168.0.0/24 to any out via oif
00250 8 376 divert 8668 ip from not 192.168.0.0/24 to x.x.x.x in via oif
00300 3 128 allow ip from x.x.x.x to any out via oif
00350 0 0 allow udp from any 53 to x.x.x.x in via oif
00400 0 0 allow udp from 192.168.0.0/24 to any dst-port 53 out via oif
00450 0 0 allow udp from any 53 to 192.168.0.0/24 in via oif
00500 0 0 allow tcp from 192.168.0.0/24 to any dst-port 80,25,110 via oif
00550 2 88 allow tcp from any 80,25,110 to 192.168.0.0/24 in via oif
00700 0 0 allow icmp from any to any
65535 6 288 deny ip from any to any
Здесь пустил телнет по 80 порту на yandex.ru
Видно, что -
1.пакет обработал нат в правиле 200
2. отработало 300
3. снова нат в правиле 250
4. ну и пропустило ответный tcp пакет 550
Тут понятно.
Но снова - приписываю одно динамическое правило, ребут, чистый список -
blabla# ipfw -d show
00100 0 0 allow ip from any to any via lo
00120 12 912 allow ip from any to any via iif
00200 0 0 divert 8668 ip from 192.168.0.0/24 to any out via oif
00250 2 104 divert 8668 ip from not 192.168.0.0/24 to x.x.x.x in via oif
00260 0 0 check-state
00300 0 0 allow ip from x.x.x.x to any out via oif
00350 0 0 allow udp from any 53 to x.x.x.x in via oif
00400 0 0 allow udp from 192.168.0.0/24 to any dst-port 53 out via oif
00450 0 0 allow udp from any 53 to 192.168.0.0/24 in via oif
00500 0 0 allow tcp from 192.168.0.0/24 to any dst-port 80,25,110 via oif keep-state
00700 0 0 allow icmp from any to any
65535 2 104 deny ip from any to any
Ну, почти чистый). Какая-то сволочь уже пытается прорваться снаружи в этом маленьком интервале.
Пускаю телнет по 80 порту на yandex.ru -
blabla# ipfw -d show
00100 0 0 allow ip from any to any via lo
00120 14 1008 allow ip from any to any via iif
00200 2 96 divert 8668 ip from 192.168.0.0/24 to any out via oif
00250 2 96 divert 8668 ip from not 192.168.0.0/24 to x.x.x.x in via oif
00260 0 0 check-state
00300 2 96 allow ip from x.x.x.x to any out via oif
00350 0 0 allow udp from any 53 to x.x.x.x in via oif
00400 0 0 allow udp from 192.168.0.0/24 to any dst-port 53 out via oif
00450 0 0 allow udp from any 53 to 192.168.0.0/24 in via oif
00500 0 0 allow tcp from 192.168.0.0/24 to any dst-port 80,25,110 via oif keep-state
00700 0 0 allow icmp from any to any
65535 2 96 deny ip from any to any
И вот он болт в чистом виде.
До правила 500 пакет просто не доходит, соответственно ответное правило не генерируется.
А все из-за правила 300. И, вроде, все логично, но как мне в таком случае прописать динамику для локальной сети???
Вот тут моя мысль пока зашла в тупик..
млин, сорри, в обоих случаях пускал тестовый телнет на 80 порт на IP яндекса, чтобы пока отсеять DNS
> И вот он болт в чистом виде.
> До правила 500 пакет просто не доходит, соответственно ответное правило не генерируется.естно ) как прописали - так и робит ))
> А все из-за правила 300. И, вроде, все логично, но как мне
> в таком случае прописать динамику для локальной сети???
> Вот тут моя мысль пока зашла в тупик..allow ip from any to any via lo
allow ip from any to any via iif
divert 8668 ip from 192.168.0.0/24 to any out via oif
divert 8668 ip from not any to x.x.x.x in via oif
check-state
#после дайверта исходящий с oif пакет имеет x.x.x.x в качестве соурса!
allow udp allow from x.x.x.x to any dst-port 53 keep-state # разрешаем DNS
allow tcp allow from x.x.x.x to any dst-port 25,110,80 keep-state # разрешаем почта+веб
allow icmp from any to any keep-state
deny ip from any to any # дефолтный дропкакто так .....
Вот и я так думал - в самом начале привел такую же схему, только я там check-state ошибочно поднял над natd. Но на клиентской машине по-прежнему нет ни http, ни почты. На роутере - да, есть.allow udp allow from x.x.x.x to any dst-port 53 keep-state # разрешаем DNS
allow tcp allow from x.x.x.x to any dst-port 25,110,80 keep-state # разрешаем почта+вебЭти правила будут создавать динамические, для разрешения прохождения ответных пакетов из any только на сам роутер. Так как соурсом в вышеперичисленных сам роутер и выступает. А по другому и никак. А вот как создать работающие правила с keep-state именно для внутренней сети - не пойму. Нет, можно, конечно http через прокси на роутере пустить, но а с остальными портами что делать?
Блин, это вообще в принципе возможно сделать в ipfw???
Ну просто не нравятся мне совершенно эти правила в статике, типа
allow tcp from any 80 to 192.168.0.0/24 in via oif
Ну что это за дыра...
Как для внутренней сети, без всяких прокси, разрешить прохождение входящих пакетов ТОЛЬКО в том случае, если они идут в ответ на уже инициированное внутреннеми хостами исходящее соединение???
упс, кажется, я нашел выход)) Ну, всмысле нашел в man_ipfw нужный мне абзац с описанием моей ситуации. Сейчас, покурю еще матчасть и попробую в действии. Ну и отпишусь, конечно.
skipto Forever)))
для начала надо сформулировать четко что надо - из словесной каши мало что понятно ...
Необходимо в конечном итоге получить 80,25,110 порты на клиентской машине, не через прокси.
> Необходимо в конечном итоге получить 80,25,110 порты на клиентской машине, не через
> прокси.и чем вас не устроил мой вариант?
>> Необходимо в конечном итоге получить 80,25,110 порты на клиентской машине, не через
>> прокси.
> и чем вас не устроил мой вариант?Тем, что, насколько я понимаю, 80, 25, 110 порты (да любые в таком варианте)
на хостах внутренней сети мы не получим в принципе. На самом роутере - да, все будет красиво.allow ip from any to any via lo
allow ip from any to any via iif
divert 8668 ip from 192.168.0.0/24 to any out via oif
divert 8668 ip from not any to x.x.x.x in via oif
check-state
#после дайверта исходящий с oif пакет имеет x.x.x.x в качестве соурса!
allow udp allow from x.x.x.x to any dst-port 53 keep-state # разрешаем DNS
allow tcp allow from x.x.x.x to any dst-port 25,110,80 keep-state # разрешаем почта+веб
allow icmp from any to any keep-state
deny ip from any to any # дефолтный дропСмотрите, правила с keep-state в этом варианте стоят после нат и относятся только к собственно роутеру (x.x.x.x или me, как угодно), поэтому исходящий пакет с внутреннего хоста то пройдет (хоть и в таблицу состояний не попадет), но входящий - нет, поскольку динамическое правило по сути - не для него.
В этом случае, я так думаю, схема нужна примерно такая -add 100 allow ip from any to any via lo
add 200 allow ip from any to any via iif
add 300 natd ip from any to any in via oif
add 400 check-state
add 500 skipto 1000 tcp from any to any 80,25,110 out via oif keep-state
add 600 deny ip from any to any
add 1000 natd ip from any to any out via oif
add 1100 allow ip from any to any via oif
#и дефолтный дропНа практике сегодня не успел проверить - на резервном канале инет отключили...
Но, в теории - должно работать. Во всяком случае, в man_ipfw обнаружил именно это.
>[оверквотинг удален]
> DNS
> allow tcp allow from x.x.x.x to any dst-port 25,110,80 keep-state # разрешаем
> почта+веб
> allow icmp from any to any keep-state
> deny ip from any to any # дефолтный дроп
> Смотрите, правила с keep-state в этом варианте стоят после нат и относятся
> только к собственно роутеру (x.x.x.x или me, как угодно), поэтому исходящий
> пакет с внутреннего хоста то пройдет (хоть и в таблицу состояний
> не попадет), но входящий - нет, поскольку динамическое правило по сути
> - не для него.Да, для внешнего интерфейса. Внутренний пройдет по 2-му правилу.
>[оверквотинг удален]
> add 100 allow ip from any to any via lo
> add 200 allow ip from any to any via iif
> add 300 natd ip from any to any in via oif
> add 400 check-state
> add 500 skipto 1000 tcp from any to any 80,25,110 out via
> oif keep-state
> add 600 deny ip from any to any
> add 1000 natd ip from any to any out via oif
> add 1100 allow ip from any to any via oif
> #и дефолтный дропОчень интересно, как отработает эта конструкция:)
> Да, для внешнего интерфейса. Внутренний пройдет по 2-му правилу.Не понял, по какому второму??
> Очень интересно, как отработает эта конструкция:)
Что вас рассмешило? Я где-то ошибся?
ну в принципе должно быть так, конечно -add 100 allow ip from any to any via lo
add 200 allow ip from any to any via iif
add 300 natd ip from any to any in via oif
add 400 check-state
add 500 skipto 1000 tcp from any to any 80,25,110 out via oif keep-state
add 510 skipto 1000 udp from any to any 53 out via oif keep-state
add 520 skipto 1000 icmp from any to any out via oif keep-state
#в первом варианте правило из 500-й серии оставил одно для наглядности
add 600 deny ip from any to any
add 1000 natd ip from any to any out via oif
add 1100 allow ip from any to any via oif
#и дефолтный дроп
>> Да, для внешнего интерфейса. Внутренний пройдет по 2-му правилу.
> Не понял, по какому второму??add 200 allow ip from any to any via iif
>> Очень интересно, как отработает эта конструкция:)
> Что вас рассмешило? Я где-то ошибся?Я не претендую на _знание_ ipfw, так как он у меня тоже на стадии изучения. Если я правильно понял, в предлагаемой конструкции в динамическую таблицу должно попасть не правило прохода экрана, а переход на статическое правило прохода? А понятия 'интересно' и 'смешно' не путаю. Но, если я прав, подход забавный. Без обид?
> divert 8668 ip from not any to x.x.x.x in via oifзачем 'not'?
и
> allow udp allow from x.x.x.x to any dst-port 53 keep-stateallow udp from x.x.x.x to any 53 via oif keep-state
> allow tcp allow from x.x.x.x to any dst-port 25,110,80 keep-stateallow tcp from x.x.x.x to any 25,80,110 via oif setup keep-state
> allow icmp from any to any keep-state
а 'keep-state' здесь нужен?
и, наверное, ipfw add deny all from any to any established после check-state?
>> divert 8668 ip from not any to x.x.x.x in via oif
> зачем 'not'?затем что описка
> allow udp from x.x.x.x to any 53 via oif keep-state
>> allow tcp allow from x.x.x.x to any dst-port 25,110,80 keep-state
> allow tcp from x.x.x.x to any 25,80,110 via oif setup keep-state
>> allow icmp from any to any keep-stateкакая в опу разница?
> а 'keep-state' здесь нужен?нужет
> и, наверное, ipfw add deny all from any to any established после
> check-state?ммм прежде чем вносить глупые коменты может стоит внимательно прочитать?
в данном фаеезе дозведы - потому как до дропа идут правила разрешающие исходящие пакеты ...
>>> allow icmp from any to any keep-state
>> а 'keep-state' здесь нужен?
> нужетКатегорично... А что это дает?
>> и, наверное, ipfw add deny all from any to any established после
>> check-state?... ipfw add deny all from any to any via oif established ...
> ммм прежде чем вносить глупые коменты может стоит внимательно прочитать?
Так укажите, где глупость и почему глупость или игнорируйте. Злиться зачем?
> в данном фаеезе дозведы - потому как до дропа идут правила разрешающие
> исходящие пакеты ...И входящие заодно, если я правильно понимаю. А 'фаеезе' это что?
>>> и, наверное, ipfw add deny all from any to any established после
>>> check-state?
> ... ipfw add deny all from any to any via oif established
> ...а какже udp например?
> И входящие заодно, если я правильно понимаю. А 'фаеезе' это что?
фаере
это тестовый вариант фаера - товарисщь пытается запустить statefull
Перетащу сюда, вниз, что то ответы вразброс идут...
Итак, вот костяк конфигаadd 100 allow ip from any to any via lo
add 200 allow ip from any to any via iif
add 300 natd ip from any to any in via oif
add 400 check-state
add 500 skipto 1000 tcp from any to any 80,25,110 out via oif keep-state
add 510 skipto 1000 udp from any to any 53 out via oif keep-state
add 520 skipto 1000 icmp from any to any out via oif keep-state
add 600 deny ip from any to any
add 1000 natd ip from any to any out via oif
add 1100 allow ip from any to any via
#и дефолтный дропЧто думаете? К глубочайшему сожалению, прямо сейчас нет возможности проверить на роутере.
Но в теории - как раз то, что нужно...
кип-стайтит пакеты из локальной сети, натит все, что нужно. Также проходят пакеты от самого роутера. Входящие пакеты, не принадлежащие открытым изнутри соединениям - отбрасываются правилом 600. Смотрю в упор 28-й раз, вроде теоретически должен работать...
>[оверквотинг удален]
> add 600 deny ip from any to any
> add 1000 natd ip from any to any out via oif
> add 1100 allow ip from any to any via
> #и дефолтный дроп
> Что думаете? К глубочайшему сожалению, прямо сейчас нет возможности проверить на роутере.
> Но в теории - как раз то, что нужно...
> кип-стайтит пакеты из локальной сети, натит все, что нужно. Также проходят пакеты
> от самого роутера. Входящие пакеты, не принадлежащие открытым изнутри соединениям -
> отбрасываются правилом 600. Смотрю в упор 28-й раз, вроде теоретически должен
> работать...хм - решили усложнить жизнь skip-to ))
если уж так не прет - то берите tcpdump + вешайте на все правила log и смотрите ...
Ну наконец-то!! Фаер заработал именно так, как нужно.
Итак, финальный костяк statefull -конфига (собственно, почти не отличающийся от крайнего вышепреведенного)#!/bin/sh
/sbin/ipfw -q -f flush
/sbin/ipfw add 100 allow all from any to any via lo
/sbin/ipfw add 120 allow all from any to any via iif
/sbin/ipfw add 250 divert natd ip from any to x.x.x.x in via oif
/sbin/ipfw add 260 check-state
/sbin/ipfw add 300 skipto 1000 udp from any to any 53 out via oif keep-state
/sbin/ipfw add 310 skipto 1000 tcp from any to any 80,25,110 out via oif keep-state
/sbin/ipfw add 320 skipto 1000 icmp from any to any out via oif keep-state
/sbin/ipfw add 400 deny all from any to any
/sbin/ipfw add 1000 divert natd ip from 192.168.0.0/24 to any out via oif
/sbin/ipfw add 1100 allow all from any to any via oif
#и дефолтный deny all from any to anyЕсс-но, самыми верхними правилами нужно добить всякий антиспуфинг и прочие соблюдения rfc, с их учетом завтра этот же конфиг выложу и попрошу всех Вас его раскритиковать, если будет за что.
DenSha - на самом деле это конфиг- вполне себе простой и логичный выход из ситуации, когда нужно иметь statefull - фаерволл в связке с нат. Без skipto - вы просто не расположите в принципе правила 250,260,300-320,1000 в таком порядке, чтобы и keep-state отрабатывал то, что нужно (а именно и пакеты с хостов внутренней сети, и самого роутера), и нат натил, и правила пропускали все это безобразие, причем в обе стороны. Причем, чтобы входящий трафик в принципе был закрыт, а открывался только в ответ на уже установленное исходящее соединение, да и то на несколько секунд.
А правило 120 - всего лишь разрешает прохождение всего через ЛОКАЛЬНУЮ сетевую роутера, но не дальше.http://www.intuit.ru/department/network/firewalls/3/9.html
Вот здесь, ближе к концу - как раз все это описывается, на русском, с примером.
Впрочем, это лишь перевод слово в слово с man ipfw, пункт 30.6.5.7