Имеется машина с FreeBSD 7.2 (настроен ipfw+kernel NAT) с установленным Squid 3.1(режим прозрачного прокси).
Хочется запретить некоторым пользователям ходить на определенный перечень сайтов(естественно в рабочее время), но через acl squid-а этого делать как-то не хочется, хочется реализовать это через ipfw.
Предварительно погуглив, смастерил нехитрый скрипт, который берет dns-имена сайтов (которые следует запретить) из одного файла и получает ip-адреса этих хостов и ложит в другой файлик.
Листинг вышеуказанного скрипта(script.sh):
Код: Выделить всё
#!/bin/sh
#Input file with hosts to ban
BAN_Host="/etc/site_ban_host"
#Output file with ip to ban
BAN_IP="/etc/site_ban_ip"
if [ -e ${BAN_Host} ]; then
if [ -e ${BAN_IP} ]; then
rm ${BAN_IP}
touch ${BAN_IP}
cat ${BAN_Host} | while read line; do
dig $line +short >> ${BAN_IP}
done
else
touch ${BAN_IP}
cat ${BAN_Host} | while read line; do
dig $line +short >> ${BAN_IP}
done
fi
else
echo File ${BAN_Host} is not exist! Please create it.
fi
Скрипт и настройки файрвола забиты в крон на определенное время.
Далее в настройках ipfw указываю(некоторые позиции настроек упущены):
Код: Выделить всё
#!/bin/sh
ipfw -f flush
ipfw table all flush
iip="192.168.10.1"
oip="xxx.xxx.xxx.xxx"
oif="xl0"
iif="em0"
chour=`date '+%H'`
cday=`date '+%u'`
cat /etc/site_ban_ip | while read cLine; do
ipfw table 1 add $cLine
done
ipfw add 10 check-state
ipfw add 20 allow all from any to any via lo0
ipfw add 21 deny tcp from any to me 20 via ${oif}
ipfw add 22 deny tcp from any to me 21 via ${oif}
ipfw add 23 deny tcp from any to me 22 via ${oif}
ipfw add 24 deny tcp from any to me 23 via ${oif}
ipfw add 25 deny tcp from any to me 53 via ${oif}
ipfw add 26 deny tcp from any to me 80 via ${oif}
ipfw add 27 deny tcp from any to me 801 via ${oif}
ipfw add 28 deny tcp from any to me 8080 via ${oif}
ipfw add 29 allow udp from any 123 to ${oip} in via ${oif}
if [ ${cday} -ge 1 -a ${cday} -le 4 ] ; then
if [ ${chour} -ge 9 -a ${chour} -lt 13 ] ; then
ipfw add 31 reject ip from any to "table(1)"
elif [ ${chour} -ge 14 -a ${chour} -lt 18 ] ; then
ipfw add 31 reject ip from any to "table(1)"
fi
elif [ ${cday} -eq 5 ] ; then
if [ ${chour} -ge 9 -a ${chour} -lt 13 ] ; then
ipfw add 31 reject ip from any to "table(1)"
elif [ ${chour} -ge 14 -a ${chour} -lt 17 ] ; then
ipfw add 31 reject ip from any to "table(1)"
fi
fi
ipfw add 35 fwd ${iip},8080 tcp from ${iip}/24 to any 80 recv ${iif}
#ipfw nat 1 config if ${oif} deny_in same_ports unreg_only
#ipfw add 40 nat 1 tcp from ${iip}/24 to any 80 out via ${oif}
#ipfw add 50 nat 1 tcp from any 80 to ${oip} in via ${oif}
..............................................................................
ipfw add 220 deny icmp from any to any in icmptype 5,9,13,14,15,16,17
ipfw add 230 reject ip from ${iip}/24 to any in via ${oif}
ipfw add 240 allow tcp from me to any keep-state via ${oif}
ipfw add 250 allow icmp from any to any
ipfw add 260 allow udp from me to any domain keep-state
ipfw add 270 allow udp from any to me domain
ipfw add 280 allow ip from me to any
..............................................................................
ipfw add 600 allow ip from any to any via ${iif}
ipfw add 610 deny all from any to any
Это работает, но получается что всем пользователям закрыт доступ к сайту.
Возможно я что-то не понимаю, но тут получаются грабли, т.к. внутренние пользователи обращаются как напрямую к сквиду на порт 8080(забиты настройки в браузере), так и через перенаправление на порт 80=>8080(прозрачный прокси, правило 35) и блокировать на входе не получается, теоретически замена правила 31 на ipfw add 31 reject ip from "table(1)" to any (которое не работает).
Как реализовать запрет определенным пользователям к определимым сайтам средствами ipfw?
И еще, стоит ли раскоментить следующую конструкцию:
Код: Выделить всё
#ipfw nat 1 config if ${oif} deny_in same_ports unreg_only
#ipfw add 40 nat 1 tcp from ${iip}/24 to any 80 out via ${oif}
#ipfw add 50 nat 1 tcp from any 80 to ${oip} in via ${oif}
Держу её если, что-то случится со squid.
Настройки net.ip.fw:
Код: Выделить всё
net.inet.ip.fw.dyn_keepalive: 1
net.inet.ip.fw.dyn_short_lifetime: 5
net.inet.ip.fw.dyn_udp_lifetime: 10
net.inet.ip.fw.dyn_rst_lifetime: 1
net.inet.ip.fw.dyn_fin_lifetime: 1
net.inet.ip.fw.dyn_syn_lifetime: 20
net.inet.ip.fw.dyn_ack_lifetime: 300
net.inet.ip.fw.static_count: 70
net.inet.ip.fw.dyn_max: 4096
net.inet.ip.fw.dyn_count: 100
net.inet.ip.fw.curr_dyn_buckets: 256
net.inet.ip.fw.dyn_buckets: 256
net.inet.ip.fw.tables_max: 128
net.inet.ip.fw.default_rule: 65535
net.inet.ip.fw.verbose_limit: 100
net.inet.ip.fw.verbose: 1
net.inet.ip.fw.one_pass: 1
net.inet.ip.fw.autoinc_step: 100
net.inet.ip.fw.enable: 1
Код: Выделить всё
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
MAILTO=xxx
0 9,13,14,18 * * 1,2,3,4 /etc/script.sh
1 9,13,14,18 * * 1,2,3,4 /etc/firewall.sh
0 9,13,14,17 * * 5 /etc/script.sh
1 9,13,14,17 * * 5 /etc/firewall.sh