МММ, лучше все ж делать чуть-чуть не так :)))~ # cat /etc/init.d/firewall
#!/sbin/runscript
opts="depend start stop status restart reload force-reload test"
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
COMMON=/usr/local/lib/firewall/firewall-common-rules
MAC=/usr/local/lib/firewall/MAC-allowed
NAME=firewall
DESC="firewall setup"
TESTDELAY=10
depend () {
use logger
}
start () {
echo "Starting $DESC"
echo
$COMMON
$MAC
}
stop () {
echo "Cleaning $DESC"
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
for t in filter nat mangle; do
iptables -t $t -F
iptables -t $t -X
iptables -t $t -Z
done
}
status () {
for t in filter nat mangle; do
echo "============================================================= $t ======"
iptables -t $t -L -n
done
}
restart () {
echo "Restarting $DESC"
svc_stop
sleep 1
svc_start
}
reload () {
restart
}
force-reload () {
restart
}
test () {
echo "Testing $DESC"
start
sleep $TESTDELAY
stop
}
Тот что /usr/local/lib/firewall/firewall-common-rules содержит примерно такое (показываю только куски, что бы была понятна идея :))) ):
NET_L=172.16.0.0/16
NET_R=1.1.1.0/25
NET_Rold=2.2.2.0/24
black_file="/usr/local/lib/firewall/black-list"
white_file="/usr/local/lib/firewall/white-list"
#INPUT
#Список хостов с которых допустим ssh (только своя сетка)
accept_ssh="$NET_L $NET_R $NET_Rold"
#Список служб к которым открыт доступ всем (публичные)
accept_from_all_tcp="53 80 443 17000"
accept_from_all_udp="53 "
#Список служб к которым открыт доступ только из локальной сети (публичные)
accept_from_local_tcp="3128 137 138 139 445"
accept_from_local_udp="67 68 137 138 139 445"
# Разрешено из локальной сети
for a in $accept_from_local_tcp; do
iptables -A tcp_packets -p TCP -s $NET_R --dport $a -j allowed_tcp
iptables -A tcp_packets -p TCP -s $NET_L --dport $a -j allowed_tcp
iptables -A tcp_packets -p TCP -s $NET_Rold --dport $a -j allowed_tcp
done
# Разрешено всем
for a in $accept_from_all_tcp; do
iptables -A tcp_packets -p TCP -s 0/0 --dport $a -j allowed_tcp
done
iptables -A INPUT -p TCP -j bad_tcp_packets
iptables -A INPUT -p ALL -j mac_allowed
for a in $white_list; do
iptables -A INPUT -p ALL -s $a -j ACCEPT
done
for a in $black_list; do
iptables -A INPUT -p ALL -s $a -j DROP
done
iptables -A INPUT -p TCP -j tcp_packets
iptables -A INPUT -p UDP -j udp_packets
iptables -A INPUT -p ICMP -j icmp_packets
#Убиваем все входящие пакеты, дошедшие до этого места
iptables -A INPUT -p ALL -j LOG --log-prefix "INPUT died: "
iptables -A INPUT -p ALL -j DROP
iptables -t nat -A PREROUTING -p tcp -s 172.16.0.0/16 --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A PREROUTING -p tcp -s 172.16.0.0/16 --dport 8080 -j REDIRECT --to-ports 3128
iptables -t nat -A PREROUTING -p tcp -s 172.16.0.0/16 --dport 9080 -j REDIRECT --to-ports 3128
iptables -A POSTROUTING -t nat -s 172.16.0.0/16 -o $INET_IF -j SNAT --to-source $IP
/usr/local/lib/firewall/MAC-allowed заполняет цепочку такими правилами (создаютя автоматом):
iptables -A mac_allowed -s 172.16.2.72 -m mac --mac-source 08:00:09:ed:8b:80 -j RETURN
iptables -A mac_allowed -s 172.16.2.73 -m mac --mac-source 00:10:83:2e:c6:40 -j RETURN
iptables -A mac_allowed -s 172.16.2.74 -m mac --mac-source 00:30:c1:55:af:ec -j RETURN
iptables -A mac_allowed -j LOG --log-prefix "MAC Dropped: "
iptables -A mac_allowed -j DROP