[FreeBSD] пример продвинутого /etc/rc.firewall (firewall freebsd ipfw example)
Ключевые слова: firewall, freebsd, ipfw, example, (найти похожие документы)
From : Igor Nikolaev 2:5030/266 10 Jan 01 11:38:50
Subj : [FreeBSD] пример продвинутого /etc/rc.firewall
-------------------------------------------------------------------------------
* Forwarded from area 'RU.LINUX'
> опять же - поверю, когда увижу работающее. Желательно - не на
/> уровне домашней машины - для нее есть та тулза, которая в subject.
Может кому поможет, я выкинул конкретику, надеюсь нигде не
опечатавшись. Всё равно патчить по месту, gpl :-)
Это от фри потому как нефиг на линуксе роутеры строить.
# control network
vtc="правильная_сетка с серверами/24"
mail="почтовая машина"
mail_ports="23,25,110,540"
# в этом каталоге лежит файл с описанием роутера, см ниже
rules=/usr/local/etc/ipfw/`/bin/hostname -s`
# запуск /etc/rc.firewall echo | less для отладки
if [ "${1}" = "echo" ]
then ipfw="/bin/echo"
else ipfw="/sbin/ipfw"
fi
# interface ip number by name
ip () { ifconfig $1 | grep inet | awk '{ print $2; }'; }
# start list number
rule_num=1000
# pass and deny rules
pass () { rule_num=$(($rule_num+10)); $ipfw add $rule_num pass $*; }
deny () { rule_num=$(($rule_num+10)); $ipfw add $rule_num deny $*; }
# backbone
backbone () { pass all from any to any via $1; }
# client segment
segment () {
pass ip from `ip $1` to any via $1
pass ip from any to `ip $1` via $1
}
# any access
any () {
pass all from $1 to any
pass all from any to $1
}
# free acces from any interface from list to any
lan () {
local i j
for i in $*; do
pass ip from `ip $i` to any via $i
pass ip from any to `ip $i` via $i
for j in $*; do
if [ $i != $j ]; then
pass all from any to any out recv $i xmit $j
fi
done
done
}
# client workstation: only outgoing tcp
client () {
pass ip from $1 to any
pass tcp from any to $1 established
}
# only mail workstation
mailws () {
pass tcp from $1 to $mail $mail_ports
pass tcp from $mail $mail_ports to $1
}
# server: only incoming tcp on port list + control snmp
server () {
local ip port
ip=$1
shift
for port in $*
do
pass tcp from any to $ip $port
pass tcp from $ip $port to any established
done
}
# не забудьте default accept в ядре
$ipfw -f flush
# default правила, чините сами чего как кому надо ;-)
pass all from any to any via lo0
deny all from any to 127.0.0.0/8
pass udp from any to any 33434-33523
pass all from $vtc to any
pass all from any to $vtc
pass tcp from any to any established
# named
pass udp from any to $vtc 53
pass udp from $vtc 53 to any
pass udp from $vtc to any 53
pass udp from any 53 to $vtc
# snmp
pass udp from any 161 to $vtc
pass udp from $vtc to any 161
# icmp
deny icmp from any to any frag
pass icmp from any to any
# bootp
pass udp from any to any 67
pass udp from any to any 68
# Router rules
. $rules
$ipfw add 65000 deny all from any to any
%
Конфигурация конкретной машины выглядит как-нибудь вот так:
% less /usr/local/etc/ipfw/имя_роутера
backbone ed0
backbone ed1
lan ed2 ed3 ed4
segment ed5
segment ed6
client $ip
client $ip
server $ip smtp pop3 imap4 http
server $ip 22 23 25 4000-4010
mailws $ip
%
$ip это ip адрес клиента.
*Hельзя* использовать fqdn вместо ip - так как
роутинг в момент загрузки может ещё не встать.
Hа самом деле это старый вариант, сейчас я это
дело на perl'е переписал. Hо для небольшого
числа роутеров (десяток) он вполне пригоден.
--
Игорь Hиколаев
--- ifmail v.2.12.os.sensi
* Origin: http://www.spb.edu (2:5030/266@fidonet)