Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> IPFW

IPFW - штатный файрволл FreeBSD

Автор: lissyara.


    В составе FreeBSD есть штатный файрволл - IPFW. К сожалению, раздел хандбука, ему посвящённый, до сих пор не переведён... зато в английской части эта тема неплохо окучена :) Кстати, во многом именно по этому начинающим он тяжело даётся - сам помню, как ковырялся почти две недели, пытаясь настроить его - ничё не получалось... Зато потом был миг озарения, когда я пришёл утром на работу, и, неторопясь, набрал все правила, придумывая их находу из головы. После чего отправил комп в перезагрузку и пошёл курить - абсолютно уверенный что всё работает. И оно работало. Это был момент перехода количества в качество...
   Эта статья является скорее кратким переводом той аглицкой статьи из хандбука, щедро разбавленное собственным видением происходящего :)
   Итак. Для включения файрволла придётся пересобрать ядро со следующими опциями:
options         IPFIREWALL               # собственно файрволл
options         IPFIREWALL_VERBOSE       # логгинг пакетов, если в правиле 
                                         # написано `log`
options         IPFIREWALL_VERBOSE_LIMIT=5 # ограничение логов (повторяющихся) - на 
                                           # случай атак типа флудинга
                                           # (я, правда, 100 ставлю)
options         IPFIREWALL_FORWARD       # перенаправление (форвардинг) пакетов
                                         # например, для прозрачного прокси
options         IPDIVERT                 # если нужен NAT (трансляция адресов)
options         DUMMYNET                 # если понадобится ограничивать скорость 
                                         # инета пользователям (обычно - да :))
options         IPFIREWALL_DEFAULT_TO_ACCEPT  # дефолтовое правило (последнее)
                                           # будет разрешающим (во всех других)
                                           # случаях - запрещающее

Кстати, ядро можно и не пересобирать - достаточно загрузить модуль при старте системы, для этого внесём строку firewall_enable="YES" в файл /etc/rc.conf и после перезагрузки файрволл заработает. Никто, кстати, не мешает сделать это и находу, без перезагрузки (советую подумать, если вы сидите на машине, по ssh прежде чем выполнять - по дефолту будет одно правило - запрещено всё), загрузив соответствующий модуль:
%su
/usr/home/lissyara/>kldload ipfw
/usr/home/lissyara/>ipfw show
65535 0 0 deny ip from any to any
/usr/home/lissyara/>

Управляется загруженный на ходу файрволл также как и обычный, некоторые специфические опции включаемые в ядро при статической сборке есть в sysctl:
/usr/home/lissyara/>sysctl -a | grep ip.fw
net.inet.ip.fw.enable: 1
net.inet.ip.fw.one_pass: 1
net.inet.ip.fw.debug: 1
net.inet.ip.fw.verbose: 1
net.inet.ip.fw.verbose_limit: 1000
net.inet.ip.fw.dyn_buckets: 256
net.inet.ip.fw.curr_dyn_buckets: 256
net.inet.ip.fw.dyn_count: 0
net.inet.ip.fw.dyn_max: 1000
net.inet.ip.fw.static_count: 294
net.inet.ip.fw.dyn_ack_lifetime: 300
net.inet.ip.fw.dyn_syn_lifetime: 20
net.inet.ip.fw.dyn_fin_lifetime: 1
net.inet.ip.fw.dyn_rst_lifetime: 1
net.inet.ip.fw.dyn_udp_lifetime: 10
net.inet.ip.fw.dyn_short_lifetime: 5
net.inet.ip.fw.dyn_grace_time: 10
/usr/home/lissyara/>

Это был вывод с тестовой машины. Кстати ipfw, статически собранный в ядре, также прекрасно рулится через sysctl:
/usr/home/lissyara/>sysctl net.inet.ip.fw.verbose_limit=10
net.inet.ip.fw.verbose_limit: 1000 -> 10
/usr/home/lissyara/>sysctl -a | grep ip.fw.verbose_
net.inet.ip.fw.verbose_limit: 10
/usr/home/lissyara/>

Учтите - эти изменения живут ровно до первой перезагрузки, если хотите чтобы они остались насовсем, то читайте тут. Вообще, глубокий смысл вкомпиляции файрволла в ядро - на мой взгляд, повышение быстродействия, и опции недоступные через sysctl.
   Если собирали ядро без опции IPFIREWALL_DEFAULT_TO_ACCEPT, или грузили его модулем, то изначально правило только одно - запрещающее. В rc.conf есть несколько опций касающихся файрволла:
firewall_enable="YES" - если файрволл грузится модулем
firewall_type="/etc/rc.firewall" - файл с правилами файрволла
firewall_logging="YES" - единственное что делает эта строка - устанавливает значение net.inet.ip.fw.verbose равным 1. Не забудте поставить лимиты, через sysctl.
   Для просмотра установленных правил файрволла есть следующие команды (а если быть точным - ключи, потому как для всего используется одно приложение):
ipfw list - показывает список правил
ipfw show - тоже показывает список правил, но вместе с числом пакетов и байт, что попали под эти правила. Очень удобно при отдладке - смотрим на чём зарубаются пакеты.
ipfw zero - обнуление всех счётчиков. Если вести в виде ipfw zero №_правила то будет обнулён только счётчик правила с этим номером.
   Вот пример простого файрволла для обычнейшей ситуации - сервер организации, одним интерфейсом смотрит в локалку, другим торчит наружу, на нём крутится почта, и работает www сервер:
#!/bin/sh

# для начала вводим переменные - для нашего же удобства, чтобы не 
# вводить по сотне раз одно и то же, а потом искать почему не работает,
# и в итоге выяснять, что ошибся IP адресом в одном из правил

FwCMD="/sbin/ipfw" # собственно где лежит бинарник ipfw
LanOut="xl0"            # внешний интерфейс
LanIn="sis0"            # внутренний интерфейс
IpOut="222.222.222.222" # внешний IP адрес машины
IpIn="192.168.20.254"   # внутренний IP машины
NetMask="24"            # маска сети (если она разная для внешней 
                        # и внутренней сети - придётся вводить ещё 
                        # одну переменную, но самое забавное, что 
                        # можно и забить - оставить 24 - всё будет 
                        # работать, по крайней мере я пробовал - 
                        # работаало на 4-х машинах, в разных сетях, 
                        # с разными масками - настоящими разными! но - 
                        # это неправильно.)
NetIn="192.168.20.0"    # Внутренняя сеть

# Сбрасываем все правила:
${FwCMD} -f flush

# Проверяем - соответствует ли пакет динамическим правилам:
${FwCMD} add check-state

# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничё не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
${FwCMD} add allow ip from any to any via lo0
# рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0 (вот честно - ни
# одного пакета по этим правилам не зарубилось за всё время... Может в этом
# моё счастье? :))
${FwCMD} add deny ip from any to 127.0.0.0/8
${FwCMD} add deny ip from 127.0.0.0/8 to any


# Вводим запреты:
# режем частные сети на внешнем интерфейсе - по легенде он у нас 
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut}
${FwCMD} add deny ip from any to 172.16.0.0/12 in via ${LanOut}
${FwCMD} add deny ip from any to 192.168.0.0/16 in via ${LanOut}
${FwCMD} add deny ip from any to 0.0.0.0/8 in via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from any to 169.254.0.0/16 in via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut}
# рубим фрагментированные icmp
${FwCMD} add deny icmp from any to any frag
# рубим широковещательные icmp на внешнем интерфейсе
${FwCMD} add deny log icmp from any to 255.255.255.255 in via ${LanOut}
${FwCMD} add deny log icmp from any to 255.255.255.255 out via ${LanOut}

# а тут собственно файрволл и начался:

# отправляем всех на frox
${FwCMD} add fwd ${IpIn},2121 tcp from ${NetIn}/${NetMask} to any 21 via ${LanOut}
# отправляем всех на squid (в данном случае - прокси прозрачный)
${FwCMD} add fwd 127.0.0.1,3128 tcp from ${NetIn}/${NetMask} to any 80 via ${LanOut}


# пропускаем траффик через трансляцию сетевых адресов (NAT)
${FwCMD} add divert natd ip from ${NetIn}/${NetMask} to any out via ${LanOut}
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}

# рубим траффик к частным сетям через внешний интерфейс
# заметтьте - эти правила отличаются от тех что были выше!
${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut}
${FwCMD} add deny ip from 172.16.0.0/12 to any out via ${LanOut}
${FwCMD} add deny ip from 192.168.0.0/16 to any out via ${LanOut}
${FwCMD} add deny ip from 0.0.0.0/8 to any out via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from 169.254.0.0/16 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 224.0.0.0/4 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 240.0.0.0/4 to any out via ${LanOut}


# разрешаем все установленные соединения (если они установились - 
# значит по каким-то правилам они проходили.)
${FwCMD} add allow tcp from any to any established
# разрешаем весь исходящий траффик (серверу-то в инет можно? :))
${FwCMD} add allow ip from ${IpOut} to any out xmit ${LanOut}

# разрешаем DNS снаружи (нам же надо узнавать IP по именам машин?)
${FwCMD} add allow udp from any 53 to any via ${LanOut}
# разрешаем DNS входящий снаружи - если на этой машине работает named
# и держит какую-то зону. В остальных случаях - не нужно
${FwCMD} add allow udp from any to any 53 via ${LanOut}
# разрешаем UDP (для синхронизации времени - 123 порт)
${FwCMD} add allow udp from any to any 123 via ${LanOut}
# разрешаем ftp снаружи (оба правила - для пасивного режима)
# для узнавания портранджа по которому будет работать, лезем в 
#/usr/home/lissyara/>sysctl net.inet.ip.portrange.first
# net.inet.ip.portrange.first: 49152
# /usr/home/lissyara/>sysctl net.inet.ip.portrange.last
# net.inet.ip.portrange.last: 65535
${FwCMD} add allow tcp from any to ${IpOut} 21 via ${LanOut}
#Можно изгалиться примерно так, если есть желание, но я предпочитаю руками
#${FwCMD} add allow tcp from any to ${IpOut} \
#`sysctl net.inet.ip.portrange.first | awk '{print $2}'`-\
#`sysctl net.inet.ip.portrange.last | awk '{print $2}'` via ${LanOut}
${FwCMD} add allow tcp from any to ${IpOut} 49152-65535 via ${LanOut}
# разрешаем некоторые типы ICMP траффика - эхо-запрос, 
# эхо-ответ и время жизни пакета истекло
${FwCMD} add allow icmp from any to any icmptypes 0,8,11
# открываем снаружи 80 порт - если у нас есть WWW сервер на машине
${FwCMD} add allow tcp from any to ${IpOut} 80 via ${LanOut}
# открываем снаружи 25 порт (SMTP) если на машине крутится почта
#${FwCMD} add allow tcp from any to ${IpOut} 25 via ${LanOut}
# открываем снаружи 22 порт - если надо будет ходить на машину по ssh
${FwCMD} add allow tcp from any to ${IpOut} 22 via ${LanOut}
# открываем снаружи 143 порт(если надо смотреть почту снаружи по IMAP)
${FwCMD} add allow tcp from any to ${IpOut} 143 via ${LanOut}
# открываем снаружи 110 порт(если надо смотреть почту снаружи по POP)
${FwCMD} add allow tcp from any to ${IpOut} 110 via ${LanOut}
# по поводу следующих трёх правил, для tcp, udp и icmp - их можно
# заменить одним правилом:
#${FwCMD} add allow ip from any to any via ${LanIn}
# но для удобства наладки и контроля происходящего я предпочитаю три отдельных
# правила, хотя могут быть грабли - например протокол gre не пройдёт - 
# придётся стругать отдельное правило для него, типа 
#${FwCMD} add allow gre from any to any via ${LanIn}
# итак:
# разрешаем весь tcp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow tcp from any to any via ${LanIn}
# разрешаем весь udp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow udp from any to any via ${LanIn}
# разрешаем весь icmp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow icmp from any to any via ${LanIn}
# запрещаем всё и всем. Если тип файрволла не open то это правило добавится
# автоматически, но всё-же ну его. Лучше сам. Надёжней.
${FwCMD} add deny ip from any to any

Такой вот несложный, и логически понятный файрволл. Надо заметить, что для внутренней локалки в этом фаере всё разрешено. Все могут ходить в инет и пользоваться всеми сетевыми службами. Если такой необходимости нет, то можно сделать чуть иначе:
#!/bin/sh

# для начала вводим переменные - для нашего же удобства, чтобы не 
# вводить по сотне раз одно и то же, а потом искать почему не работает,
# и в итоге выяснять, что ошибся IP адресом в одном из правил

FwCMD="/sbin/ipfw"            # бинарник IPFW

LanOut="xl0"                  # Внешняя сетевуха
NetOut="222.222.222.220/28"   # внешняя сеть
IpOut="222.222.222.222"       # Внешний IP

LanIn="rl0"                   # внутренняя сетевуха
NetIn="192.168.1.0/24"        # Внутренняя сеть
ip_lan="192.168.1"            # Шаблон внутреннего адреса 
                              # нужен для ввода разрешений на инет

# сбрасываем все правила
${FwCMD} -f flush
# сбрасываем все pipe
${FwCMD} -f pipe flush
# сбрасываем очереди
${FwCMD} -f queue flush

# Не знаю, пригодится ли кому это - по ночам охрана повадилась шариться в инете
# и качать музончик, порнушку смотреть... 3 гига трафика за ночь... Поэтому ночью
# траффик ограничиваем (скорость) - причём жестоко режем :)
# для этого в конфиге ядра должна быть строка 
# options         DUMMYNET
# соответственно в crontab надо добавить запись типа sh /etc/rc.firewall
# с запуском в 22.01 и 8.01 :)))
# Также не забудте поставить в sysctl переменную net.inet.ip.fw.one_pass в 0,
# иначе все пакеты будут выпадать из файрволла после трубы - а это дыра.
chour=`date '+%H'`
if [ ${chour} -lt 8 ]; then
    ${FwCMD} add pipe 1 ip from not ${NetIn} to ${NetIn}
    ${FwCMD} pipe 1 config bw 33600 bit/s
fi
if [ ${chour} -ge 22 ]; then
    ${FwCMD} add pipe 1 ip from not ${NetIn} to ${NetIn}
    ${FwCMD} pipe 1 config bw 33600 bit/s
fi

# Разрешаем весь траффик по внутреннему интерфейсу (петле)
# Вообще я во многих местах читал что без него может ничё не заработать вообще
# и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :)
# так что без него и правда - никуда.
${FwCMD} add allow ip from any to any via lo0

# Вводим запреты:

# рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0 (вот честно - ни
# одного пакета по этим правилам не зарубилось за всё время... Может в этом
# моё счастье? :))
${FwCMD} add deny ip from any to 127.0.0.0/8
${FwCMD} add deny ip from 127.0.0.0/8 to any

# рубим пакеты `типа от внутренней сети, но на внешнем интерфейсе`
${FwCMD} add deny ip from ${NetIn} to any in via ${LanOut}
# рубим пакеты `типа от внешней сети, но на внутреннем интерфейсе`
${FwCMD} add deny ip from ${NetOut} to any in via ${LanIn}

# режем частные сети на внешнем интерфейсе - по легенде он у нас 
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut}
${FwCMD} add deny ip from any to 172.16.0.0/12 in via ${LanOut}
${FwCMD} add deny ip from any to 192.168.0.0/16 in via ${LanOut}
${FwCMD} add deny ip from any to 0.0.0.0/8 in via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from any to 169.254.0.0/16 in via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from any to 224.0.0.0/4 in via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut}
# рубим фрагментированные icmp
${FwCMD} add deny icmp from any to any frag
# рубим широковещательные icmp на внешнем интерфейсе
${FwCMD} add deny log icmp from any to 255.255.255.255 in via ${LanOut}
${FwCMD} add deny log icmp from any to 255.255.255.255 out via ${LanOut}

# Отправляем всех на squid
${FwCMD} add fwd 127.0.0.1,3128 tcp from ${NetIn} to any 80 via ${LanOut}

# Делаем NAT (трансляцию сетевых адресов) всему, что не ушло на squid
${FwCMD} add divert natd ip from ${NetIn} to any out via ${LanOut}
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}

# рубим траффик к частным сетям через внешний интерфейс
# заметтьте - эти правила отличаются от тех что были выше!
${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut}
${FwCMD} add deny ip from 172.16.0.0/12 to any out via ${LanOut}
${FwCMD} add deny ip from 192.168.0.0/16 to any out via ${LanOut}
${FwCMD} add deny ip from 0.0.0.0/8 to any out via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add deny ip from 169.254.0.0/16 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 224.0.0.0/4 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from 240.0.0.0/4 to any out via ${LanOut}

# разрешаем некоторые типы ICMP траффика - эхо-запрос, 
# эхо-ответ и время жизни пакета истекло
${FwCMD} add allow icmp from any to any icmptypes 0,8,11

# Разрешаем траффик внутренней сети на внутреннем интерфейсе (входящий)
${FwCMD} add allow ip from any to ${NetIn} in via ${LanIn}
# Разрешаем траффик внутренней сети на внутреннем интерфейсе (исходящий)
${FwCMD} add allow ip from ${NetIn} to any out via ${LanIn}

# разрешаем tcp-пакеты по уже установленным соединениям
${FwCMD} add allow tcp from any to any established

# DNS - 4 правила. (если на машине есть DNS сервер - иначе надо всего два)
${FwCMD} add allow udp from any to ${IpOut} 53 in via ${LanOut}
${FwCMD} add allow udp from ${IpOut} 53 to any out via ${LanOut}
${FwCMD} add allow udp from any 53 to ${IpOut} in via ${LanOut}
${FwCMD} add allow udp from ${IpOut} to any 53 out via ${LanOut}
# разрешаем UDP (для синхронизации времени - 123 порт)
${FwCMD} add allow udp from any to any 123 via ${LanOut}

# разрешаем снаружи соединяться с 53 портом (TCP DNS)
${FwCMD} add allow tcp from any to ${IpOut} 53 in via ${LanOut} setup
# открываем снаружи 80 порт - если у нас есть WWW сервер на машине
${FwCMD} add allow tcp from any to ${IpOut} 80 in via ${LanOut} setup
# открываем снаружи 20,21 порт - для активного FTP
${FwCMD} add allow tcp from any to ${IpOut} 20,21 in via ${LanOut} setup
# разрешаем входящую почту
${FwCMD} add allow tcp from any to ${IpOut} 25 in via ${LanOut} setup
# разрешаем SSH
${FwCMD} add allow tcp from any to ${IpOut} 22 in via ${LanOut} setup
# открываем снаружи 20,21 порт - для активного FTP
${FwCMD} add allow tcp from any to ${IpOut} 20,21 in via ${LanOut} setup
# пассивный FTP
# для узнавания портранджа по которому будет работать, лезем в 
# /usr/home/lissyara/>sysctl net.inet.ip.portrange.first
# net.inet.ip.portrange.first: 49152
# /usr/home/lissyara/>sysctl net.inet.ip.portrange.last
# net.inet.ip.portrange.last: 65535
# Можно изгалиться примерно так, если есть желание, но я предпочитаю руками
#${FwCMD} add allow tcp from any to ${IpOut} \
#`sysctl net.inet.ip.portrange.first | awk '{print $2}'`-\
#`sysctl net.inet.ip.portrange.last | awk '{print $2}'` via ${LanOut}
${FwCMD} add allow tcp from any to ${IpOut} 49152-65535 via ${LanOut}


# COUNTER-STRIKE (без комментариев :))
${FwCMD} add allow udp from any 27015-27025 to ${NetIn} in via ${LanOut}
${FwCMD} add allow udp from any 27015-27025 to ${NetIn} out via ${LanIn}
${FwCMD} add allow udp from ${NetIn} to any 27015-27025 in via ${LanIn}
${FwCMD} add allow udp from ${IpOut} to any 27015-27025 out via ${LanOut}

# Блокируем все остальные попытки соединения с занесением в логи
${FwCMD} add deny log tcp from any to ${IpOut} in via ${LanOut} setup

${FwCMD} add allow tcp from ${IpOut} to any out via ${LanOut} setup
${FwCMD} add allow tcp from any to ${IpOut} in via ${LanIn} setup

########### BEGIN USERS   ###############################

# Разрешаем всем аську (ICQ)
${FwCMD} add allow tcp from ${NetIn} to any 5190 in via ${LanIn} setup

# Пользователи которым разрешён инет
${FwCMD} add allow tcp from ${ip_lan}.151 to not ${NetIn} in via ${LanIn} setup
${FwCMD} add allow tcp from ${ip_lan}.153 to not ${NetIn} in via ${LanIn} setup
${FwCMD} add allow tcp from ${ip_lan}.154 to not ${NetIn} in via ${LanIn} setup

############# END USERS #################################

# запрещаем всё и всем. Если тип файрволла не open то это правило добавится
# автоматически, но всё-же ну его. Лучше сам. Надёжней.
${FwCMD} add deny ip from any to any

По файрволлам всё. Да, забыл - это всё описано для статически скомпиленных в ядро файрволлов, если грузите модулем - могут быть некоторые отличия (Хотя, с какого перепугу?). Также, необходимо заметить, что сам файл файрволла, по сути является shell-скриптом,  - со всеми вытекающими плюсами - типа регулировка траффика день/ночь, в последнем примере...
   Осталось объяснить - что такое NAT и как его поднять. NAT - это Network Address Translation - подделка сетевых адресов, если по нашему. Есть т.н. частные сети - диапазоны IP-адресов которые запрещено применять в интернете, и они применяются организациями (ну, и, частными лицами) для адресации внутренних сетей организации. Но - несмотря на то, что сеть внутренняя - сотрудники хотят шариться по инету, смотреть порнушку и т.д. :) К тому же, `белых` (не частных) IP адресов не так уж и много - всем не выдашь, одних китайцев полтора миллиарда, а вот IP-шников всего 256*4=4294967296 (4 миллиарда, с копейками, в идеале. минус частные сети, минус всякие америкосовские институты, да вояки заграбаставшие себе по нескольку сетей класса A), поэтому приходится применять частные адреса. Для того чтобы все пользователи серых адресов могли ходить в инет и существует NAT - он подделывает адрес отправителя, как будто пакет шёл от машины, на которой крутится NAT, а не от машины в частной сети. Ответ тоже приходит на эту машину, и всё тот же NAT разбирает кому он предназначен, снова подделывает адрес, будто он шёл не ему, а машине с частным адресом.
   Итак. Для выполнения вышеописанных `фокусов` с IP адресами в FreeBSD существует natd - Network Address Translation daemon - демон. Для его запуска надо пересобрать ядро со следующими опциями:
options         IPDIVERT

После чего добавляем следующие строки в /etc/rc.conf:
natd_enable="YES" # собственно запуск natd
natd_interface="fxp0"   # интерфейс на котором он будет работать (тот, 
                        # который смотрит в инет)
natd_flags="-m -u"      # флаги :
                        # -u - транслировать только адреса частных сетей
                        # т.е. по RFC 1918:
                        # 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16
                        # -m - попробовать оставить тот же номер порта что и был,
                        # с этим флагом протоколы, типа RPC лучше пашут.

Вот теперь всё. :)
P.S. Для просмотра pipe, которые уже есть в системе, пользуйтесь командой
ipfw pipe show



размещено: 2006-01-18,
последнее обновление: 2006-05-22,
автор: lissyara


MONSTR-SHEFF, 2006-01-25 в 15:52:25

У меня ядро как есть, за пускаю фаервол через rc.conf как написано,
firewall_enable="YES" - если файрволл грузится модулем
firewall_script="/etc/rc.firewall" - файл с правилами
firewall_logging="YES"
но сеть как была закрыта так и есть закрыта правили взял из первого примера. Где? и Что? не так не пойму по команде sh /etc/rc.firewall он запускается (вобщем я ни фига не понял от 4ей попы яйца )  НУЖНА СРОЧНО ПОМОЩЬ!!!

lissyara, 2006-01-25 в 16:19:03

Создай тему в форуме - не надо тут спамить :)
Кнопку отправить надо жать один раз, а не долбить по три :)
Насчёт вопроса:
firewall_type="/etc/rc.firewall"
а не
firewall_script="/etc/rc.firewall"
Это не моя ошибка, а хандбука... Причём навыерно даже не ошибка - надо сравнить как оно в разных версиях FreeBSD - может поменяли...

DeadLoco, 2006-02-16 в 12:08:10

В скрипте настоятельно рекомендую заменить вот эту строку:

FwCMD="/sbin/ipfw"

На вот эту:

FwCMD="/sbin/ipfw -q  "

Ключ "-q" подавляет вербозный вывод при отработке команды ipfw, что нехорошо при запуске скрипта с терминала, если первой командой скрипта стоит флаш, а файрволл по умолчанию блокирующий.

Вообще, общеупотребительно добрый совет: прописывая в переменную имя программы, ВСЕГДА добавляйте пару пробелов в конце. Например:

FwCMD="/sbin/ipfw   "

Этим вы гарантируетесь, что все последующие переменные будут восприняты, как аругменты, а не получится, что-то вроде ipfqadd.

dsa, 2006-02-17 в 0:08:12

# открываем снаружи 25 порт (SNMP) если на машине крутится почта
опечаточка вышла 25 - SMTP порт :)

lissyara, 2006-02-17 в 9:02:09

пьяная была, не помню :)))

На самом деле, о чём думаешь - о том и пишешь. А за ошибку - спасибо! Щас поправлю.

StepaniDOS, 2006-03-31 в 10:42:40

работы NAT обязательно присутствие строки gateway_enable="YES" в rc.conf
по крайней мере для 6-ки

nikola, 2006-04-20 в 18:36:14

firewall_type="/etc/rc.firewall" в 5.3 неработает выдаёт ошибку о неправилном аргументе FwCMD="/sbin/ipfw". Ей нужен firewall_script="/etc/rc.firewall"

Dmitry, 2006-06-06 в 7:43:21

День добрый!
установил FreeBSD_6, на фре имеется 2 интерфейса - внутренняя и внешняя сеть; пересобрал ядро. В ядре включил IPFIREWALL_DEFAULT_TO_ACCEPT. Но фря ни как не хочет выпускать во внешнюю сеть. :(
Что только не пробовал - и ipnat и natd ни в какую
подскажите пожалуйста, что делаю не так? и как можно исправить такую беду???

Marshall, 2006-07-02 в 18:32:29

А зачем в примере "простого файрволла для обычнейшей ситуации" еще вот эта строка:
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}
?
Просто я как-то без нее всю жизнь обходился

P.S.
ИМХО вообще-то проще пользовать IPNAT

Sergey, 2006-07-12 в 22:55:10

Вот эти три строки:
# разрешаем весь tcp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow tcp from any to any via ${LanIn}
# разрешаем весь udp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow udp from any to any via ${LanIn}
# разрешаем весь icmp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add allow icmp from any to any via ${LanIn}

видимо можно заменить на одну:
${FwCMD} add allow all from any to any via ${LanIn}

Статья интересная, спасибо большое. Правда я настраивал по другой, http://www.bsdportal.ru/kb.php?mode=article&k=76.

Да еще, по личному опыту. На машину хожу по ssh и поначалу открыл стандартный 22 порт. В логах была куча попыток авторизации. неудачных естественно =) Чтобы юные дарования, освоившие nmap шли лесом повесил ssh на нестандартный порт. Попыток авторизации больше нет =)

maxim, 2006-09-12 в 16:29:06

Грамотная статья, но но не нашел как сделать так чтобы на одной машине крутилось два NAT-а (бывает же у людей несколько сетевых карт на машине). Я это решил так
в /etc новый файл rc.local
natd -p 8668 -n xl0
natd -p 8778 -n xl1
а в firewall вместо natd написал 8668 и 8778

ita, 2006-09-28 в 10:15:25

${FwCMD} add allow tcp from ${ip_lan}.100 to not ${NetIn} in via ${LanIn} setup
не хочет у меня работать такое правило.
работает
${FwCMD} add allow tcp from ${ip_lan}.100 to any via ${LanIn} setup

reLax, 2006-12-09 в 9:10:18

Не работало правило ${FwCMD} add fwd 127.0.0.1,3128 tcp from ${NetIn} to any 80 via ${LanOut} . Заработало только в таком виде - ${FwCMD} add fwd ${IpIn},3128 tcp from ${NetIn} to any 80 via ${LanIn}

Олег, 2007-01-19 в 5:37:56

Искренне благодарен !!!!
Таких как ты не много!

sergio, 2007-01-25 в 19:08:20

Для FreeBSD 6.0:
В /etc/rc.conf должно быть:
firewall_script="/etc/rc.firewall"

Ванёк, 2007-02-02 в 12:19:39

${FwCMD} add divert natd ip from ${NetIn}/${NetMask} to any out via ${LanOut}
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}
Вторая строчка безсмысленна, я када то то наступил уже на эти грабли =) Это хорошо работает только если у тебя ести 1 белый адрес на сетку, а если тебе нужно вывеси в инет сервак, который лежит в локалке (тупой начальник не захотел дать 2 метра кабеля и свитч =) урод... ) Например:
IpOut="222.222.222"
${FwCMD} add divert 8868 ip from ${NetIn}.111 to any out via ${LanOut}
${FwCMD} add divert 8868 ip from any to ${IpOut}.1 in via ${LanOut}
${FwCMD} add divert 8869 ip from ${NetIn}.222 to any out via ${LanOut}
${FwCMD} add divert 8869 ip from any to ${IpOut}.2 in via ${LanOut}
Ничего не работает =) Всмысле юзеры с нета не видят сервак из твоей локалки... В большинстве мануалов приведен именно такой пример (почему не знаю), в строчках
${FwCMD} add divert 8868 ip from any to ${IpOut}.1 in via ${LanOut} и ${FwCMD} add divert 8869 ip from any to ${IpOut}.2 in via ${LanOut} нужно ставить in via ${LanIn} вместо ${LanOut}. Это логически понятно, но новички могут запутатся... Надеюсь кому то поможет =)

Ванёк, 2007-02-02 в 13:23:42

Совсем забыл... Демон nat'a запускается с ключём redirect_address {белый ip} {локальный ip} ну и port соответственно 8868 и 8869

Any, 2007-02-09 в 9:19:06

${fwcmd} add divert 8668 ip from any to any via bfe0

Mikle, 2007-02-12 в 10:49:01

firewall_script="/etc/rc.firewall" #название скрипта
firewall_type="SIMPLE" #название группы правил в скрипте,их
                      #может быть несколько

Меня когда то учили, что в целях оптимизации по правилу нужно пропускать пакет setup, типа:
${FwCMD} add allow tcp from ${IPany} 1024-65535 to ${IPout} 22 in via ${LanOut} setup
остальные пакеты пойдут по правилу established. Соответственно правило established должно находится выше всех разрешающих правил. Это для нагруженных серверов, ес-но.
Из минусов - статистика по правилам будет некорректна.

KaMa-CyTpA, 2007-03-02 в 19:01:30

Сорри, только что проверил - многие серверы КС с порта 27010 начинаются.
Ну это так. Просто.

OMG!, 2007-04-01 в 5:45:33

Цитата (http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipfw.html):
Enable the firewall:
firewall_enable="YES"

Эта строка должна быть обязательна, а не "если файрволл грузится модулем", как у вас в статье. Благодарю, из-за этого сегодня сервер (естественно, просто тестовый, на живом я бы тысячу раз перед пересбокой ядра подумал =)) ушёл в даун. Тем не менее, спасибо за ваш труд. Жаль, что такие неточности исправляются только 21 комментарием =\

OMG!, 2007-04-01 в 5:47:09

*** "обязательна" следует читать как "обязательно" ^^

hz, 2007-05-28 в 11:37:51

# рубаем мультикастовые рассылки
${FwCMD} add deny ip from any to 224.0.0.0/4 in via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut}

два раза подряд чтоб уж наверняка =)
видимо в первом или во втором правиле имелось в виду LanIn

lissyara, 2007-05-28 в 15:25:22

Советую обратить внимание на то, что между ними, и перечитать man ipfw - это взято именно оттуда, насколько я помню.

Reshek, 2007-06-14 в 6:03:52

Почему-то если эта строка всё портит. ТЕ firewall , начинает блокировать всё что поступает с внешнего интерфейса.
${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut}
А СТАТЬЯ СУПЕР!

rootd, 2007-06-14 в 15:23:43

${FwCMD} add allow tcp from ${IpOut} to any out via ${LanOut} setup

А разве вот это правило не позволит пользователям юзать инет и асю и вообще любые tcp подключения ?

rootd, 2007-06-26 в 16:38:54

 "Кстати, ядро можно и не пересобирать - достаточно загрузить модуль при старте системы, для этого внесём строку firewall_enable="YES" в файл /etc/rc.conf и после перезагрузки файрволл заработает."

Потратил час пока не понял что FORWARD работает только с пересборкой ядра...

Ckopnuo, 2007-07-18 в 17:48:38

Так все правила пишутся в /etc/rc.firewall? Или куда? Просто после пересборки ядра файлик этот уже есть и он не пустой...Получается надо оттуда все удалить и написать свои правила?
Спасибо

Ckopnuo, 2007-07-19 в 11:41:32

Сорри, все, понял уже:)

begemoto, 2007-07-24 в 21:09:22

если есть check-state должен быть keep-state или limit, а их то я в этом конфиге и не вижу.  
например:
${FwCMD} add allow tcp from ${ip_lan}.151 to not ${NetIn} in via ${LanIn} setup

а какое правило разрешает обратные пакеты? Или я не догоняю?

lissyara, 2007-07-24 в 21:43:36

# разрешаем tcp-пакеты по уже установленным соединениям
${FwCMD} add allow tcp from any to any established

*DEAD*Zmey, 2007-07-25 в 14:20:00

lissyara, спасибо огромное за все те материалы, которые у Вас здесь выложены! На мой взгляд - Мегасайт (по классификации Гоблина :D)
Многие из статей попробовал, и очень многое выручило. :)


В строке "# Разрешаем весь траффик по внутреннему интерфейсу (петле)"
  ${FwCMD} add allow ip from any to any via lo0
разрешаем всё через lo0, или, что тоже самое
  ${FwCMD} add allow all from any to any via lo0
далее
  # Вводим запреты:
  # рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0 (вот честно - ни
  # одного пакета по этим правилам не зарубилось за всё время... Может в этом
  # моё счастье? :))
  ${FwCMD} add deny ip from any to 127.0.0.0/8
  ${FwCMD} add deny ip from 127.0.0.0/8 to any

Мы уже разрешили ВЕСЬ трафик, в первом правиле, так что "Запреты" наверное можно убрать? Ну и соответственно потому и "не рубится". Или я не прав?

lissyara, 2007-07-25 в 14:29:03

Прав. Надо правила местами поменять :)

begemoto, 2007-07-25 в 21:16:22

так все таки зачем check-state?

и еще: почему не обьеденить правила:
${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut}
и
${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut}

в одно:
${FwCMD} add deny ip from 10.0.0.0/8 to any via ${LanOut}


lissyara, 2007-07-25 в 22:06:18

когда будешь ковырять - почему что-то не работает - удобней когда так.
=============
и прочти наконец текст в окошке для ввода комментов, до того как стираешь его.

skoval, 2007-08-13 в 11:07:57

По-моему в явном виде тут никто так и не написал про firewall_type и firewall_script.
В хендбуке написано, что в firewall_type  помимо параметров для /etc/rc.firewall (open, simple etc.) можно указать абсолютный путь к файлу с правилами для фаервола, т.е.
add block in all
add block out all
а в firewall_script указывается абсолютный путь к командам для /bin/sh, т.е.
ipfw add block in all
ipfw add block out all.
Это два основных способа написания своих правил для фаервола.

Nadz Goldman, 2007-08-20 в 12:22:05

Фря 6.0
IPFW+NAT
Ядро собрано с опциями:
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=5
options IPFIREWALL_FORWARD
options IPDIVERT
options DUMMYNET
options IPFIREWALL_DEFAULT_TO_ACCEPT

Но все правила, в которых указана опция SETUP попросту неработают.

urgor, 2007-08-21 в 14:06:22

> Мы уже разрешили ВЕСЬ трафик, в первом правиле,
Мы разрешили на интерфейсе lo, а для пакетов что пришли на него с fxp0 отработают запреты....
2 liss: ничего менять не надо, у тя все прально...

Kolesya, 2007-09-07 в 17:19:40

>hz, 2007-05-28 в 11:37:51
>
># рубаем мультикастовые рассылки
>${FwCMD} add deny ip from any to 224.0.0.0/4 in via >${LanOut}
># рубаем мультикастовые рассылки
>${FwCMD} add deny ip from any to 240.0.0.0/4 in via >${LanOut}

>два раза подряд чтоб уж наверняка =)
>видимо в первом или во втором правиле имелось в виду >LanIn

224 и 240 не совпадают :) так что Лис правильно написал

kolesya, 2007-09-07 в 19:44:10

[b]Статья Лиса, последний пример(типа не самый простой файрвол)
># Разрешаем траффик внутренней сети на внутреннем >интерфейсе (входящий)
>${FwCMD} add allow ip from any to ${NetIn} in via ${LanIn}
># Разрешаем траффик внутренней сети на внутреннем интерфейсе (исходящий)
>${FwCMD} add allow ip from ${NetIn} to any out via ${LanIn}

Если у когото успользуется чтот типа tun-интерфейс(VPN и т.д.), правила приведенные выше,при условии что сети доверенные,  нужно поменять на:

VPNNet="10.1.2.0/24"
VPNIf="tun0"
...
${FwCMD} add allow ip from any to ${NetIn},${VPNNet} in via ${LanIn}
${FwCMD} add allow ip from ${NetIn},${VPNNet} to any out via ${LanIn}

${FwCMD} add allow ip from any to ${NetIn},${VPNNet} in via ${VPNIf}
${FwCMD} add allow ip from ${NetIn},${VPNNet} to any out via ${VPNIf}

barsykoff, 2007-09-12 в 14:15:57

А разве не оптимальней было сделать так:
1. Разрешить трафик по локальной сети и петле
2. NAT, fwd
3. Разрешить некоторый трафик снаружи
4. Запретить все.
Ведь тогда не надо писать так много запретов...

Kolesya, 2007-10-02 в 20:39:08

> barsykoff, 2007-09-12 в 14:15:57
Если можно подробнее

torki, 2007-10-18 в 1:15:16

lissyar-e, опять земной поклон! Статья супер! Спасибы множественные! Хвати пить пиво, обеспеч себе старость(шутка). Пиши Книгу, материал уже набрался!

artem, 2007-11-16 в 18:19:28

Из мелочей: обновление подправленного файла rc.firewall-
#root#>sh /etc/rc.firewall
я пока не догадался reboot писал :)

lisergey, 2007-11-16 в 18:59:59

по идее, еще правильне обновлять правила фаервола так
# /etc/rc.d/ipfw restart &

этот вариант проверит и переменные из /etc/rc.conf
и при необходимости запустит NAT, и правильно выберет скрипт для фаервола в зависимости от того, как он прописан в /etc/rc.conf

в простейшем же случае это будет эквивалентно тому же самому
# sh /etc/rc.firewall

f0s, 2007-12-06 в 17:10:30

курил сегодня хендбук... там написано следующее:

# Deny all inbound traffic from non-routable reserved address spaces
$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif
$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif
$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif
$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif
$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif          
$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif
$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif
$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif
$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif


а у теб в статье тоже самое от них к any, но не 'in', a 'out' почему-то

artem, 2007-12-21 в 14:32:28

советую еще почитать здесь особенно про DUMMYNET

smilealex, 2007-12-21 в 14:44:05

2artem... вот я туп.. и? уважаемый.. неужели труда составляет выразить своё пренебрежение выкладыванием ссылки вместо обоснованного комментария с доводами и примерами?
Честь имею!
ЗЫ пусть к стыду - но по ссылке даже не пройдусь, ибо довольствуюсь малым.

lissyara, 2007-12-21 в 15:12:23

Он ТИЦ и ПР сайта своего повышает...
Чтоб ссылки дороже продавались =)
Тока вот неучёл, что специально для таких я ссылки сделал через редирект.
===========
оффтоп - по меркам интернета и поисковиков, эта конкретная страница - очень жирная. По запросу IPFW - она в первой пятёрке всех крупных поисковиков. Периодически на первое место лезет, но ниже пятёрки - не падает.
Вот поэтому, такой ерундой и занимаются.
=============
"Остапа понесло" :)

artem, 2008-01-10 в 16:04:22

у кого о чем голова болит, а я DUMMYNET прикручивал а так как тут он рассмотрен вскольз то оставил ссылку дабы помочь остальным и себе если забуду :)

Reshek, 2008-01-10 в 16:38:33

Ну и где линк?

DarkHost, 2008-01-15 в 15:44:30

Jail на машине c ipfw не хочет пускать по SSH, хотя стот allow ip from 195.14.56.XXX to me 22. На основную машину войти могу, в Jail-нет. Порт открытый вижу, а при генерации DSA ключа - замирает и отваливается по timeout(логи).

KaMa-CyTpA, 2008-02-29 в 15:39:54

Народ!
В 7 IPFW переделан сильно насколько я понял.
Правила по поводу НАТ-а не работают - ну это на сайте написано что тни просто НАТ в IPFW включили.
А вот форвардинг у меня тоже типа обломался почему-то...
Буит описалово аль как?

Reshek, 2008-02-29 в 15:51:01

Да. Интересно. Иду ковырять 7-ку.

dimts, 2008-03-02 в 13:05:10

В коментах тут увидел про перезагрузку правил.
Правильно перезапускать их этим скриптом:
/usr/share/examples/ipfw/change_rules.sh
только не забудьте дать права на выполнение

ffzema, 2008-04-10 в 11:29:05

Настроил ipfw.
Вот решил задачу выхода во внешнюю сеть на сервер провайдера, в котором лежит репозитарий
Но в инет пользователей не пустил
вот кусочек моего

${FwCMD} add 140 deny ip from 127.0.0.0/8 to any
#следующим 2 правилам нужно сделать так чтоб пропускалось следующее за ними правило
#!!!!!!!!!!!! проверить

${FwCMD} add 145 skipto 160 ip from ${AllIp} to ${ErTelecom} out via ${LanOut} #Разрешаем соединение с сервером р-телекома
${FwCMD} add skipto 110 ip from ${ErTelecom} to ${AllIp}  #Разрешаем соединение сервера р-телекома с компами

#Разрешил в инет, если нужно еще кому, то нужно добавить через запятую его ip адрес или лучше прописать в переменной
#${FwCMD} add 150 deny ip from not ${AllowIp} to any out via ${LanOut}  # Этим адресам можно в инет



# Вводим запреты:
# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться не откуда на нём.
# рубим частные сeти
${FwCMD} add 160 deny ip from any to 10.0.0.0/8 in via ${LanOut}

artem, 2008-04-10 в 14:11:43

 а текст прочитать осилил прежде чем стереть??
 для тебя повторю:
Для вопросов есть форум!

Z-16-H, 2008-04-11 в 5:06:14

Кому интересно, нашёл более-менее правильно переведённый MAN по IPFW. Правда для FreeBSD 4.4.

http://www.unixdoc.ru/index.php?mode=2&podmode=1&arcicle_id=32

http://ln.ua/~openxs/projects/man/uman110.html

pwlad, 2008-04-17 в 8:34:56

>barsykoff, 2007-09-12 в 14:15:57
>А разве не оптимальней было сделать так:
>1. Разрешить трафик по локальной сети и петле
>2. NAT, fwd
>3. Разрешить некоторый трафик снаружи
>4. Запретить все.
>Ведь тогда не надо писать так много запретов...

Действительно, ведь последнее правило запрещает всё, что не разрешено.
Или я чего-то не догоняю?

Black, 2008-06-03 в 17:06:44

Большое спасибо lissyara !!!

KnyaZ, 2008-06-06 в 13:51:24

Респект и уважуха автору

Sun, 2008-07-29 в 8:29:14

Ребят а кто-то из вас книги по BSD читал или нет? Тем более если вы по английски читать не можете, хандбук например - как вы бсд то юзать будете?? OMG :)

cheshire_cat, 2008-09-05 в 0:53:20

Во втором конфиге два раза повторяются строчки

# открываем снаружи 20,21 порт - для активного FTP
${FwCMD} add allow tcp from any to ${IpOut} 20,21 in via ${LanOut} setup

eXo, 2008-10-03 в 12:31:42

А я так и не понял... открываю файл /etc/rc.firewall для редактирования правил а там такая околесица написана... все удалить и внести вышесказанное или под ним дописать????
И еще у мен PPPoE ADSL инет с динамическим IP как для него правила переделать???

kottyara, 2008-10-03 в 12:56:11

В поле "внешнего" айпи вводится адрес сетевой карточки, которая "смотрит" на ADSL модем (соединение Ethernet'ом). Смысл файервола - защищать комп, а не модем ;-)

Damon_X, 2008-11-19 в 13:37:55

${FwCMD} add allow tcp from ${IpOut} to any out via ${LanOut} setup
${FwCMD} add allow tcp from any to ${IpOut} in via ${LanIn} setup
Не понимаю совсем этих строчек!! Зачем они там ? кто растолкует

Rassadin, 2008-11-27 в 0:55:34

Во FreeBSD 7 ядерный NAT включается в /etc/rc.conf
firewall_nat_enable="YES"
firewall_nat_interface="if0" # if0 = внешний интерфейс
firewall_nat_flags=""  # можно вставить redirect_port, если надо пробросить.
natd_enable="NO"      # natd соответственно не нужен

В конфиге ядра должны быть
options         IPFIREWALL_NAT
options         LIBALIAS

Кажется модулем не подключить, надо пересобирать.

Rassadin, 2008-11-27 в 0:57:57

Это все, конечно, если использован штатный /etc/rc.firewall

WatchYourBalls, 2008-12-08 в 16:48:17

По причине криворукости настроить в FreeBSD 8.0-CURRENT nat через IPFIREWALL_NAT не удалось.
Поэтому попробовал сделать по вашей статье. Спасибо, всё работает отлично.

svol, 2008-12-16 в 14:39:35

в правило
${FwCMD} add allow ip from ${IpOut} to any out xmit ${LanOut}
я бы еще добавил keep-state

Zar, 2008-12-17 в 12:48:16

Ам... а только у меня skype лезет спокойно в Нет и работает? через свои порты?

ЗЫ  правило ${FwCMD} add fwd 127.0.0.1,3128 tcp from ${NetIn} to any 80 via ${LanOut}  
не использую.

WildVlad, 2008-12-23 в 23:55:23

Rassadin, спасибо! 5 часов потерял, не понимая почему правила с divert просто не принимают ни одного пакета.
Пересобрал ядро, поправил rc.conf - все заработало...

WildVlad, 2008-12-24 в 0:50:38

Сорри, в предыдущем сообщении не правильно сказал, не работает... еще где-то косячу.

qwe, 2009-01-14 в 7:18:35

Бред какой то, не может тут все правильно работать. тут в всех примерах все все могут.

smile, 2009-01-27 в 8:40:53

${FwCMD} add allow tcp from any to ${IpOut} 49152-65535 via ${LanOut} - вот это советую закрыть
мне с какого то ip адреса шли пакеты на 65535 порт,
в итоге 64гб накрутило...
по чему так получилось сейчас выясняю...
вот он расхититель казенного имущество 128.31.0.34

tite, 2009-01-29 в 4:26:33

Да тут от всего отказываться надо, файрвол дырявый!!!

GoraCIO, 2009-04-02 в 18:10:29

howto отличный,
единственное не понял: ${FwCMD} add allow tcp from any to ${IpOut} 49152-65535 via ${LanOut}   - смысл?
лично у ся закоментил.

daggerok, 2009-05-22 в 0:55:08

# открываем снаружи 20,21 порт - для активного FTP
${FwCMD} add allow tcp from any to ${IpOut} 20,21 in via ${LanOut} setup
# разрешаем входящую почту
${FwCMD} add allow tcp from any to ${IpOut} 25 in via ${LanOut} setup
# разрешаем SSH
${FwCMD} add allow tcp from any to ${IpOut} 22 in via ${LanOut} setup
# открываем снаружи 20,21 порт - для активного FTP
${FwCMD} add allow tcp from any to ${IpOut} 20,21 in via ${LanOut} setup

похоже дублекат - первая и последняя сточки одинаковы

mike, 2009-05-26 в 13:01:01

автору респект, но вот вопрос на счет почты, как быть?
подскажите плиз

Smith, 2009-08-23 в 17:51:22

Ман хороший, многое объясняет, но с NAT'ом ситауция несколько неясная.

Хендбук настоятельно рекомендует другую структуру конфига при использовании NAT - с употреблением skip to.

Кстати, глава хендбука про IPFW на русском есть здесь же, в разделе "Документация"  

ImperatorX, 2009-10-17 в 5:49:47

статья супер=)

единственно прошу добавить коммент в статью если этот роутер берёт инет с модема-роутера а там обычно сеть 192.168.1.0/24 то правила в твоём лис конфиге а конкретно:
${FwCMD} add deny ip from any to 192.168.0.0/16 in via ${LanOut} и ${FwCMD} add deny ip from 192.168.0.0/16 to any out via ${LanOut}

должны быть под коментарием иначе нет сети... =) сам долго тупил почему не не на серваке и в сети инета :D

Mike, 2010-04-29 в 11:39:26

Спасибо за конфиг!
Зачемание: вместо sysctl %var_name% | awk '{print $2}' можно писать sysctl -n %var_name%
Выдержка из man sysctl:
-n      Show only variable values, not their names.

Vsay, 2010-05-31 в 1:19:29

Афтар лох,пиши исчо.

В нормальном виде нельзя было выложить рабочий конфиг?

В примере всё через жопу и разумеется работать не будет.

artem, 2010-06-01 в 15:22:01

Так и запишем школота с ником Vsay статью не смогла осилить,
а копипаст... о горе...не заработал...плак-плак

adre, 2010-06-10 в 16:14:13

Vsya пользуйся BolgenOS. Там говрят прикрутят скоро новые фичи и нинадо больше использовать одинаковые рисунки на рабочем столе и можно будет не покупать ворд у мелкософта, т.к. поповОфис быстрее и надежнее ворда.

Vsay, 2010-07-09 в 3:04:03

Я сама писала конфиг и всё пашет, а вот по статье нет и не будет, потому что реально через жопу.

adre ,TupakOS себе поставь, там говорят даже дауны в состоянии в пасьянс раскладывать.

Alex Keda, 2010-07-09 в 7:12:31

Мадама, идите детей воспитывайте, а не выступайте с глупостями.
Эти конфиги срисованы с севреров которые до сих пор работают.
с 4.11 FreeBSD.
и конфиг файрволла на них - всё тот же, за 5 лет его даже менять не потребовалось.

Alexandr_A, 2010-07-09 в 8:13:16

Vsya, видимо тебе часто говорили, что девушка админом быть не может ты затаила большую обиду на мужчин админов и пришла полить грязью человека, который в плане ИТ-сообщества рунета сделал большое дело ввиде сие ресурса, где многие находили и находят ответы на свои вопросы.
P.S. У меня заработало ;) ИМХО: девушка не может быть админом, спасибо что помогла в этом убедиться ;) !!!

Outsider, 2010-08-31 в 13:25:22

Касательно - P1003_1B_SEMAPHORES
options         P1003_1B_SEMAPHORES   -
Поддержка семафоров POSIX. В ветке 8.1 имеет статус very xperimental...

----------------------------------------
# p1003_1b_semaphores are very experimental,
# user should be ready to assist in debugging if problems arise.
----------------------------------------

Outsider, 2010-08-31 в 13:27:29

Не в тот пост написал, это касательно сборки ядра....
(P1003_1B_SEMAPHORES)
ссори))

ups91, 2010-09-10 в 19:55:17

Приведенный конфиг файрвола достаточно точно представляет собой перевод
файла /etc.rc.firewall для случая "simple".
Автор сделал только дополнение с пайпами, контру и
еще парочку НЕ УДАЧНЫХ "исправлений" для ДНС.
Для хостов ЗА таким файрволом будет доступен ТОЛЬКО ДНС сервер на ЭТОЙ ЖЕ машине (а если его там нет - то имена развязываться НЕ БУДУТ).

ups91, 2010-09-10 в 20:07:38

2 Alex Keda: "конфиг с рабочего сервака"
Для клиентов ЗА таким файрволом будет доступен ТОЛЬКО один ДНС сервер (тот, который на этом же сервере).
Правила для выпуска обращений к внешним серверам - некорректны. Они не пропустят ответ внешнего ДНС (после ната) во внутр. сеть.  
Сравни, хотя бы с правилами для контры на внешних серверах (она так же работает по UDP но на других портах)

tak zashel, 2010-10-11 в 14:35:08

Друзья, коллеги, хорошие люди, мадам, недруги и пр.. статья еще актуальна? Стоит по ней настраивать фаер на 8.1?

Alexandr_A, 2010-10-12 в 7:16:36

tak zashel
а ты проверь, потом отпишиешься )
P.S. А че бы и не работать?!

tak zashel, 2010-10-12 в 13:55:05

проверил.. второй пример.. что-то пользователей сети не пускает в инет через сквид.. (правда правила чуть изменил).. открыл порт для openfire, заработал через инет... открыл также 1194 для openvpn - не заработал...
Сканировал NMAPом, порт для openfirе видит, а 1194 нет

Alexandr_A, 2010-10-13 в 2:57:00

tak zashel
Думаю пора писать на форум )

Fobos, 2010-12-20 в 19:04:17

Запустил сей конфиг на фре 8.1, работает всё как бы, но за этим фаерволом из венды невозможно подк.ючиться в ВПН по РРТР, непонятно как то, по правилас gre не идут вооще никакие пакеты.

gpnoz, 2011-01-03 в 1:58:49

Товарищщи! все тут правильно и все работает. просто обратите внимание на регистр. т.е {FwCMD} в штатном rc.firewall пишется {fwcmd}. обращайте внимание на мелкие недочеты. как описано, так и работает.

Для вопросов есть форум!

tokito, 2011-07-13 в 12:40:12

уже неделю мучаюсь с натом , не хочет он раздавать инет по сети :(
перепробовал уже кучу инструкций:(

Fobos, 2011-07-14 в 0:17:00

Какая версия ОС?

time, 2011-08-28 в 18:33:04

я не совсем понял, вот это правило

${FwCMD} add allow udp from any 53 to any via ${LanOut}

разрешает с локального порта 53 отправлять udp пакеты в любых направлениях?

Fobos, 2011-08-29 в 0:15:13

С любого хоста за натом разрешает отправлять запросы на 53ий порт любого хоста вне сети, вообще то говря правило лишнее, но на всякий случай типа.

time, 2011-09-20 в 11:46:18

вот не понимаю, это правильно значит что с удаленного 53 порта можно коннектиться к любым локальным портам моей тачки? это ведь не дело!

tehnikpc, 2011-11-28 в 21:13:09

"Учтите - эти изменения живут ровно до первой перезагрузки, если хотите чтобы они остались насовсем, то читайте тут."-а что собственно читать, то, что просто нужно прописать нужное значение в /etc/sysctl.conf? Странно.

tehnikpc, 2011-11-28 в 21:19:28

Зачем делать открытый фаерволл тоже не пойму.

bilcic, 2011-12-14 в 20:29:26

если внешний адресс выдется провайдером по DHCP то

IpOut=`ifconfig $LanOut | grep inet | awk \'{print $2}\'`

SkiNNi, 2012-01-10 в 11:57:17

 я только начинаю разбираться в BSD, так что может глупый вопрос но:
${FwCMD} add allow ip from any to any via lo0
# рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0 (вот честно - ни
# одного пакета по этим правилам не зарубилось за всё время... Может в этом
# моё счастье? :))
${FwCMD} add deny ip from any to 127.0.0.0/8
${FwCMD} add deny ip from 127.0.0.0/8 to any


первое правило разве не разрешает выходить всем пакетам через lo0? И до остальных не доходит?

SkiNNi , 2012-01-10 в 11:59:23

Извеняюсь было уже спрошенно и отвеченно. Удалите плиз. :(

Vsey, 2012-06-25 в 12:29:31

Alex Keda,Alexandr_A,adre,artem Вы криворукие балбесы.

Конфиг фаервола приведённый выше мало того что раком написан так ещё и не рабочий.

Alex Keda, 2012-06-25 в 19:36:07

эх вася, вася...
высокоинтеллектуальный вы наш пионер на каникулах...
прочтите комментарий от 2007-07-25 в 14:29:03

а статья от 2006 года. прошло больше шести лет, и файрволл этот, в этой же конфигурации работаеет на этой же машине.

учитесь вася, читать комментарии, думать.
а комбинацию Ctrl+C && Ctrl+V лучше сразу забыть.

tehnikpc, 2012-07-30 в 8:24:42

"разрешаем весь исходящий траффик"
Правило просто шикарное. Может тогда просто сразу сделать "${FwCMD} add allow ip from any to any"?

МОРЖ, 2014-11-29 в 0:44:29

Alex Keda - ТЫ ОЛЕНЬ

Alex Keda, 2014-11-29 в 0:50:00

вот честное слово, мне - похуй =)

возраст детских обид на дурачков из интернета - давно уже прошёл. да и не было его наверное, иначе бы закрыл камменты ещё на первом таком комментарии, лет 8 назад.

2admin2, 2014-12-24 в 19:49:26

Т2овар2ищ2щи2! 2Это 2пол2я для вв2ода ком2мент2ар2иев к 2статье, 2а не для 2воп2рос2ов. 22Сю2да пиш2ите2 н2ай2де2нны2е 2баги2, и2ли ка2к2ие-т2о2 2фи2чи :2)2
Д2л2я2 воп2ро2сов2 ес2ть2 фо2рум2!

Alex Keda, 2014-12-24 в 19:51:21

Гот честное слово, мне - похуй =)

возраст детских обид на дурачков из интернета - давно уже прошёл. да и не было его наверное, иначе бы закрыл камменты ещё на первом таком комментарии, лет 8 назад.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0727 секунд
Из них PHP: 63%; SQL: 37%; Число SQL-запросов: 77 шт.
Исходный размер: 171698; Сжатая: 31431