Блокировка сайтов средствами 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

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

rmn
старшина
Сообщения: 427
Зарегистрирован: 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
ст. сержант
Сообщения: 377
Зарегистрирован: 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
сержант
Сообщения: 254
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

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

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

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

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

grep "^[0-9]"

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

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

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

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

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

grep "^[0-9]"
спасибо, все работает.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 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 все имена резолвит
И пихает уже адреса.
Я вот как-то поздно узнал об этой возможности. А когда начал он это делать или делал он это всегда?

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

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

Непрочитанное сообщение alex117 » 2019-02-13 15:04:36

В виду того, что https стал практически основным протоколом и его надо как-то контролировать подниму снова данную тему.
Дело в том, что до недавнего времени использовали squid в прозрачном режиме + ssl_bump и все дела.
Работало это в общем то неплохо, но появился глюк с ютубом и gmai'ом в виде ошибки сертификата SSL_ERROR_RX_RECORD_TOO_LONG, также чудило при открытии облака на мэйле.
Да и бывают иногда мелкие проблемы с сайтами, которые никак не хотят работать через прокси даже в прозрачном режиме. Ковыряния со сквидом ни к чему не привели, да и поднадоели уже порядком. Поэтому приняли решение - отказаться от него вообще и фильтровать только при помощи ipfw, тем более, что кеширование уже не особо актуально и нам много резать не надо.
Задача стоит такая - закрыть соцсети, ютуб и сайты M$, но не всем. У нескольких юзеров должен быть доступ к данным сайтам.
Пока думаю сделать несколько таблиц в ipfw и покидать туда сайты для блокировки и ip юзеров.
Проблема стала при попытке вычислить все адреса ютуба, коих у него целая куча, при каждом новом nslookup выдаются штук по 10 адресов в разных подсетях. Думаю как это все автоматизировать скриптом и гонять его в кроне пару раз в сутки для обновления.
В баше не силен, пока накидал вот что:

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

#!/bin/sh
dig +noall +answer youtube.com |awk '{print $NF}'
вопрос вот в чем, как писать вывод этого скрипта в файл, чтобы туда вносились только новые адреса и не дублировались старые?
И вообще, какие есть идеи по данному вопросу, может есть вариант лучше?


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

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

Непрочитанное сообщение alex117 » 2019-02-13 18:09:31

j001n писал(а):
2019-02-13 16:40:04
man uniq
Не подошел он мне, сделал иначе
Правда это мне не помогло, если с контактами и одноклассниками все заработало, то с ютубом просто ужас.
Это как гидра, блокируешь одну подсеть, он немного тупит, но потом все равно открыватся, используя новые домены и адреса.

j001n
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-09-23 7:29:11

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

Непрочитанное сообщение j001n » 2019-02-13 18:40:07

Надо поставить локальный dns сервер и возвращать 127.0.0.1

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

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

Непрочитанное сообщение alex117 » 2019-02-13 20:31:33

j001n писал(а):
2019-02-13 18:40:07
Надо поставить локальный dns сервер и возвращать 127.0.0.1
Это первое, что мне пришло в голову, но как быть с теми, кому ютуб все же нужен?
Использовать разные днс тоже как бы не вариант.

j001n
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-09-23 7:29:11

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

Непрочитанное сообщение j001n » 2019-02-13 20:52:47

А как различаешь одних и других ?

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

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

Непрочитанное сообщение alex117 » 2019-02-13 21:31:23

j001n писал(а):
2019-02-13 20:52:47
А как различаешь одних и других ?
по ip адресу

j001n
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-09-23 7:29:11

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

Непрочитанное сообщение j001n » 2019-02-14 11:01:09

Создать таблицу (100) в ipfw для тех кому надо заблокировать доступ. И перенаправляй их на локальный dns. Остальные будут пользоваться внешним.

ipfw add (правило №) fwd (локальный dns),53 udp from table\(100\) to any 53 via (входящий)

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

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

Непрочитанное сообщение alex117 » 2019-04-19 9:35:06

j001n писал(а):
2019-02-14 11:01:09
И перенаправляй их на локальный dns.
А если у меня все пользуются локальным dns?
В данном случае у меня dnsmasq

WideAreaNetwork
сержант
Сообщения: 239
Зарегистрирован: 2017-01-10 14:37:13

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

Непрочитанное сообщение WideAreaNetwork » 2021-08-28 15:34:28

с 10 версии утилиты dig нету в списке штатных утилит, но вроде как есть host
с помощью команды

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

dig +short /etc/dnslist
вытаскиваю все айпишки сайтов которые внесенные в файл dnslist

может кто подскажет как такое сделать с утилитой host ?

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

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

Непрочитанное сообщение Alex Keda » 2021-08-28 22:56:59

дык поставьте
Убей их всех! Бог потом рассортирует...

WideAreaNetwork
сержант
Сообщения: 239
Зарегистрирован: 2017-01-10 14:37:13

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

Непрочитанное сообщение WideAreaNetwork » 2021-08-29 10:14:43

да уже так и сделал

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

# dig dnsname.site +short
127.0.0.1
почему он вернул мне ответ такой айпи? это же loopback вроде

даже если этот айпи попадет на блокировку внешнего интерфейса, то это не должно привести ни к чему плохому?

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

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

Непрочитанное сообщение Alex Keda » 2021-09-15 17:13:18

Надо правила смотреть, приведёт или нет
Убей их всех! Бог потом рассортирует...

WideAreaNetwork
сержант
Сообщения: 239
Зарегистрирован: 2017-01-10 14:37:13

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

Непрочитанное сообщение WideAreaNetwork » 2021-09-15 22:05:34

а правил нету, PF для ната, бината, проброса портов и табл запрещенных сайтов, правила разрешить или запретить на IPFW