Пример структурирования правил фильтра пакетов ipfw во FreeBSD
с целью упрощения их восприятия и уменьшения вероятности допущения ошибок.Исторически так сложилось, что правила файрвола в rc.firewall написаны в плохом и труднопонимаемом стиле:
входящие и исходящие пакеты проходят один и тот же набор правил.
Многие используют этот скрипт как образец для написания собственного набора правил и
наступают на одни и те же грабли. Как минимум, с натом. На самом деле ipfw очень удобен,
если писать список правил как некую программу - с разбиением на мелкие подпрограммы (блоки)
и добавлением комментариев. При этом надо руководствоваться рядом
соглашений:
1. Весь трафик первым делом делится на входящий и исходящий.
Каждый вид трафика обрабатывается в отдельном блоке.
В качестве еще одного блока можно выделить трафик через интерфейс lo0.
Слова in и out после первоначального разделения трафика не
используются.
2. Входящий трафик делится на а) трафик, адресованный данному серверу;
б) броадкасты; в) мультикасты; г) трафик, идущий транзитом. Каждый из видов трафика
обрабатывается в отдельном блоке. Слово me после разделения трафика не используется.
3. Ветвление на блоки происходит по ip-адресам. Имена интерфейсов используются по возможности
как можно реже и только тогда, когда без них не обойтись. В частности, при написании
правил антиспуфинга. При использовании имен интерфейсов крайне не
рекомендуется
использовать слово via. В зависимости от блока (входящий или исходящий трафик) рекомендуется
использовать слова xmit или recv. Это повышает читабельность.
4. Все строки с правилами нумеруются (там где это допустимо).
Нумерация строго возрастающая. Рекомендуемый шаг между соседними номерами 100.
5. Блок занимает строго фиксированный диапазон номеров строк ipfw.
Номер строки, с которой начинается блок, указывается в комментарии в начале этого блока.
Переход на блок происходит только на его начало. Переход в середину блока недопустим.
6. Блок всегда заканчивается строкой allow ip from any to any или deny ip from any to any.
Исключение составляет ситуация, когда один блок должен выполняться следом за другим.
Даже если блок пустой (например, броадкасты или мультикасты не используются),
все равно лучше поместить в него это единственное правило, чем удалять блок целиком.
Возможно в будущем туда что-нибудь допишется.
Пример я как-то уже приводил несколько лет назад.
Приведу еще раз для трех разных серверов. Макросы, начинающиеся с %, заменятся на блоки ip-адресов.
На всех серверах дефолтное 65535 правило: allow ip from any to any.
Правила на центральном роутере/шлюзе в инет:
#!/bin/sh -e
fwcmd="echo"
# Интерфейсы, подключенные к Интернету
xmit_iface_inet="{ xmit fxp1 or xmit fxp2 }"
recv_iface_inet="{ recv fxp1 or recv fxp2 }"
# Ограничение количества ping-пакетов, уходящих на аплинка
$fwcmd pipe 10 config bw 5Kbit/s
######################################################################
## Разделение трафика в зависимости от направления (нумерация с 100)
######################################################################
# Трафик через интерфейс lo0
$fwcmd add 100 allow ip from any to any via lo0
# Исходящий трафик
$fwcmd add 200 skipto 30000 ip from any to any out
######################################################################
## Входящий трафик (нумерация с 500)
######################################################################
# Съем трафика для статистики
$fwcmd add 500 divert 18000 ip from any to any $recv_iface_inet
# NAT-трансляция входящих пакетов
$fwcmd add 700 divert 8668 ip from any to %ip.nat $recv_iface_inet
##-----------------------------------------------------------------------------
## Антиспуфинг (нумерация с 1000)
##-----------------------------------------------------------------------------
# Интерфейсы Интернета
$fwcmd add 1000 deny log ip from %global.internal to any $recv_iface_inet
##-----------------------------------------------------------------------------
## Разделение трафика в зависимости от получателя пакета (нумерация с 5000)
##-----------------------------------------------------------------------------
# Трафик, адресованный серверу
$fwcmd add 5000 skipto 10000 ip from any to me
# Броадкасты
$fwcmd add 5100 skipto 20000 ip from any to 255.255.255.255
# Мультикасты
$fwcmd add 5200 skipto 25000 ip from any to 224.0.0.0/4
##-----------------------------------------------------------------------------
## Трафик, идущий транзитом (нумерация с 6000)
##-----------------------------------------------------------------------------
# Запрещаем трафик на закрытые адреса магистрали
$fwcmd add 6000 deny log ip from any to %global.backbone.private
# Разрешаем остальной трафик
$fwcmd add 6300 allow ip from any to any
##-----------------------------------------------------------------------------
## Трафик, адресованный серверу (нумерация с 10000)
##-----------------------------------------------------------------------------
# Разрешаем установленные TCP-соединения
$fwcmd add 10000 allow tcp from any to any established
# Разрешаем фрагменты IP-пакетов
$fwcmd add 10100 allow ip from any to any frag
# Разрешаем пакеты, удовлетворяющие динамическим правилам
$fwcmd add 10200 check-state
# Разрешаем OSPF-пакеты
$fwcmd add 10300 allow ospf from %global.backbone to any
# Разрешаем GRE-пакеты
$fwcmd add 10400 allow gre from any to any
##-----------------------------------------------------------------------------
## Службы сервера (нумерация с 12000)
##-----------------------------------------------------------------------------
# SSH
$fwcmd add 12000 deny tcp from %deny.ssh to %ip.ssh 22
$fwcmd add 12100 allow tcp from %allow.ssh to %ip.ssh 22
# BGP
$fwcmd add 12200 deny tcp from %deny.bgp to %ip.bgp 179
$fwcmd add 12300 allow tcp from %allow.bgp to %ip.bgp 179
# SNMP
$fwcmd add 12400 allow udp from %allow.snmp to %ip.snmp 161,1161
##-----------------------------------------------------------------------------
## Завершающие правила для трафика, адресованного серверу (нумерация с 18000)
##-----------------------------------------------------------------------------
# Разрешаем ICMP-пакеты
$fwcmd add 18000 allow icmp from any to any
# Разрешаем работу traceroute
$fwcmd add 18100 unreach port udp from any to any 33434-33584
# Запрещаем соединения на 113 порт (ident)
$fwcmd add 18200 reset tcp from any to any 113
# Запрещаем соединения на 1080 порт (socks check)
$fwcmd add 18300 reset tcp from any to any 1080
# Запрещаем остальной трафик
$fwcmd add 18400 deny log ip from any to any
##-----------------------------------------------------------------------------
## Броадкасты (нумерация с 20000)
##-----------------------------------------------------------------------------
# Разрешаем SNMP trap'ы от ИБП
$fwcmd add 20000 allow udp from %global.backbone to any 162
# Разрешаем NTP-пакеты
$fwcmd add 20100 allow udp from %global.backbone to %global.backbone.broadcast 123
# Запрещаем остальной трафик
$fwcmd add 20200 deny log ip from any to any
##-----------------------------------------------------------------------------
## Мультикасты (нумерация с 25000)
##-----------------------------------------------------------------------------
# Разрешаем OSPF-пакеты
$fwcmd add 25000 allow ospf from %global.backbone to 224.0.0.0/24{5,6}
# Разрешаем общие IGMP и DVMRP-пакеты
$fwcmd add 25100 allow igmp from %global.backbone to 224.0.0.0/24{1,2,4}
$fwcmd add 25200 allow igmp from %ip.link.iskranet-gw to 224.0.0.0/24{1,2}
# Разрешаем трафик TVoIP
$fwcmd add 25300 allow ip from %ip.ext.tvoip to 224.2.153.173
# Запрещаем остальной трафик
$fwcmd add 25400 deny log ip from any to any
######################################################################
## Исходящий трафик (нумерация с 30000)
######################################################################
# Запрещаем отправку пакетов, предназначенных для внутрисетевых адресов,
# на шлюз по умолчанию
$fwcmd add 30000 deny ip from any to %global.internal $xmit_iface_inet
# Запрещаем отправку в Интернет пакетов Netbios
$fwcmd add 30100 deny tcp from any to any 135,139,445 $xmit_iface_inet
# Запрещаем отправку пакетов в Интернет для клиентов, которые отключены
# от Интернета
$fwcmd add 30200 skipto 30350 ip from %allow.internet to any $xmit_iface_inet
$fwcmd add 30300 deny ip from any to any $xmit_iface_inet
# Шейпинг ping-пакетов
$fwcmd add 30350 skipto 30400 icmp from %group.ping-shaping to any icmptypes 8 $xmit_iface_inet
$fwcmd add 30351 pipe 10 icmp from any to any icmptypes 8 $xmit_iface_inet
# Съем трафика для статистики
$fwcmd add 30400 divert 18001 ip from any to any $xmit_iface_inet
# NAT-трансляция исходящих пакетов
$fwcmd add 30800 divert 8668 ip from 192.168.0.0/16 to any $xmit_iface_inet
#$fwcmd add 30900 allow ip from %ip.nat to any $xmit_iface_inet
# Направляем пакеты в нужные интерфейсы аплинков в зависимости от их src-адреса
$fwcmd add 31000 fwd %ip.link.krastelecom-gw ip from %ip.link.krastelecom to any $xmit_iface_inet
$fwcmd add 31100 fwd %ip.link.iskranet-gw ip from %ip.link.iskranet to any $xmit_iface_inet
# Динамическое правило для доступа с данного сервера к внешним службам по UDP
$fwcmd add 31200 allow udp from me to any keep-state
##-----------------------------------------------------------------------------
## Аккаунтинг трафика (нумерация с 40000)
##-----------------------------------------------------------------------------
# Трафик Интернета
$fwcmd add 40000 skipto 40200 ip from %global.internal to %group.accounting
$fwcmd add 40100 divert 17000 ip from any to %group.accounting
######################################################################
Правила на сервере доступа:
#!/bin/sh -e
fwcmd="echo"
# Интерфейс, подключенный к клиентскому сегменту
iface_clients=fxp0
# Интерфейсы VPN
iface_vpns=ng*
######################################################################
## Разделение трафика в зависимости от направления (нумерация с 100)
######################################################################
# Трафик через интерфейс lo0
$fwcmd add 100 allow ip from any to any via lo0
# Исходящий трафик
$fwcmd add 200 skipto 30000 ip from any to any out
######################################################################
## Входящий трафик (нумерация с 500)
######################################################################
# Открываем доступ к DHCP-серверу с незарегистрированных адресов, запрещаем
# с них любой другой трафик
$fwcmd add 500 allow udp from %clients.unreg to %srv.dhcp 67
$fwcmd add 600 allow udp from %clients.unreg to 255.255.255.255 67
$fwcmd add 700 deny ip from %clients.unreg to any
##-----------------------------------------------------------------------------
## Антиспуфинг (нумерация с 1000)
##-----------------------------------------------------------------------------
# Интерфейс клиентов
$fwcmd add 1000 skipto 5000 ip from 0.0.0.0 to any recv $iface_clients
$fwcmd add 1100 skipto 5000 ip from %clients to any recv $iface_clients
$fwcmd add 1200 deny log ip from any to any recv $iface_clients
# Интерфейсы VPN
$fwcmd add 1300 skipto 5000 ip from %clients to any recv $iface_vpns
$fwcmd add 1400 skipto 5000 ip from any to any verrevpath recv $iface_vpns
$fwcmd add 1500 deny log ip from any to any recv $iface_vpns
##-----------------------------------------------------------------------------
## Разделение трафика в зависимости от получателя пакета (нумерация с 5000)
##-----------------------------------------------------------------------------
# Трафик, адресованный серверу
$fwcmd add 5000 skipto 10000 ip from any to me
# Броадкасты
$fwcmd add 5100 skipto 20000 ip from any to 255.255.255.255
$fwcmd add 5200 skipto 20000 ip from any to %global.backbone.broadcast
$fwcmd add 5300 skipto 20000 ip from any to %clients.broadcast
# Мультикасты
$fwcmd add 5400 skipto 25000 ip from any to 224.0.0.0/4
##-----------------------------------------------------------------------------
## Трафик, идущий транзитом (нумерация с 6000)
##-----------------------------------------------------------------------------
# Запрещаем трафик на закрытые адреса магистрали
$fwcmd add 6000 deny log ip from any to %global.backbone.private
# Разрешаем любой трафик, идущий c VPN-адресов клиентов, которым открыт доступ
# к услугам сети, и обратно
$fwcmd add 6100 allow ip from %access.allow to any
$fwcmd add 6200 allow ip from any to %access.allow
# Разрешаем трафик, идущий от клиентов на DNS-резолвер и обратно
$fwcmd add 6300 allow ip from any to %global.srv.resolver
$fwcmd add 6400 allow ip from %global.srv.resolver to any
# Разрешаем трафик, идущий от клиентов на веб-сервер сети и обратно
$fwcmd add 6500 allow ip from any to %global.srv.http
$fwcmd add 6600 allow ip from %global.srv.http to any
# Разрешаем эхо-запросы, идущие на локальные адреса клиентов, и эхо-ответы
# c этих адресов
$fwcmd add 6700 allow icmp from any to %clients icmptypes 8
$fwcmd add 6800 allow icmp from %clients to any icmptypes 0
# Запрещаем остальной трафик
$fwcmd add 6900 deny log ip from any to any
##-----------------------------------------------------------------------------
## Трафик, адресованный серверу (нумерация с 10000)
##-----------------------------------------------------------------------------
# Разрешаем установленные TCP-соединения
$fwcmd add 10000 allow tcp from any to any established
# Разрешаем фрагменты IP-пакетов
$fwcmd add 10100 allow ip from any to any frag
# Разрешаем пакеты, удовлетворяющие динамическим правилам
$fwcmd add 10200 check-state
# Разрешаем OSPF-пакеты
$fwcmd add 10300 allow ospf from %global.backbone to any
# Разрешаем GRE-пакеты
$fwcmd add 10400 allow gre from any to any
##-----------------------------------------------------------------------------
## Службы сервера (нумерация с 12000)
##-----------------------------------------------------------------------------
# SSH
$fwcmd add 12000 allow tcp from %srv.ssh.allow to %srv.ssh 22
# DHCP
$fwcmd add 12100 allow udp from %srv.dhcp.allow to %srv.dhcp 67
# PPTP
$fwcmd add 12200 allow tcp from %srv.pptp.allow to %srv.pptp 1723
# SNMP
$fwcmd add 12300 allow udp from %srv.snmp.allow to %srv.snmp 161,1161
##-----------------------------------------------------------------------------
## Завершающие правила для трафика, адресованного серверу (нумерация с 18000)
##-----------------------------------------------------------------------------
# Разрешаем ICMP-пакеты
$fwcmd add 18000 allow icmp from any to any
# Разрешаем работу traceroute
$fwcmd add 18100 unreach port udp from any to any 33434-33584
# Запрещаем соединения на 80 порт (samba)
$fwcmd add 18200 reset tcp from any to any 80
# Запрещаем соединения на 113 порт (ident)
$fwcmd add 18300 reset tcp from any to any 113
# Запрещаем соединения на 1080 порт (socks check)
$fwcmd add 18400 reset tcp from any to any 1080
# Запрещаем остальной трафик
$fwcmd add 18500 deny log ip from any to any
##-----------------------------------------------------------------------------
## Броадкасты (нумерация с 20000)
##-----------------------------------------------------------------------------
# Разрешаем SNMP trap'ы от ИБП
$fwcmd add 20000 allow udp from %global.backbone to any 162
# Разрешаем NTP-пакеты
$fwcmd add 20100 allow udp from %global.backbone to %global.backbone.broadcast 123
# Разрешаем поиск DHCP-сервера
$fwcmd add 20200 allow udp from %srv.dhcp.allow to any 67
# Запрещаем остальной трафик
$fwcmd add 20300 deny log ip from any to any
##-----------------------------------------------------------------------------
## Мультикасты (нумерация с 25000)
##-----------------------------------------------------------------------------
# Разрешаем OSPF-пакеты
$fwcmd add 25000 allow ospf from %global.backbone to 224.0.0.0/24{5,6}
# Разрешаем общие IGMP и DVMRP-пакеты
$fwcmd add 25100 allow igmp from %global.backbone to 224.0.0.0/24{1,2,4}
$fwcmd add 25200 allow igmp from %clients to 224.0.0.0/24{1,2}
# Разрешаем подписку на группы TVoIP
$fwcmd add 25300 allow igmp from %clients to %global.srv.tvoip.groups
# Разрешаем трафик TVoIP
$fwcmd add 25400 allow ip from %global.srv.tvoip to %global.srv.tvoip.groups
# Запрещаем остальной трафик
$fwcmd add 25500 deny log ip from any to any
######################################################################
## Исходящий трафик (нумерация с 30000)
######################################################################
# Динамическое правило для доступа с данного сервера к внешним службам по UDP
$fwcmd add 30000 allow udp from me to any keep-state
######################################################################
Правила на сервере служб:
#!/bin/sh -e
fwcmd="echo"
######################################################################
## Разделение трафика в зависимости от направления (нумерация с 100)
######################################################################
# Трафик через интерфейс lo0
$fwcmd add 100 allow ip from any to any via lo0
# Исходящий трафик
$fwcmd add 200 skipto 30000 ip from any to any out
######################################################################
## Входящий трафик (нумерация с 1000)
######################################################################
##-----------------------------------------------------------------------------
## Разделение трафика в зависимости от получателя пакета (нумерация с 5000)
##-----------------------------------------------------------------------------
# Трафик, адресованный серверу
$fwcmd add 5000 skipto 10000 ip from any to me
# Броадкасты
$fwcmd add 5100 skipto 20000 ip from any to 255.255.255.255
$fwcmd add 5150 skipto 20000 ip from any to %group.backbone_broadcast
# Мультикасты
$fwcmd add 5200 skipto 25000 ip from any to 224.0.0.0/4
##-----------------------------------------------------------------------------
## Трафик, идущий транзитом (нумерация с 6000)
##-----------------------------------------------------------------------------
# Запрещаем весь трафик
$fwcmd add 6000 deny log ip from any to any
##-----------------------------------------------------------------------------
## Трафик, адресованный серверу (нумерация с 10000)
##-----------------------------------------------------------------------------
# Преобразовываем запросы к DNS-резолверу
$fwcmd add 10000 divert 8669 ip from %allow.resolver_internet to %ip.resolver
# Разрешаем установленные TCP-соединения
$fwcmd add 10100 allow tcp from any to any established
# Разрешаем фрагменты IP-пакетов
$fwcmd add 10200 allow ip from any to any frag
# Разрешаем пакеты, удовлетворяющие динамическим правилам
$fwcmd add 10300 check-state
# Разрешаем OSPF-пакеты
$fwcmd add 10400 allow ospf from %group.backbone to any
##-----------------------------------------------------------------------------
## Службы сервера (нумерация с 12000)
##-----------------------------------------------------------------------------
# SSH
$fwcmd add 12000 deny tcp from %deny.ssh to %ip.ssh 22
$fwcmd add 12100 allow tcp from %allow.ssh to %ip.ssh 22
# DNS-резолвер
$fwcmd add 12200 deny { tcp or udp } from %deny.resolver to %ip.resolver 53
$fwcmd add 12300 allow { tcp or udp } from %allow.resolver to %ip.resolver 53
# DNS-сервер
$fwcmd add 12400 deny { tcp or udp } from %deny.dns to %ip.dns 53
$fwcmd add 12500 allow { tcp or udp } from %allow.dns to %ip.dns 53
# DNS-кэш
$fwcmd add 12600 deny { tcp or udp } from %deny.dnscache to %ip.dnscache 53
$fwcmd add 12700 allow { tcp or udp } from %allow.dnscache to %ip.dnscache 53
# NTP-сервер
$fwcmd add 12800 deny udp from %deny.ntp to %ip.ntp 123
$fwcmd add 12900 allow udp from %allow.ntp to %ip.ntp 123
# IRC
$fwcmd add 13000 deny tcp from %deny.irc to %ip.irc 6667-6669
$fwcmd add 13100 allow tcp from %allow.irc to %ip.irc 6667-6669
$fwcmd add 13200 deny icmp from any to %ip.irc icmptypes 8
# HTTP
$fwcmd add 13700 deny tcp from %deny.http to %ip.http 80,443
$fwcmd add 13800 allow tcp from %allow.http to %ip.http 80,443
# SMTP
$fwcmd add 13900 deny tcp from %deny.smtp to %ip.smtp 25
$fwcmd add 14000 allow tcp from %allow.smtp to %ip.smtp 25
$fwcmd add 14100 deny tcp from %group.internal to %ip.smtp 25
$fwcmd add 14200 allow tcp from any to %ip.smtp 25
# POP
$fwcmd add 14300 deny tcp from %deny.pop to %ip.pop 110
$fwcmd add 14400 allow tcp from %allow.pop to %ip.pop 110
# SNMP
$fwcmd add 14500 allow udp from %allow.snmp to %ip.snmp 161,1161
##-----------------------------------------------------------------------------
## Завершающие правила для трафика, адресованного серверу (нумерация с 18000)
##-----------------------------------------------------------------------------
# Разрешаем ICMP-пакеты
$fwcmd add 18000 allow icmp from any to any
# Разрешаем работу traceroute
$fwcmd add 18100 unreach port udp from any to any 33434-33584
# Запрещаем соединения на 113 порт (ident)
$fwcmd add 18200 reset tcp from any to any 113
# Запрещаем соединения на 1080 порт (socks check)
$fwcmd add 18300 reset tcp from any to any 1080
# Запрещаем остальной трафик
$fwcmd add 18400 deny log ip from any to any
##-----------------------------------------------------------------------------
## Броадкасты (нумерация с 20000)
##-----------------------------------------------------------------------------
# Разрешаем SNMP trap'ы от ИБП
$fwcmd add 20000 allow udp from %group.backbone to any 162
# Запрещаем остальной трафик
$fwcmd add 20100 deny log ip from any to any
##-----------------------------------------------------------------------------
## Мультикасты (нумерация с 25000)
##-----------------------------------------------------------------------------
# Разрешаем OSPF-пакеты
$fwcmd add 25000 allow ospf from %group.backbone to 224.0.0.0/24{5,6}
# Запрещаем остальной трафик
$fwcmd add 25100 deny log ip from any to any
######################################################################
## Исходящий трафик (нумерация с 30000)
######################################################################
# Преобразовываем ответы DNS-резолвера
$fwcmd add 30000 divert 8669 ip from %ip.dnscache to %allow.resolver_internet
# Динамическое правило для доступа с данного сервера к внешним службам по UDP
$fwcmd add 30100 allow udp from me to any keep-state
##-----------------------------------------------------------------------------
## Аккаунтинг трафика (нумерация с 40000)
##-----------------------------------------------------------------------------
# Трафик почтового сервера (POP)
$fwcmd add 40000 divert 17000 tcp from %ip.pop to %group.accounting
URL: http://groups.google.com/group/fido7.ru.unix.bsd/msg/22edb3b...
Обсуждается: https://www.opennet.ru/tips/info/1435.shtml