Вот несколько ссылок
1. http://news.gw.com/freebsd.isp/9412
2.http://www.m0n0.ch/wall/list/?action=show_msg&actionargs%5B%5D=95&actionargs%5B%5D=30
3. http://bsdsearch.com/eao/phorum/read.php?f=38&i=2977&t=2977
man ipfw
“Всегда используется Законченный набор правил, НЕЗАВИСИМО от МЕСТА, из
которого вызван ipfw, или адреса-источника пакета. Если правило содержит
некоторые образцы соответствия или действия, которые НЕ ДОПУСТИМЫ для
МЕСТА вызова (например, требующие соответствия MAC заголовка, если ipfw
вызывают из ip_input ()), образец соответствия НЕ БУДЕТ соответствовать.
Однако оператор not перед такими образцами заставит образец ВСЕГДА
соответствовать на тех пакетах, которые могли бы вызвать нежелательные
результаты. ( 3 ссылка) Таким образом, на ответственности программиста в случае
необходимости записывать подходящий набор правил для ДИФФЕРЕНЦИРОВАНИЯ
среди возможных мест. Здесь может быть полезно правило skipto”
Идеология ( как я ее понял )
если net.link.ether.ipfw=1
то необходимо писать правила layer2(MAC) для ВСЕХ сетевых интерфейсов
и они должны быть дифференцированы относительно
обычных правил ipfw ( skipto) Хотя это и не обязательно – можно и так извернуться
Таким образом в ipfw должен быть определен набор правил allow, deny для уровня layer2 ( MAC) при этом ПОСЛЕДНЕЕ правило в наборе где идет проверка MAC должно быть
Allow(deny) ip from any to any MAC any any
или
allow(deny) ip from any to any layer2 via xxx
Допустим у нас есть три интерфейса fxp0 rl0 и xl0
Мы хотим cделать проверку layer2(MAC) на fxp0 а на других интрефейсах
Нам этого не надо.
1.Вариант
allow ip from any to any layer2 via rl0
allow ip from any to any layer2 via xl0
правила для fxp0
……
Deny mac
Deny mac-type
allow ip from any to any layer2 via fxp0
2. Вариант
равнозначное правило
allow ip from any to any layer2 not via fxp0
правила для fxp0
……
Deny mac
Deny mac-type
allow ip from any to any layer2 via fxp0
здесь есть много вариантов, например
пропускать через fxp только заданные MAC IP и т.д.
почитай ссылкам
пример из http://www.m0n0.ch/wall/list/?action=show_msg&actionargs%5B%5D=95&actionargs%5B%5D=30
20002 deny ip from 192.168.8.2 not MAC any 00:0c:f1:08:97:48 any layer2 in
20002 deny ip from any to 192.168.8.2 not MAC 00:0c:f1:08:97:48 any layer2 out
29900 allow ip from any to any layer2
……..
В твоем случае это может выглядеть так
Ip 192.168.50.250 его MAC 00:0e:a6:45:0b:d4
${ipfw} add allow all from 192.168.50.250 to any mac src-mac 00:0e:a6:45:0b:d4 via fxp0
…..
${ipfw} add deny all from any to any layer2 via fxp0
Т.е через fxp0 пройдут только указанные ip с указанным src-mac
Но, еще раз повторюсь, если у тебя есть другие интерфейсы и ты для них не указал
Разрешающие правила на уровне layer2 то нас ждет облом ( причем не сразу,
Как ты уже заметил, а через некоторое время)
Сейчас подробно разберу работу моих правил
Задача:
Если user vasy с IP 192.168.50.33 и MAC 00:0e:a6:45:0b:d4 изменит свой IP
на ЛЮБОЙ другой >> deny ipfw
Старый набор правил
${ipfw} 10 add skipto 40 ip from 192.168.50.33 to any layer2 in via fxp0
${ipfw} 11 add skipto 100 ip from any to any not layer2
${ipfw} 20 add deny ip from ${my_net} to any mac src-mac 00:0e:a6:45:0b:d4 in via fxp0
${ipfw} 40 add allow ip from any to any MAC any any
Новый набор правил более оптимизированный ( работает со вчерашнего вечера )
Его и рассмотрим
${ipfw} 1 add skipto 100 ip from any to any not layer2
${ipfw} 5 add allow ip from any to any layer2 not via fxp0
${ipfw} 10 add skipto 40 ip from 192.168.50.33 to any layer2 in via fxp0
${ipfw} 20 add deny ip from ${my_net} to any mac src-mac 00:0e:a6:45:0b:d4 in via fxp0
${ipfw} 40 add allow ip from any to any layer2 via fxp0
Fxp0 внутренний интерфейс локальной сети ( остальные fxp1, fxp2 )
My_net = 192.168.50.0/24
to upper layers V
| |
+----------->-----------+
^ V
2 [ip_input] [ip_output] 3 net.inet.ip.fw.enable=1
| |
^ V
1 [ether_demux] [ether_output_frame] 4 net.link.ether.ipfw=1
| |
0 +-->--[bdg_forward]-->--+ 0 net.link.ether.bridge_ipfw=1
^ V
| to devices |
Если net.link.ether.ipfw=0 то пункты 1,4 ipfw не проверяет
Если net.link.ether.ipfw=1 то 1,2,3,4
${ipfw} 1 add skipto 100 ip from any to any not layer2
${ipfw} 5 add allow ip from any to any layer2 not via fxp0
${ipfw} 10 add skipto 40 ip from 192.168.50.33 to any layer2 in via fxp0
${ipfw} 20 add deny ip from ${my_net} to any mac src-mac 00:0e:a6:45:0b:d4 in via fxp0
${ipfw} 40 add allow ip from any to any layer2 via fxp0
Итак прибегает пакет IP 192.168.50.1 на fxp0 ( см. пункт 1 )
1. правило 1 “ перейти на правило 100 если пакет не принадлежит layer2”
Результат:
Пакет еще на пункте 1 стоит поэтому это правило не сработает.
2. правило 5 “ разрешить все пакеты layer2 на всех интерфейсах за
исключением fx