Страница 1 из 1

ipfw, MAC-и, layer2

Добавлено: 2008-08-29 13:08:42
bitman
Привет всем.
Считаю, что мне очень повезло с тем, что когда-то попал на этот сайт. Многому научился.
Последние несколько дней пытаюсь привести в порядок правила ipfw на 7-й фре.
В общем, с пом. Гугля привел правила к такому виду (ниже). Конфигурация интерфейсов и инета видна из первых же строк. Правила по доступу к удаленным сервисам еще не писал - это не проблема.
А проблема вот в чем: при выключенной обработке layer2 вроде работает как надо (день работало, больше не проверял). Как только включаю net.link.ether.ipfw = 1, сразу файрвол затыкается :(
Да, я читал про то, что теперь пакет в интерфейсе проходит 4 раза через фаер, а не 2. На это и опирался при построении правил.
Считаю авторов этого сайта авторитетными профессионалами, поэтому прошу помощи. Подскажите, где ошибся?
Вот настройки скрипта:

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

#!/bin/sh

ID_INT1="11";
NET_INT1="192.168.65.0/24";
IP_INT1="192.168.65.128";
IF_INT1="sk0";
PIPE_INT1_IN="bw 256Kbit/s";
PIPE_INT1_OUT="bw 256Kbit/s";
TCP_INT1="25,80,110,65022,22";
UDP_INT1="53";

ID_INET1="31";
IP_INET1="192.168.64.2";
IF_INET1="re0";
TCP_INET1="25,80,110,65022,22";
GW1="192.168.64.128";
NAT1="8668";

FWCMD="/sbin/ipfw";
ADD="/sbin/ipfw add";
TBL="/sbin/ipfw table";
END_RULE_NUM="64000";
END_RULE_BODY="deny log all from any to any";

pre_setup () {
  ${FWCMD} disable firewall;
  ${FWCMD} -f flush;
}

post_setup () {
  /sbin/sysctl net.inet.ip.fw.enable=1;
  /sbin/sysctl net.inet.ip.fw.one_pass=0;
  /sbin/sysctl net.link.ether.ipfw=1;
}
Вот результат работы скрипта:

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

01111 skipto 11100 ip from 192.168.65.0/24 to any in via sk0 layer2
01115 skipto 11500 ip from 192.168.65.0/24 to any in via sk0 not layer2
01311 skipto 31100 ip from any to any in via re0 layer2
01315 skipto 31500 ip from any to any in via re0 not layer2
01990 deny ip from any to any in layer2
09010 allow ip from any to any out layer2
09111 pipe 115 ip from 192.168.65.0/24 to any out via re0 not layer2
09931 divert 8668 ip from any to any out via re0
09990 allow ip from any to any out
09999 skipto 64000 ip from any to any
11101 allow ip from any to any MAC any 00:1d:60:58:55:72
11102 allow ip from 192.168.65.1 to any MAC any 00:30:1b:28:08:05
11199 deny ip from any to any layer2
11580 allow ip from any to 192.168.65.128
11590 allow ip from any to any
11599 skipto 64000 ip from any to any
31101 allow ip from any to any MAC any any
31199 deny ip from any to any layer2
31510 divert 8668 ip from any to any
31520 allow ip from any to 192.168.64.2
31911 pipe 111 ip from any to 192.168.65.0/24 not layer2
31990 allow ip from any to any
31999 skipto 64000 ip from any to any
64000 deny log logamount 100 ip from any to any
net.inet.ip.fw.enable: 1 -> 1
net.inet.ip.fw.one_pass: 1 -> 0
net.link.ether.ipfw: 0 -> 1

Re: ipfw, MAC-и, layer2

Добавлено: 2008-08-29 13:59:50
hizel
не вижу , 10 минут мидитировал :(
надо будет вечерком, чтоли, еще раз глянуть

мм, вы не находите, что результирующие правила сложны для понимания? :)

Re: ipfw, MAC-и, layer2

Добавлено: 2008-08-29 14:30:26
bitman
Тогда опишу то же, с пояснениями:
Принцип такой - отбираю все входящие на всех интерфейсах, на них же всякие проверки и фильтры. Тогда велика вероятность, что при отфильтрованных входящих исходящий трафик тоже будет соответствовать политикам.

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

//вход из внутренней сети
01111 skipto 11100 ip from 192.168.65.0/24 to any in via sk0 layer2
01115 skipto 11500 ip from 192.168.65.0/24 to any in via sk0 not layer2
//вход из Интернет
01311 skipto 31100 ip from any to any in via re0 layer2
01315 skipto 31500 ip from any to any in via re0 not layer2
//остальные входящие - рубим
01990 deny ip from any to any in layer2

//исходящие канального уровня не проверяем, а пропускаем сразу (?)
09010 allow ip from any to any out layer2
//обработка исходящих (НАТ, пайпы). Пайпы касаются только трафика Интернет. Между локальными подсетями - без ограничений
09111 pipe 115 ip from 192.168.65.0/24 to any out via re0 not layer2
09931 divert 8668 ip from any to any out via re0
09990 allow ip from any to any out //тут будут правила по доступу к внешним сервисам 
09999 skipto 64000 ip from any to any

//блок проверки отправителя пакета. Сюда они отправляются "скипами" из первого блока
//проверка внутр. сети
11101 allow ip from any to any MAC any 00:1d:60:58:55:72
11102 allow ip from 192.168.65.1 to any MAC any 00:30:1b:28:08:05
11199 deny ip from any to any layer2
11580 allow ip from any to 192.168.65.128
11590 allow ip from any to any
11599 skipto 64000 ip from any to any
//проверка входящих из Интернет.
31101 allow ip from any to any MAC any any //Тут можно поставить МАК маршрутизатора провайдера по умолчанию
31199 deny ip from any to any layer2
31510 divert 8668 ip from any to any //НАТ входящих
31520 allow ip from any to 192.168.64.2 //пайпы на вход. Мы ж теперь после НАТа знаем, что и куда идет
31911 pipe 111 ip from any to 192.168.65.0/24 not layer2
31990 allow ip from any to any //тут можно устроить проверку на доступ "снаружи". Например, для TCP указать established
31999 skipto 64000 ip from any to any

64000 deny log logamount 100 ip from any to any //єто и так понятно

net.inet.ip.fw.enable: 1 -> 1
net.inet.ip.fw.one_pass: 1 -> 0
net.link.ether.ipfw: 0 -> 1
А почему так громоздко? Потому что скрипт рассчитан на несколько каналов к провайдерам и несколько внутренних подсетей. Это в примере я упростил. А когда включить всё, то получается довольно стройно и сгруппированно.

Re: ipfw, MAC-и, layer2

Добавлено: 2008-08-30 9:07:48
zingel
коммутаторы не рагуаются на такие жесткие фильтры layer2?

Re: ipfw, MAC-и, layer2

Добавлено: 2008-08-31 13:43:16
bitman
Эмм... какие коммутаторы?
Дело в том, что эти фильтры я еще только пробую. Тестовая машина включена в серую подсеть и имитирует шлюз для виндового компа, кот. стоит "за ним". Когда испытывал - без обработки канального уровня - интернет-радио, серфинг, торенты работали ОК.
А вот, когда включал переменную net.link.ether.ipfw: 0 -> 1, тогда и происходил "затык". Поэтому про уровень2 еще ничего сказать не могу :(
А может, в этом и проблема? Может, я не учитываю какие-то преобразования адресов или прохождение пакетов канального уровня на внутренних интерфейсах шлюза?

Re: ipfw, MAC-и, layer2

Добавлено: 2008-08-31 13:55:03
zingel
нужно смотреть где рубится, обычно это в логах есть

Re: ipfw, MAC-и, layer2

Добавлено: 2008-08-31 14:00:57
bitman
Хорошо, завтра посмотрю (машина на работе). Не хотел включать тяж. артиллерию, думал тут "с наскоку" скажут.
Ладно, буду копать...

Re: ipfw, MAC-и, layer2

Добавлено: 2008-09-02 8:29:54
hizel
я бы не стал фильтровать layer2 на аплинке

Re: ipfw, MAC-и, layer2

Добавлено: 2008-09-02 9:11:28
bitman
Вобщем-то, я и не собирался фильтровать данные. Я хочу фильтровать получателей-отправителей.

Re: ipfw, MAC-и, layer2

Добавлено: 2008-09-02 9:13:17
hizel
ну да обычно на это и направлена деятельность по фильтрованию layer2
убираете фильтрацию layer2 на аплинке, упращаете фаервол, там у вас и так НАТ сидит
принцып "бритвы Окама" ;)

Re: ipfw, MAC-и, layer2

Добавлено: 2008-09-02 9:30:13
bitman
Согласен насчет бритвы - иногда меня "заносит" :smile: Упрощать я начал еще вчера.
И я не "уперся рогом" - при достижении любой цели ищу лаконичные решения.
В данном случае интересно разобраться в механизме, раз он есть.

Re: ipfw, MAC-и, layer2

Добавлено: 2011-04-11 15:03:06
Mamazulu
Похожая ситуация. Не могу привязать маки к айпишникам, блочится всё. Список через ARP не предлагайте. Всё может измениться.

Re: ipfw, MAC-и, layer2

Добавлено: 2011-04-11 15:14:23
Mamazulu
Не успел вписать код

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

fwcmd="/sbin/ipfw -q"
${fwcmd} -f flush
${fwcmd} -f pipe flush
${fwcmd} -f queue flush

        # set these to your outside interface network and netmask and ip
        oif="rl0"
        onet="шлюз провайдера"
        omask="255.255.255.248"
        oip="мой ip"
        dns="dns"
        vpn0="ng0"

        # set these to your inside interface network and netmask and ip
        iif="age0"
        inet="192.168.0.0"
        imask="255.255.255.0"
        iip="внутр ip"
  
#####################################

        IpOut="внешний ip"
        IpIn="внутренний ip"
        NetOut="${inet}:${omask}"
        NetIn="192.168.0.0"
        NetMask="24"
#цикл пайпов
${fwcmd} add pipe 1 ip from ${IpOut} to ${NetIn}/${NetMask}
.........................
${fwcmd} add pipe n ip from ${IpOut} to ${NetIn}/${NetMask}
#
setup_loopback ()

        ${fwcmd} add 25350 divert natd all from any to any via ${oif}
        ${fwcmd} add 25352 check-state

### Далее идут обычные правила на порты и IP клиентов.
.......................

        ${fwcmd} add 65550 deny log logamount 10000 ip from any to any

Вообщем, при включении net.link.ether.ipfw=1 пропадает любой доступ к серверу.

Re: ipfw, MAC-и, layer2

Добавлено: 2011-04-11 16:03:24
hizel
есть простая тонкость, вернее их две
1. транзитный пакет проходит через фаервол 4(четыре) раза
2.

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

allow ip from <ip> to any
- не пропустит пакет с <ip>, пропустит например

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

allow ip from <ip> to any mac any <mac>
а также, если протокол построен по принципу все запрещено кроме разрешенного блокируется также широковещательный трафик arp протокола,
поэтому обычно упрощают правила с помощью признака layer2, о чем есть соответствующая запись в man ipfw