IPFW -пример правил фильтрации для ADSL


В связи с лавинообразным ростом числа пользователей ADSL-соединений и большим процентом наличия среди них начинающих пользователей FreeBSD, считаю разумным привести коротенький пример настроек правил фильтрции пакетного фильтра IPFW, штатного средства защиты этой ОС.
Разберем шаги, необходимые для задействования фильтрации пакетов:
Установка исходных текстов ядра
Внесение необходимых изменений и компиляция ядра
Устнановка опций rc.conf и написание правил
Внимание! Эта статья актуальна для FreeBSD 5.x, на более ранних версиях возможно пидется внести некоторые изменения.
Установка исходных текстов ядра
Если вы не установили исходные тексты ядра при инсталляции системы то вы можете воспользоваться утилитой /stand/sysinstall или сделать это вручную:
bash-2.05b# mount -t cd9660 /dev/acd0 /cdrom/
bash-2.05b# cd /cdrom/src/
bash-2.05b# ./install.sh sys
После чего исходные тексты ядра будут распакованы в /usr/src/sys.
Внесение необходимых изменений и компиляция ядра
Для работы пакетного фильтра необходимо добавить в ядро несколько опций. общий порядок действий будет следующим:
bash-2.05b# cd /usr/src/sys/i386/conf/
bash-2.05b# cp GENERIC Irish
bash-2.05b# vi Irish
Добавляем опции в ядро:
options IPFIREWALL
options DIVERT
options DUMMYNET
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
Где опции: IPFIREWALL - задействует фильтрацию пакетов
DIVERT - позволит нам в дальнейшем использовать NAT
DUMMYNET - предоставляет возможности ограничения полосы пропускания
IPFIREWALL_VERBOSE - включает режим регистрации
IPFIREWALL_VERBOSE_LIMIT=100 - ограничивает размер журнального файла
Опции DIVERT и DUMMYNET здесь описаны не будут, но их включение в состав ядра позволит избежать перекомпиляции ядра при возникновении желания раздавать Интернет локальной сети. После чего компилируем и устанавливаем ядро:
bash-2.05b# config Irish
bash-2.05b# cd ../compile/Irish
bash-2.05b# make depend
bash-2.05b# make
bash-2.05b# make install
bash-2.05b# shutdown -r now
Установка опций rc.conf и написание правил
Добавляем в /etc/rc.conf следующие строки:
firewall_enable="YES"
firewall_script="/etc/firewall"
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="test"
У нас имеется сетевая карта Realtek 8139 (rl0), которая подсоединена к ADSL модему Zyxel Omni ADSL LAN EE. Для организации связи мы используем PPPoE, поэтому в правилах у нас будет использоваться именно rl0, а не tun0. Опции ppp_enable, ppp_mode и ppp_profile обеспечивают нам доступ в Интернет при загрузке машины, хотя скрипт ppp можно запускать и вручную. Пишем /etc/ppp/ppp.conf:
default:
test:
set device PPPoE:xl0
set MTU 1492
set MRU 1492

set dial
set crtscts off
set speed sync
accept lqr
disable deflate
disable pred1
disable vjcomp
disable acfcomp
disable protocomp
set log Phase LCP IPCP CCP Warning Error Alert
set ifaddr 10.0.0.1/0 10.0.0.2/0 0.0.0.0 0.0.0.0
add default HISADDR
set login
set authname ppp0012345@mtu
set authkey your_password
set server /var/run/ppp/ppp.pid "" 0117
Как уже неоднократно говорилось и писалось, что именно будет пропускаться во внешний мир и к чему будет доступ извне - решать только вам, руководствуясь советами и здравым смыслом. Например, /etc/firewall может выглядеть так:
#!/bin/sh
oif="rl0"
oip="192.168.255.2"
odns="172.16.2.20"
cmd="ipfw add "
$cmd 00500 check-state
#----------------Blocking------------------------
# Block SAMBA
$cmd 00110 deny { tcp or udp } from any to any 135,137,138,139,369,445,520,5000
# i'am dont want this
$cmd 00120 unreach port { tcp or udp } from any to me 113
# Stop allow IP Packets without (or empty) mss options
$cmd 00130 deny log tcp from any to any tcpoptions !mss setup
$cmd 00140 add deny log tcp from any to any in tcpflags syn,fin
#----------------Darwin------------------------
$cmd 00600 allow tcp from any to me 8000 via $oif
$cmd 00610 allow tcp from any to me 554 via $oif
#----------------DNS------------------------
$cmd 00700 allow tcp from any to $odns 53 out via $oif setup keep-state
$cmd 00710 allow udp from any to $odns 53 out via $oif keep-state
#----------------SSH------------------------
$cmd 00800 allow tcp from 172.16.2.20 to me 22 via $oif
№-----------------Common-----------------------
$cmd 00820 allow ip from me to any
$cmd 00830 allow ip from 127.0.0.1 to 127.0.0.1 via lo0
$cmd 00830 allow ip from $oip to $oip via lo0
$cmd 00830 deny ip from 127.0.0.1 to any
$cmd 00830 deny ip from any to 127.0.0.1
#---------------PING------------------------
$cmd 00900 allow icmp from any to any icmptypes 0,3,8,11,12,13,14
#----------------Deny all--------------------
$cmd 06000 deny log ip from any to any
В данном примере в мир вещает в мир Darwin Streaming Server, разрешен вход по ssh c работы, причем эта же машина играет роль DNS сервера. Данный набор не является идеальным, но перед ним такая цель и не ставилась. Хороший набор правил для начинающего пользователя находится в /etc/rc.firewall, загружать эти вы можете с помощью опции firewall_type, которая может принимать значения:
open - открыто все
client - основные функции защиты локальной машины
simple - основные функции защиты локальной сети
closed - блокировка всего, за искоючением lo0
UNKNOWN - правила фильтрации не загружаются
filename - загружать правила из файла(необходимо указание полного пути)
Вот еще один пример правил фильтрации, наиболее полно подходящий, для использования с ADSL:
#!/bin/sh
# the file /etc/firewall - configuration script for ipfw
# already established connections continue going through
ipfw add 01000 allow tcp from any to any established
# local adaptors (not tun0 that is). 'rl0' is connected to the DSL modem
# for PPPoE. You should
# change these to match your own system. If you are not using 'PPPoE' then
# you should exclude the entry for the adaptor that is connected to the internet.
ipfw add 01100 allow all from any to any via rl0
# don't forget the loopback interface or some things might break
ipfw add 01101 allow all from any to any via lo0
# udp access control (all adaptors)
ipfw add 02000 allow udp from any to any 1024-65535,domain,daytime,time,echo,discard,chargen

# allow udp access to any port when the packet is outgoing or 'fragment'
ipfw add 02001 allow udp from any to any out
ipfw add 02500 allow udp from any to any frag
# tcp access control - note that 'ftp-data' must be specified by port number '20'
ipfw add 03000 allow tcp from any to any http,https,ftp,20
ipfw add 03000 allow tcp from any to any 1024-65535,ssh,domain,telnet
ipfw add 03000 allow tcp from any to any daytime,time,echo,discard
# if you want services such as 'auth' 'pop3' or 'smtp' to be accessed by the outside
# world, consider uncommenting the following line
# ipfw add 03000 allow tcp from any to any auth,pop3,smtp
# outgoing TCP packets - no filtering at all
ipfw add 03001 allow tcp from any to any out
# icmp packets (ping). 'icmptypes' are listed based on recommendations from
# the FreeBSD handbook on ipfw.
ipfw add 04000 allow icmp from any to any icmptypes 0,3,8,11,12,13,14
# These next 4 entries are needed for VPN. They can be removed if you won't be using it
ipfw add 04500 allow esp from any to any
ipfw add 04501 allow gre from any to any
ipfw add 04502 allow udp from any to any 500
ipfw add 04503 allow tcp from any to any 1023,1723
# note that '1723' was still mentioned here. That is in case you filter it elsewhere
# logging and denying
ipfw add 05999 deny log ip from any to any frag
# this next one is by default the last one. You can choose a LARGE number if you
# like. I chose '6000', you can pick anything up to 65535. In FreeBSD the rule
# for '65535' is initially defined as 'deny all from any to any' when you load ipfw.
ipfw add 06000 deny all from any to any
В статье использовались материал Дмитрия Пупкова http://www.opennet.ru/tips/info/753.shtml

Обновлено: 12.03.2015