Блокировка сайтов средствами IPFW

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
km
рядовой
Сообщения: 16
Зарегистрирован: 2009-07-16 11:57:57

Блокировка сайтов средствами IPFW

Непрочитанное сообщение km » 2011-07-27 6:21:30

Здравствуйте!

Имеется машина с 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
Сам по себе скрипт работает безотказно, если указать верно файл с dns-именами хостов и путь у нему.
Скрипт и настройки файрвола забиты в крон на определенное время.

Далее в настройках 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
Я блокирую путь к желанным сайтам(правило 31) пользователей уже на выходе, т.е. для squid-a.
Это работает, но получается что всем пользователям закрыт доступ к сайту.
Возможно я что-то не понимаю, но тут получаются грабли, т.к. внутренние пользователи обращаются как напрямую к сквиду на порт 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

crontab:

Код: Выделить всё

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

rmn
старшина
Сообщения: 426
Зарегистрирован: 2008-10-03 18:52:02

Re: Блокировка сайтов средствами IPFW

Непрочитанное сообщение rmn » 2011-07-27 11:48:45

km писал(а):Это работает, но получается что всем пользователям закрыт доступ к сайту.

Правильно. Ты же указываешь

Код: Выделить всё

reject ip from any to "table(1)"


Сделай

Код: Выделить всё

reject ip from "table(2)" to "table(1)"

и в таблицу 2 заноси пользователей, которым запрещать доступ.

km
рядовой
Сообщения: 16
Зарегистрирован: 2009-07-16 11:57:57

Re: Блокировка сайтов средствами IPFW

Непрочитанное сообщение km » 2011-07-27 12:48:21

rmn писал(а):
km писал(а):Это работает, но получается что всем пользователям закрыт доступ к сайту.

Правильно. Ты же указываешь

Код: Выделить всё

reject ip from any to "table(1)"
Это и я сам знал, но всё равно спасибо.

rmn писал(а):Сделай

Код: Выделить всё

reject ip from "table(2)" to "table(1)"

и в таблицу 2 заноси пользователей, которым запрещать доступ.
Такое уже делал, результат - нулевой. Думаю, что это все из-за squid-а.

Аватара пользователя
gumeniuc
ст. сержант
Сообщения: 343
Зарегистрирован: 2009-11-08 15:46:05
Откуда: md
Контактная информация:

Re: Блокировка сайтов средствами IPFW

Непрочитанное сообщение gumeniuc » 2011-08-09 11:25:15

а squidguard чем не устраивает ? там и acl есть.
Да шо ему сделается...

km
рядовой
Сообщения: 16
Зарегистрирован: 2009-07-16 11:57:57

Re: Блокировка сайтов средствами IPFW

Непрочитанное сообщение km » 2011-08-11 9:14:24

gumeniuc писал(а):а squidguard чем не устраивает ? там и acl есть.


Ну что, сказать как не крути, без acl не обошлось, в общем-то что и было сделано средствами acl squid-а.
Кому интересно, пример части squid.conf:

Код: Выделить всё

acl InternetUsers src "/usr/local/squid/etc/inetusr"
acl black_url url_regex "/usr/local/squid/etc/black_url"
acl black_social url_regex "/usr/local/squid/etc/black_social"
acl vip_list src "/usr/local/squid/etc/vip_list"

acl SocialTime_1 time MTWHF 09:00-13:00
acl SocialTime_2 time MTWH 14:00-18:00
acl SocialTime_3 time F 14:00-17:00

http_access deny black_url

http_access allow vip_list

http_access deny InternetUsers black_social SocialTime_1
http_access deny InternetUsers black_social SocialTime_2
http_access deny InternetUsers black_social SocialTime_3
http_access allow InternetUsers
......................................................................

http_access deny all

Файл пользователей, которым необходимо закрыть доступ, inetusr (в данном случае сеть):

Код: Выделить всё

192.168.0.0/24

Файл с адресами постоянно закрытых сайтов, black_url:

Код: Выделить всё

kpoxy.com

Файл с адресами сайты к которым необходимо периодически закрывать доступ, black_social:

Код: Выделить всё

vk.com
vkontakte.ru
odnoklassniki.ru

Файл с ip-адресами пользователей можно, vip_list:

Код: Выделить всё

192.168.0.62
192.168.0.43
192.168.0.78

Закрывает пользователям доступ к соц. сетям в рабочее время:

Код: Выделить всё

acl SocialTime_1 time MTWHF 09:00-13:00
acl SocialTime_2 time MTWH 14:00-18:00
acl SocialTime_3 time F 14:00-17:00

После изменения конфига squid-a: не забывайте выполнить

Код: Выделить всё

squid -k reconfigure

km
рядовой
Сообщения: 16
Зарегистрирован: 2009-07-16 11:57:57

Re: Блокировка сайтов средствами IPFW

Непрочитанное сообщение km » 2011-08-11 9:15:29

Ах, да! Всем большое спасибо!
Можно закрывать тему.

Аватара пользователя
alex117
ст. сержант
Сообщения: 320
Зарегистрирован: 2010-07-30 13:25:13

Блокировка сайтов средствами IPFW

Непрочитанное сообщение alex117 » 2016-06-27 11:48:24

Некропост, но может кто ответит.
Нужно заблочить доступ к сайтам микрософта.
Что делать с www.msn.com и www.microsoft.com ?
К примеру dig http://www.msn.com вот что возвращает:

Код: Выделить всё

root@gw01:/etc # dig www.msn.com +short
www-msn-com.a-0003.a-msedge.net.
a-0003.a-msedge.net.
204.79.197.203

Т.е в дополнение к ip-адресу пишет еще и cname, которые нельзя пихать в таблицу ipfw

Отправлено спустя 13 минут 5 секунд:
alex117 писал(а):Некропост, но может кто ответит.
Нужно заблочить доступ к сайтам микрософта.
Что делать с www.msn.com и www.microsoft.com ?
К примеру dig http://www.msn.com вот что возвращает:

Код: Выделить всё

root@gw01:/etc # dig www.msn.com +short
www-msn-com.a-0003.a-msedge.net.
a-0003.a-msedge.net.
204.79.197.203

Т.е в дополнение к ip-адресу пишет еще и cname, которые нельзя пихать в таблицу ipfw

как оказалось, ipfw строчки с не ip-адресом просто не вносит в таблицу, так что все нормально

lazhu
сержант
Сообщения: 176
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Блокировка сайтов средствами IPFW

Непрочитанное сообщение lazhu » 2016-06-28 9:16:00

alex117 писал(а):как оказалось, ipfw строчки с не ip-адресом просто не вносит в таблицу, так что все нормально

Для перфекционистов:

Код: Выделить всё

grep "^[0-9]"

Аватара пользователя
alex117
ст. сержант
Сообщения: 320
Зарегистрирован: 2010-07-30 13:25:13

Блокировка сайтов средствами IPFW

Непрочитанное сообщение alex117 » 2016-06-28 13:01:50

lazhu писал(а):
alex117 писал(а):как оказалось, ipfw строчки с не ip-адресом просто не вносит в таблицу, так что все нормально

Для перфекционистов:

Код: Выделить всё

grep "^[0-9]"

спасибо, все работает.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34889
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Блокировка сайтов средствами IPFW

Непрочитанное сообщение Alex Keda » 2016-07-07 7:10:08

ipfw все имена резолвит
И пихает уже адреса.
Убей их всех! Бог потом рассортирует...

Corwin
мл. сержант
Сообщения: 100
Зарегистрирован: 2008-02-15 16:53:24

Блокировка сайтов средствами IPFW

Непрочитанное сообщение Corwin » 2016-11-06 17:32:20

Alex Keda писал(а):ipfw все имена резолвит
И пихает уже адреса.


Я вот как-то поздно узнал об этой возможности. А когда начал он это делать или делал он это всегда?


Вернуться в «Networks»

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и 15 гостей