Squid: баним баннеры без вспомогательного веб-сервера

    О пользе избавления от рекламы и самое ужасное — счетчиков (по несколько штук на страницу), думаю, рассказывать не нужно… Чтобы польза была практической и эстетической, забаненные картинки надо заменять на прозрачный однопиксельный GIF. В конфиге squid-a это делается так:

    http_access deny banners
    ...
    deny_info web_server/null.gif banners

    В случае сответствия url-a правилу из ACL banners происходит перенаправление на 1-пиксельный GIF. Вроде бы, всё просто и на этом можно было бы остановиться. Но — как быть, если web-сервер у нас в сети не предусмотрен? Иногда — бывает. Поставить только ради раздачи одного вышеуказанного файла? Неспортивно. Представим себе особо извращенный случай: единственный сервер у нас — контроллер домена и там поставлен squid для NT (прекрасно, кстати, работает!) — не поднимать же IIS… Или — для доступа в интернет используется pfsense, а веб-серверов всё так же — нет и не предвидится…

    На решение проблемы натолкнул просмотр ftp через squid: файлы обозначались картинками, адрес которых говорил мне, что они выдаются из недр squid-a. Немного исследований и — решение готово.

    1. Наш null.gif кладем squid-у в share/icons

    2. В конец файла etc/mime.conf добавляем строку:
    null.gif$ image/gif null.gif - image +download +view

    3. Пусть IP-адрес, по которому к squid обращаются пользователи, 192.168.1.1, а порт стандартный 3128. Тогда директива deny_info в squid.conf примет следующий вид:
    deny_info 192.168.1.1:3128/squid-internal-static/icons/null.gif banners

    Также можно перенаправить на свой 1-пиксельный gif аналогичные файлы типа dumb.gif, 1x1.gif (прописав их в banners), которые по-прежнему встречаются на просторах интернета из-за вечно криворуких и бездарных озабоченных кроссбраузерностью верстки сайтостроителей: экономим лишние запросы к веб-серверу.

    Но мы сделали еще не всё. Осталось главное зло, идущее от счетчиков и рекламы — скрипты. Они часто весят больше, собственно, картинок, грузят браузер, иногда являются причиной длительного ожидания показа веб-страницы, шпионят за пользователями… Можно, конечно, банить всё и сразу по доменам баннерных сетей, но так мы получим загрузку пустого GIF-а вместо скрипта, или — стандартную HTML страницу «доступ запрещен», что тоже далеко не скрипт с т.з. синтаксиса — наши браузеры будут тихо или не очень (IE) ругаться на ошибки в javascript… Если мы не хотим этих ошибок — придется банить скрипты отдельно. Как вариант — делать это до вышеописанной директивы, выдающей 1-пиксельный GIF, но после «http_access deny banners»

    Для начала создаем ACL:
    acl js urlpath_regex -i \.js(\?.*)?$ (некоторые вредители, чтобы их js не кэшировался и мы каждый раз его качали, добавляют? и разный мусор после...)

    Теперь сам deny_info, идущий перед deny_info против картинок:
    deny_info TCP_RESET banners js (deny_info всегда смотрит на последний ACL!)

    Всё, перезагружаем конфиг и радуемся «умытым», без рекламы, быстро открывающимся страницам.
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 20
    • +1
      Вот еще бы пару ссылочек на готовые ACL…
      • 0
        Вот пожалуйста:

        Скрытый текст

        # Оключаем скачивание некоторых файлов и обрабатываем URL для резки баннеров,
        # параметр -i позволяет игнорировать регистр

        acl ROTABANNER url_regex -i rotabanner
        acl bad_exts url_regex -i .avi$ .mpeg$ .mpe$ .mov$ .mpg$ .qt$ .wav$ .wmv$ .3gp$
        acl BANNER url_regex -i radio proxy banner spylog hotlog reklama reclama linkexch ban

        # Подключаем внешние файлы с списком доменов для блокировок

        acl bad_sites dstdomain src "/usr/local/etc/squid/badsites"
        acl ads_sites dstdomain src "/usr/local/etc/squid/ads_sites"
        acl good_sites dstdomain src "/usr/local/etc/squid/good_sites"
        acl relax_sites dstdomain src "/usr/local/etc/squid/relaxsites"
        acl vid_sites dstdomain src "/usr/local/etc/squid/vid_sites"
        acl proxy_sites dstdomain src "/usr/local/etc/squid/proxy_sites"
        acl porno_sites dstdomain src "/usr/local/etc/squid/porno_sites"
        acl downsites dstdomain src "/usr/local/etc/squid/down_sites"

        # TAG: http_access
        #! знак означает что данные значения инвертируются, «ВСЕ КРОМЕ»

        http_access deny !Safe_ports
        http_access allow all good_sites
        http_access deny all ROTABANNER
        http_access deny all BANNER
        http_access deny all bad_sites
        http_access deny all ads_sites
        http_access deny all relax_sites
        http_access deny all bad_exts
        http_access deny all vid_sites
        http_access deny all proxy_sites
        http_access deny all porno_sites
        http_access deny all downsites


        Где /usr/local/etc/squid/badsites текстовые файлы вида:

        #CLink
        wma.energydanceradio.com
        .grizliki.ru
        .umora.ru
        .adultisp.net
        .nightdreams.ru
        .cliphoto.com
        .ultrasex.ru
        .otsos.ru
        .atas.ru
        .publichouse.ru
        .pupsik.ru

        и т.д. точка впереди домена означает резать и все поддомены этого домена.

        Каждый определяет сам для себя что резать.
      • 0
        вот если бы на базе сквида баннерорезку уровня Adblock…
        • +1
          Берешь из Adblock список фильтров, приводишь к виду, понятному Squid, получаешь искомое. Если хочешь обновлений — пишешь скрипт для sed и ставишь задачу на скачивание списка и конвертацию в крон.

          Плюс я где-то видел навеску для сквида, позволяющую добавлять адреса в список блокировок. Не так хорошо интегрировано, как в Adblock, но похоже.
          • 0
            Смотрел я такие обвески в свое время. К сожалению даже рядом не лежало по количеству вырезаемого.
            • +1
              Я выше написал — кто мешает парсить и использовать блок-листы от адблока? Тебе что нужно — списки блокируемого содержимого или возможность легко добавлять в блок-лист сайты самому?
              • +1
                Adblock же не только блокирует запросы из блеклистов, но и вырезает скрипты, ифреймы и пр.
                Просто элементы на страниц скрывать умеет.
                • 0
                  Да, например, многие так кнопку наверх на хабре убрали )
            • 0
              Dansguardian вам в помощь.
            • +2
              а squidGuard чем не устаивает?
            • 0
              Хорошая штука squid. На домашнем компьютере он у меня уже черт знает сколько стоит (основная задача — кэширование, т.к. интернет очень медленный был когда-то; сейчас интернет пошустрее и думаю уже от прокси отказаться). Вот только есть у squid'а недостаток: https и ftp кэшировать он не умеет без бубна.
              Ну, а заменять adBlock проксей смысла не вижу.
              • 0
                В офисе хорошо иметь двухуровневые кэш и баннерорезку. Общесетевой уровень — squid, на уровне браузера — усиленное кэширование и возможно дополнительные плагины против рекламы.
                • 0
                  А, ну для офиса — да. Т.к. народ 90% времени сидит во всяких соцсетях, есть смысл хорошенько банить рекламу, да и кэширование тут очень даже выручит.
                  А для корпоративных дистрибутивов вообще есть смысл локальное зеркало сделать.
                • 0
                  извините, что вы понимаете под «кэшированием https»?
                  • 0
                    Дешифровка и кэширование. Для этого, к сожалению, надо squid'у сертификат сделать (в общем, потратить некоторое время).
                    • 0
                      это по-моему в разрез основной идеи https «никто, кроме меня и тебя»
                • +2
                  ни в коем случае так не стоит делать. механизм acl в squid выполняет вызов в glibc на каждую запись в подобном банлисте.
                  используйте rejik.
                  • –1
                    Стоит сквид под виндой. Как выяснилось /squid-internal-static/icons/ вообще не отображаются. Хотя все пути в конфигах прописаны правильно. Никто не знает в чем может быть проблема?
                    • +1
                      Все оказалось просто :) IP надо было прописать 127.0.0.1 :)
                    • 0
                      Большое спасибо за статью, никогда не догадался, про squid-овый mime.conf, не смотря на документацию опций global_internal_static и icon_directory
                      По случаю добавлю:
                      Встроенный вебсервер включается/выключается опцией squid.conf global_internal_static.
                      Каталог с иконками определяется параметром icon_directory. Файл mime.conf - mime_table, у меня например он был /etc/squid/mime.conf

                      Типа так.
                      mime_table /etc/squid/mime.conf
                      global_internal_static on
                      icon_directory /etc/squid/icons

                      Я прикрутил rejik на сквид, вкачестве веба раньше использовал lighttpd, но теперь отказался от лишнего сервиса, хоть и легковесного в пользу squid-а. (а обычно народ использует squid+rejik+apache).

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.