>после NAT, здесь адресом источника, для исходящих с $ext_if, уже будет адрес внешнего >интерфейса. по адресу источника фильтруйте на внутреннем интерфейсе или для них не >делайте NAT и потом не выпускайте с $ext_if пакеты с адресом источника, отличным от >адреса внешнего интерфейса.Спасибо. Тут разобрался и понял, куда как пакеты ходят.
>У вас ДХЦП????? ^^^^
Да. Те машины, доступ которых надо так или иначе контролировать, имеют StaticDHCP.
># PacketFilter
>pf_enable="NO"
> ^^^^
>нуна "YES"
Я его просто вручную включаю пока. Чтобы в крайнем случае, если совсем всё заблокирую, машину можно было бутнуть (работаю по ssh). Впрочем, теперь уже подключены монитор и клавиатура.
>Да, и вот еще, попробуйте сначала сделать простые правила, а затем усложнять и приводить >к реалиям.
Уже осознал и перешёл. Дело на самом деле в том, что всё это нерабочее хозяйство досталось мне от уволившегося админа, который не успел этот шлюз довести до ума. Вот я теперь систему и осваиваю.
> 1) Распишите, что именно вы хотите сделать с PF.
Если рассматривать простейший квант задачи - то обеспечить выполнения простых правил:
компу(группе компов) А можно через нат выходить в интернет (другую подсеть),
компу(группе компов) Б - нельзя.
Из таких кусочков можно построить всё, что мне необходимо.
> 2) Мониторить пробовали? Дайте вывод загрузки правил...
Пробовал - будет чуть ниже.
>В этом куске заменить "pass out on $ext_if" на "pass quick in on $int_if"
>А перед ним поставить "block in on $int_if"
>И поубирать "keep-state" везде!
Почему-то не получилось. А keep state - в соответствии с http://www.lissyara.su/?id=1671 - роли тут не играет.
> Попробуйте изложить задачу фильтра по-русски.
Разрисовка всего на бумаге помогла найти ошибку в правилах, но сами бы правила работали...
В общем, что сделал. Упростил правила до минимума, пока pf пускает всё и контролирует только icmp - так проще наблюдать за ситуацией. Если в секции out стоит следующее:
pass out all #выпускаем весь трафик
block out log proto icmp from any to any #но блокируем icmp весь
pass out log on $ext_if proto icmp from any to any #разрешаем его, тем не менее, с $ext_if
pass out log on $int_if proto icmp from any to any #и с $int_if тоже
То получаем закономерную картину для пинга ya.ru с машины 192.168.5.44:
000000 rule 14/0(match): pass out on sis0: (tos 0x0, ttl 127, id 12159, offset 0, flags [none], proto ICMP (1), length 60) 10.0.0.2 > 213.180.204.8: ICMP echo request, id 13284, seq 4106, length 40
003610 rule 15/0(match): pass out on fxp1: (tos 0x0, ttl 57, id 23417, offset 0, flags [none], proto ICMP (1), length 60) 213.180.204.8 > 192.168.5.44: ICMP echo reply, id 512, seq 4106, length 40
Теперь меняем последнее правило:
pass out all #выпускаем весь трафик
block out log proto icmp from any to any #но блокируем icmp весь
pass out log on $ext_if proto icmp from any to any #разрешаем его, тем не менее, с $ext_if
pass out log on $int_if proto icmp from 192.168.5.44 to any #а с $int_if разрешаем только заданному IP
И получаем картину странную:
000000 rule 14/0(match): pass out on sis0: (tos 0x0, ttl 127, id 56379, offset 0, flags [none], proto ICMP (1), length 60) 10.0.0.2 > 213.180.204.8: ICMP echo request, id 2281, seq 6410, length 40
014106 rule 13/0(match): block out on fxp1: (tos 0x0, ttl 57, id 30264, offset 0, flags [none], proto ICMP (1), length 60) 213.180.204.8 > 192.168.5.44: ICMP echo reply, id 512, seq 6410, length 40
Т.е. трафик, уходящий с внутреннего интерфейса (fxp1) благополучно блокируется, хотя разрешён явным образом. Пробовал задавать не IP, а таблицу <allowed> в правиле, играться с ключами keep state/no state, добавлять quick и т.п. Без толку, картина одинаковая.
Одинаково непонятная для меня пока.
Так что продолжаем борьбу.
P.S. а тут ещё вышел более чем недельный перерыв в работе.