Ключевые слова:firewall, ipfw, example, (найти похожие документы) From : Roman Y. Bogdanov http://peps37.ktk.ru/
Subj : [FreeBSD] Пример построения пакетного фильтра на ipfw
-------------------------------------------------------------------------------
From: "mitrohin a.s." <swp#bspu.secna.ru>
Поправте меня если я неправ.
Пакет проверяется списком правил дважды -- на входе и на выходе. Если
на входном интерфейсе пакет прошел, то, если пакет должен уйти дальше,
он будет проверяться еще раз на исходящем интерфейсе. Иными словами
если пакету надо попасть на нашу машину, то он должен пройти наши
правила -- а можно ли впустить этот пакет, после чего наша машина
чего-то с ним делает и, если решает отправить этот пакет дальше -- то
проверяет его списком правил еще раз -- а можно ли этот пакет
выпускать. Соответственно нами генерируемые пакеты будут проверяться
один раз -- на выходе, а предназначенные нам -- один раз -- на входе.
Пример правил и для входящих и для исходящих пакетов
# глушатся все пакеты и на входе и на выходе
ipfw add deny icmp from any to any
# пропускаются все пакеты через ed0
ipfw add pass icmp from any to any via ed0
Пример однонапрвленных правил
# разрешены все входящие пакеты через ed0
# вместо in recv можно написать in via :)))
ipfw add deny ip from any to any in recv ed0
# разрешены все исходящие пакеты через ed0
# вместо out xmit можно написать out via
ipfw add deny ip from any to any out xmit ed0
Очень важно что путь пройденный пакетом по нашей машине запоминается и
соответственно мы можем использовать такие параметры как входящий и
исходящий интерфейс.
Это еще один интересный пример однонаправленных правил
# запрещаются все ИСХОДЯЩИЕ через ed1 пакеты, которые
# были получены через ed0
ipfw add deny ip fron any to any out recv ed0 xmit ed1
divert правила заворачивают все пакеты на сокет, который слушает natd.
natd переписывает содержимое заголовка пакета. далее переходим к
следующему правилу (!!! а пакет то уже другой).
Например
# заворачивается весь трафик через внешний интерфейс
ipfw add divert 8668 ip from any to any via sl0
Пример
Считаем что внутри только друзья -- которые используют прокси :)))
ipfw add pass ip from any to any via lo0
ipfw add pass tcp from any to any established
ipfw add pass icmp from any to any
ipfw add pass ip from any to any frag
ipfw add pass ip from any to any via ed0
ipfw add pass ip from ${ip_sl0} to any out xmit sl0
ipfw add pass tcp from any to ${ip_sl0} smtp in recv sl0 setup
ipfw add pass tcp from any to ${ip_sl0} http in recv sl0 setup
ipfw add pass tcp from any to ${ip_sl0} 53 in recv sl0 setup
ipfw add pass udp from any to ${ip_sl0} 53 in recv sl0
ipfw add pass udp from any 53 to ${ip_sl0} in recv sl0
# это чтобы посмотреть чего мы запрещаем, может мы не правы?
ipfw add count log ip from any to any
# последнее правило
65535 deny ip from any to any
Следующи конфиг ipfw делает следующее:
1. Запрещает получать пакеты входящие через ed0, те что адресованны локальным адресам;
2. Далее стоит запись НАТ, тобишь на тазике поднят НАТ который и перезаписывает заголовок пакета на локальные адреса (необходимо для нормальной работы НАТ)
3. Далее идёт прикол!!! после обработки пакета процессом natd пакет далее проходит по правилам и он считается всё ещё как входящий в интерфейс ed0. Для этого и записанно следующее правило.
01500 0 0 deny ip from any to 10.11.11.0/24 in recv ed0
01600 1234066 354874155 divert 8668 ip from any to any via ed0
01700 299171 250210529 allow ip from any to 10.11.11.0/24 in recv ed0