блокируем социальные сети через iptables

используя Автономные системы (Autonomous System) или блоки адресов

Постановка задачи: До опредленного времени, нежелательные сайты в офисе замечательно блокировались "прозрачным" SQUID-ом 3-й версии. Однако SQUID не может работать с SSL соединениями в режиме transparent (из-за нарушения самой концепции HTTPS и уязвимости man-in-middle) и, соответственно, не может блокировать социалки, доступные по https. Вариантов наведения порядка достаточно много (свой ДНС и замыкание на localhost; squid с поддержкой SSL; блокировка по IP), но все они имеют свои достоинства и недостатки.

Честно говоря, первым делом был пересобран SQUID с поддержкой SSL, но в итоге самоподписанный сертификат пришлось бы добавить в доверенное хранилище на все машины офиса, что в условиях сети без домена, явно некомильфо. Поэтому, остановимся на блокировании социальных сетей, доступных через https, используя iptables.

Идея проста – собрать все блоки IP-адресов вредных сайтов или социальных сетей и запретить пользователям доступ к ним по SSL порту. (По 80 порту у нас прекрасно справляется SQUID)... Вот тут и появляется проблема №1 – как же нам получить все адреса отдельно взятой социальной сети или сайта? dig? nslookup? эти инструменты явно не охватят всего того объёма адресов крупных порталов по типу Facebook или VK.

Ответ нашелся в использовании Автономных систем (Autonomous System) или блоков адресов крупными социальными сетями. Такие системы и блоки собственных IP-адресов нужны провайдеру или любой крупной компании, имеющей обширную ИТ-инфраструктуру, которой требуется обеспечить отказоустойчивый доступ к ресурсам своей сети, а также иметь возможность самостоятельно определять политики маршрутизации. Имея свою Автономную систему можно без перенастроек кучи оконечного оборудования пользователей менять не только каналы связи но и не быть в зависимости от IP-адресов провайдера, a также менять приоритет каналов и многое другое. Подробнее можно почитать – wiki: Autonomous System или Автономные системы...

Для определения номера автономной системы можно воспользоваться любым whois сервисом, или даже из консоли вот так:

# nslookup facebook.com
Address: 173.252.110.27

# whois -h whois.radb.net 173.252.110.27
...
route:      173.252.96.0/19
descr:      facebook, inc.
origin:     AS32934
...

Искомый номер AS32934.

Замечание: Можно было просто погуглить и найти этот номер тут Facebook Crawler Кстати в работе, нам поможет замечательный сервис ra.net (детали можно почерпнуть тут – How to Query Merit RADB, Query Options). Именно из его недр мы будем получать блоки адресов, опираясь на номер автономной системы социальной сети... Хоть какое-то полезное применение для администраторов, ведущих бой с нежелательным контентов на рабочем месте!

Итак, пул IP-адресов зловредного Facebook мы получаем так

# whois -h whois.radb.net '!gAS32934' | grep /
204.15.20.0/22 69.63.176.0/20 66.220.144.0/20 66.220.144.0/21 69.63.184.0/21 69.63.176.0/21 74.119.76.0/22 69.171.255.0/24 173.252.64.0/18 69.1724.0/19 69.171.224.0/20 103.4.96.0/22 69.63.176.0/24 173.252.64.0/19 173.252.70.0/24 31.13.64.0/18 31.13.24.0/21 66.220.152.0/21 66.220.159.0/24.171.239.0/24 69.171.240.0/20 31.13.64.0/19 31.13.64.0/24 31.13.65.0/24 31.13.67.0/24 31.13.68.0/24 31.13.69.0/24 31.13.70.0/24 31.13.71.0/24 31.72.0/24 31.13.73.0/24 31.13.74.0/24 31.13.75.0/24 31.13.76.0/24 31.13.77.0/24 31.13.96.0/19 31.13.66.0/24 173.252.96.0/19 69.63.178.0/24 31.13.0/24 31.13.79.0/24 31.13.80.0/24 31.13.82.0/24 31.13.83.0/24 31.13.84.0/24 31.13.85.0/24 31.13.86.0/24 31.13.87.0/24 31.13.88.0/24 31.13.89.0/24.13.90.0/24 31.13.91.0/24 31.13.92.0/24 31.13.93.0/24 31.13.94.0/24 31.13.95.0/24 69.171.253.0/24 69.63.186.0/24 31.13.81.0/24 204.15.20.0/22 69.176.0/20 69.63.176.0/21 69.63.184.0/21 66.220.144.0/20 69.63.176.0/20

Пул адресов нашего местного фейсбука VKontakte (AS-VKONTAKTE) состоит из двух автономных систем: основной, AS47541, и вспомогательной, AS47542. (нашлось тут -- ВКонтакте: операторам связи)

# whois -h whois.radb.net '!gAS47541' | grep /
93.186.224.0/21 93.186.232.0/21 87.240.128.0/18 95.142.192.0/21 95.213.0.0/18 185.32.248.0/22

# whois -h whois.radb.net '!gAS47542' | grep /
95.142.200.0/21 95.142.192.0/20

Осталось их только заблокировать. Что и сделаем, используя iptables. Ниже приведен участок скрипта iptables, который отвечает за блокировку трёх самых популярных социальных сетей (facebook, vkontakte, odnoklassniki) для работы через HTTPS, а также даёт возможность добавить некоторых пользователей в исключения по их IP- или mac- адресу:

        # Below are the autonomus system (AS) numbers for some social networks
        # AS32934 -- facebook.com
        # AS47541 AS47542  -- vk.com
        # AS49988 -- ok.ru
        AS_TO_BAN="AS32934 AS47541 AS47542 AS49988"

        #Exceptions for some privilegied users
        SOCIAL_ALLOW_IPs="192.168.1.111"
        SOCIAL_ALLOW_MACs="00:15:5D:01:C9:01"

        echo ""
        echo "Block Social sites"

        $IPT -N SOCIAL

        # Allow social for some user by their IPs
        for userip in $SOCIAL_ALLOW_IPs; do
          $IPT -A SOCIAL -s $userip -j ACCEPT
        done

        # Allow social for some user by their MACs
        for mac in $SOCIAL_ALLOW_MACs; do
          $IPT -A SOCIAL -m mac --mac-source $mac -j ACCEPT
        done

        # Block for others
        $IPT -A SOCIAL -j DROP

        ## Here, we collect all ip-ranges and block access via HTTPS
        for as in $AS_TO_BAN; do
            for ip in `whois -h whois.radb.net "!g$as" | grep /`
            do
              $IPT -A FORWARD -i eth0 -p tcp --dport 443 -d $ip -j SOCIAL
            done
        done 

Блокируется именно в цепочке FORWARD, потому что речь идёт о шлюзовом сервере, который раздаёт Интернет пользователям используя NAT... Если речь идёт о одной машине, блокируйте в других цепочках (INPUT, OUTPUT) или без указания порта 443 (тоесть на всех портах)

Кстати, очевижно, что список сетей может и будет меняться... но в данном случае Вам не придется добавлять новые диапазоны сетей вручную. Достаточно просто рестартануть iptables скрипт или отрядить его перезапук в cron-е. Возможно, Вас заинтересует полная версия скрипта iptables, предназначенного для организации раздачи Интернета – Вы можете посмотреть подробнее здесь...

Комментарии 4

  1. Дмитрий — Mar 31, 2016 at 08:14 AM

    А что скрывается под $IPT ? iptables?

  2. toggetit — Mar 26, 2015 at 11:29 AM

    Низкий тебе поклон мил человек!

  3. Дмитрий — Jan 13, 2015 at 03:34 PM

    Спасибо за статью, агде можно посмотреть полную версию скрипта ?

  4. Иван — May 22, 2014 at 03:04 PM

    Жаль ютуб так не заблокировать - он входит в состав гугловских сетей, и банится все сервисы google. Может посоветуете способ?

  • 1
Разрешённые теги: <b><i><br>