Правла выполняются сверху вниз. Поэтому, если вы вначале списка разрешите доступ куда-либо сегменту локальной сети (например сеть 192.168.1.0), а затем для отдельных IP адресов из этой сети будете закрывать доступ или ограничивать полосу (DUMMYNET), то ничего не получится. Пакет получит разрешение и благополучно уйдет, недойдя до правил запретов и ограничений.
файл /etc/rc.firewall
#Удаляет все предыдущие правила. (кроме 65535) ipfw -f flush
#ограничить полосу на интерфейсе: ipfw add 20 pipe 1 ip from any to any via ed0
#параметры для 20 правила: ipfw pipe 1 config bw 14Kbit/s
Также можно ограничить полосу для отдельного IP, отдельно на вход и/или отдельно на выход более подробно: man dummynet
#Запретить фрагментированные пакеты ipfw add 80 deny icmp from any to any frag ipfw add 81 allow icmp from any to any
#Нужно для прозрачного прокси ipfw add 90 fwd 127.0.0.1,3128 tcp from 192.168.0.0/24 to 0.0.0.0/0 80
#Разрешаем работу на интерфейсах. #Ниже приведены примеры "Разрешено для всех" # Ну т.е. сегмет сети подключеный к rl0 будет # доступен сегменту подключеному к ed0 и наоборот. # Решайте сами.
ipfw add 100 pass all from any to any via lo0 ipfw add 101 pass all from any to any via rl0 ipfw add 102 pass all from any to any via ed0
#если больше ничего не планируется, то собственно и всё. #Нужно выйти в инет, тогда добавим следубщие правила:
#Пропускать на соответствующие порты ipfw add 510 allow udp from any to any 53 ipfw add 511 allow udp from any 53 to any # также добавить для портов 123 (если нужно)
ipfw add 710 allow tcp from any to any 80 ipfw add 711 allow tcp from any 80 to any ipfw add 712 allow tcp from any to any 25 ipfw add 713 allow tcp from any 25 to any ipfw add 714 allow tcp from any to any 110 ipfw add 715 allow tcp from any 110 to any # также добавить для портов 20,21,443
...
Файл /etc/rc.firewall можно сделать выполняемым. Тогда, добавив/удалив очередное правило, можно просто перезапустить весь список. Удобно при отлаке маршрутов.
Вот так выглядит окончательный вариант для двух сетевых карточек. (без NAT)
ipfw -f flush
ipfw add 100 pass all from any to any via lo0 ipfw add 200 deny all from any to 127.0.0.0/8 ipfw add 300 deny ip from 127.0.0.0/8 to any
#ipfw add 310 pipe 1 all from 192.168.1.1/32 to any #ipfw add 320 pipe 1 all from any to 192.168.1.1/32 #ipfw pipe 1 config bw 2400bit/s
#Transparent proxy ipfw add 400 fwd 192.168.0.10,3128 tcp from 192.168.0.0/24 to 0.0.0.0/0 80
# Allow any traffic to or from my own net. ipfw add 450 pass all from 192.168.0.0/24 to 192.168.0.10 via fxp0 ipfw add 460 pass all from 192.168.0.10 to 192.168.0.0/24 via fxp0 ipfw add 470 pass all from 192.168.1.1 to 192.168.1.0/24 via rl0 ipfw add 480 pass all from 192.168.1.0/24 to 192.168.1.1 via rl0
# Allow TCP through if setup succeeded #ipfw add pass tcp from any to any established
# Allow IP fragments to pass through ipfw add 500 deny all from any to any frag
# Allow setup of incoming email ipfw add 510 pass tcp from any to any 25,110,119 ipfw add 520 pass tcp from any 25,110,119 to any # Alert 22 port ipfw add 530 pass tcp from any to any 20,21,22,80,443 ipfw add 540 pass tcp from any 20,21,22,80,443 to any ipfw add 550 pass tcp from any to any 8000-8888 ipfw add 560 pass tcp from any 8000-8888 to any
# Allow setup of outgoing TCP connections only #ipfw add pass tcp from ${ip} to any setup
# Disallow setup of all other TCP connections #ipfw add deny tcp from any to any setup
# Allow DNS queries out in the world ipfw add 600 pass udp from any to any 53,123 ipfw add 610 pass udp from any 53,123 to any
# Allow NTP queries out in the world #ipfw add pass udp from ${ip} to any 123 keep-state
ipfw add 700 deny icmp from any to any frag ipfw add 710 allow icmp from any to any
ipfw add 720 deny all from 192.168.0.0/24 to 192.168.0.10 ipfw add 730 deny all from 192.168.0.10 to 192.168.0.0/24