Руководители компании задумываясь о рациональном использовании рабочего дают распоряжение отделу ИТ на блокирование доступа к социальным сетям, причина вполне понятна – это и экономия загрузки канала (трафика) и запрещения для разгильдяйства сотрудников.

Моё видение данное проблемы:

* блокировать доступ сотрудникам к социальным сетям в рабочее время
* разрешать отдельным пользователям иметь постоянный доступ
* делать это наиболее легким для администратора системы способом и не перегружать листинг правил излишней информаций

Поехали :) !

Наш план мероприятий:

1. Определить список социалок, которые хотим закрыть
2. Определяем ip-адреса серверов
3. Создаем правила доступа

1. Я выбираю две самые популярые социальные сети: vkontakte.ru и odnoklassniki.ru
2.Командой nslookup или dig получаем список ip-шников по каждой из социалок:

# nslookup vkontakte.ru
Server: gate
Address: 192.168.1.1

Non-authoritative answer:
Name: vkontakte.ru
Address: 93.186.227.129, 93.186.227.130, 93.186.228.129, 93.186.229.2,
93.186.229.3, 93.186.231.218, 93.186.231.219, 93.186.231.220,
93.186.231.221, 93.186.231.222, 93.186.224.239, 93.186.225.6,
93.186.225.211, 93.186.225.212, 93.186.226.4, 93.186.226.5,
93.186.226.129, 93.186.226.130, 93.186.227.123, 93.186.227.124,
93.186.227.125, 93.186.227.126
# nslookup odnoklassniki.ru
Server: gate
Address: 192.168.1.1

Non-authoritative answer:
Name: vkontakte.ru
Address: 62.105.140.210, 62.105.149.114, 212.44.136.194, 212.119.216.134

3.Создем правила

Листинг файла правил фаервола (/etc/rc.firewall):

#!/bin/sh
ipfw -q -f flush

wan_if="rl0"
cmd="ipfw -q add"
ks="keep-state"

cat /usr/local/etc/table/social | while read line; do
ipfw table 1 add $line
done

$cmd 100 allow ip from any to any via lo0
$cmd 200 deny ip from any to 127.0.0.0/8
$cmd 300 deny ip from 127.0.0.0/8 to any
$cmd 1000 add deny ip from "table 1" to 192.168.1.0/24
$cmd 2000 divert 8668 ip from any to any via ${wan_if}
$cmd 65000 allow ip from any to any
$cmd 65535 deny ip from any to any

Правилом 1000 мы запрещаем хостам сети 192.168.1.0/24 принимать пакеты от ip адресов указанных в table 1.
Обращаю внимание, что правило запрещения должно быть выше правила divert. Важен приоритет разрешений.

Теперь опишем правила, как разрешить отдельным пользователям иметь доступ к социальным сетям. Добавляем правило фаервола кодом ниже 60 000:

ipfw 59000 add allow ip from "table(1)" to 192.168.1.244

Здесь мы описали, что для хоста 192.168.1.244 мы разрешаем доступ к хостам, описанным в table(1).Если список пользователь у нас будет бесконечно расти, то по анологии мы можем разместить его в отдельно таблице, например table(2).

Файл /usr/local/etc/table/social содержит записи ip адресов или сетей. Пример:

62.105.140.210
92.186.225.221/32

Для прямой работы с таблицами приведу набор правил:
Просмотр таблицы 1:

ipfw table 1 list

Добавление и удаление хоста из таблицы (можно с маской или без):

ipfw table 1 add 93.145.100.99/32
ipfw table 1 delete 93.145.100.99/32
ipfw table 1 add 93.145.100.99
ipfw tabe 1 delete 93.145.100.99

Листинг файла /etc/rc.conf

firewall_enable="YES"
firewall_script="/etc/rc.firewall"

Для доступа пользователей к социалкам создаем скрипт, который будет выполняться по cron’у. А конкретнее: в обед (13:00) каждого дня рабочей недели правило 60 000 будет блокироваться и в 14:00 ставиться на место. Mission complete!

Плюсы данной реализации:

1. Таблица правил не перегружена лишней информацией
2. Поставленная задача выполняется в полном объеме

Минусы данной реализации:

1. Необходимо поддерживать список ip адресов в актуальном состоянии
2. Нет явного ответа пользователю, что данный ресурс заблокирован

P.S. Способов блокирование великое множество, у всех них есть свои достоинства и недостатки. Я постараюсь найти время и закрыть минусы описанной реализации. А пока желаю удачных трудовых будней!

Tagged with:  

14 Responses to IPFW и блокирование социальных сетей

  1. ToX@:

    Первый раз поставил фряху в офисе, вопрос по таблицам, немного не понятно как разделяются table(1)/(10) если не сложно опиши

  2. admin:

    хм, не совсем понятен вопрос. Как ты пришел к тому, что бы написать такую конструкцию «table(1)/(10)». Какая стоит задача?

  3. ToX@:

    Сорри не так выразился, ну в общем для начал пробую закрыть социалки, создал socialki в нем прописал все айпишки, меня вотета надпись смутила
    «анологии мы можем разместить его в отдельно таблице, например table(2)»

    «ipfw -q -f flush

    wan_if=»bge0″
    cmd=»ipfw -q add»
    ks=»keep-state»

    cat /usr/local/etc/table/social
    {
    WHILE read line
    do
    ipfw table 1 add $line
    done
    }

    $cmd 50 divert 8668 ip from any to any via ${wan_if}
    $cmd 100 allow ip from any to any via lo0
    $cmd 200 deny ip from any to 127.0.0.0/8
    $cmd 300 deny ip from 127.0.0.0/8 to any
    ipfw 59000 add allow ip from «table(1)» to 192.168.0.99
    $cmd 60000 add deny ip from table 1 to 192.168.0.0/24
    $cmd 65000 allow ip from any to any
    $cmd 65535 deny ip from any to any»
    Это то что я прописал в rc.firewall
    ну и в rc.conf то же что тут описано, в общем ругаиццо на Syntax error: «do» unexpected (expecting «}») когда пытаюсь sh /etc/rc.firewall

  4. admin:

    на страничке я подправил код. Сейчас с ним проблем не должно быть.
    выдержка, то что тебе нужно:

    cat /usr/local/etc/table/social | while read line; do
    ipfw table 1 add $line
    done

  5. iNeko:

    Аааа интересно вот чем мотивировали необходимость просмотра этих сайтов счастливчики которым доступ открыт? :)

  6. admin:

    Выполнение прямых рабочих обязанностей :)

  7. iNeko:

    Понятно, отмазка как всегда.
    Ибо ни вконтакт не одноклассник не могут быть использованы в работе.
    Как не крути.
    Ладно это мелочи.

    Даёшь статью о поднятии Х-ов на FreeBSD!

  8. admin:

    Заказ на статью принят.
    А социалки в работе могут очень помочь — найти контакт контрагента, думаю остальные варианты могут сами в голову прийти. В плане прозрачности информации социалки — это зло, но это уже тема другого разговора.

  9. dima:

    кто захочет тот нангулил свежий список прокси-серверов… :)

    тогда и прокси надо закрыть

  10. Walter:

    Ну хорошо, Вы блокируете по IP-адресам. Дело нехитрое.

    А интересно, кто-то слышал о том что один IP-шник может обслуживать десятки или сотни РАЗНЫХ сайтов (имею ввиду не только сайты социальных сетей).
    Или об этом только я знаю?

    Т.е. намекаю, Вы например закрыли vk.com по IP-шнику, а не по имени домена, а можете ли Вы гарантировать, что таким образом Вы не закрыли какой-то нужный вам или Вашим сотрудникам сайт?

  11. admin:

    Да, конечно, гарантий здесь дать нельзя, что помимо «не нужных» будут закрыты «нужные». Конечно мы знакомы с виртуальными хостами, когда на одном ip размещается несколько сайтов. Так работают практически все хостингоые компании и VDS сервера. Но небольшое уточнение. Но такие монстры, как социальные сети не размещаются на одном ip с другими. Здесь мы конечно можем углубиться в детали — какие серверные комнаты выделены под социальные сети, какие по отказоустойчивости этих социальных сетей использованы технологии. Что бы эти монстры делили с кем-то ip за 150 р. в месяц — здесь больше проблем. А что косается маленьких ресурсов — да, будут проблемы. Но на 5-10 страницах не набегаешься, это не vkontakte. Какую политику вы выбираете для своей компании запрещающую (выбираете что закрыть, а все остальное открыто) или разрешающую (выбираете что открыть, когда все закрыто)?

  12. Notis:

    ipfw 59000 add allow ip from «table(1)» to 192.168.0.99
    $cmd 60000 add deny ip from table 1 to 192.168.0.0/24
    помоему во втором правиле table тоже нужно запилить в кавычках как минимум, ipfw ругается :/

  13. Passenger:

    Воистину так

  14. igor:

    в Украине был случай когда аристовали базу даних компании которая разрабатывала ПЗ для компаний такси изяли сервер, база + контакт

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>