[Из песочницы] Фильтрация черного списка сайтов по URL
В данной статье рассмотрена связка Squid+TPROXY стоящий на отдельной машине. Как оказалось это тема почти не освещена на просторах интернета.По роду занятия возникла задача фильтрации черного списка сайтов от РОСКОМНАДЗОРА. В ходе проверки нам пригрозили что если мы это не сделаем то введут санкции. Сказано сделано (всего на несколько минут) тупая и не очень дружественная к нашим клиентам реализация, которая просто не давала доступа ко всем сайтам внесенным в черный список. При этом фильтрация была просто по IP. И естественно перекрывала доступ ко всем сайтам на IP.
Нужно было переделывать, да еще и грамотно переделывать. Во первых это не красиво/коряво, во вторых задача сама по себе очень интересная.В этой статье я не буду рассказывать как настроить автоматическое получение этого списка. Скажу лишь одно, я не стал заморачиваться с постоянным подписывание запроса, а сделал это один раз на компьютере с установленным ПО и ключом.
Начнем с машины с установленным Squid3. Почти все настройки были взяты из официального Squid+TPROXY ip -f inet rule add fwmark 1 lookup 100 ip -f inet route add local default dev eth0 table 100 cat /etc/sysctl.conf: … net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.eth0.rp_filter = 0 Чтобы мы могли определить какой трафик уже прошел проверку, а кой нет мы создаем отдельный VLAN, в нашем случае 5, для исходящих пакетов. Напомню что в режиме TPROXY IP у адреса источника не меняется. default via 192.168.70.2 dev eth0.5 192.168.1.35/25 dev eth0 proto kernel scope link src 192.168.1.36 192.168.70.0/30 dev eth0.5 proto kernel scope link src 192.168.70.1 Правила iptables iptables -t mangle -N DIVERT iptables -t mangle -A DIVERT -j MARK --set-mark 1 iptables -t mangle -A DIVERT -j ACCEPT Чтобы уже существующие соединения не попадали в правило TPROXY iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT Собственно само правило TPROXY iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0×1/0×1 --on-port 3129 Остальные настройки в squid3 по вкусу. acl bad_urls url_regex »/etc/squid3/bad_hosts.list»
http_access deny bad_urls http_access allow localnet deny_info http://www.somehost.ru bad_urls Последняя строка в конфиге сделает REDIRECT на указанный сайт в случае если пользователь запросит один из запрещенных сайтов.Настройки на роутере Эти настройки нам потребуется применить и к маршрутизатору. cat /etc/sysctl.conf: … net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.eth0.rp_filter = 0 Естественно включен NAT серых подсетей.Создаем цепочку в которой будем производиться фильтрацию
iptables -t mangle -F DIVERT В этой цепочке будем маркировать все пакеты у которых исходящий или порт назначения 80 (только при написании статьи понял что указания портов здесь лишние, но оставил, вдруг кому так легче понять) iptables -t mangle -A DIVERT! -i eth1.5 -p tcp --dport 80 -j MARK --set-mark 1 iptables -t mangle -A DIVERT! -i eth1.5 -p tcp --sport 80 -j MARK --set-mark 1 Отправим в эту цепочку все пакеты у которых адреса источника или назначение 80 при этом эти пакеты мы получили не из 5 VLAN (может кто подскажет почему в этом случае соединение не трассируется и приходится делать обратную проверку) iptables -t mangle -A PREROUTING! -i eth1.5 -p tcp -m set --match-set badip dst -m tcp --dport 80 -j DIVERT iptables -t mangle -A PREROUTING! -i eth1.5 -p tcp -m set --match-set badip src -m tcp --sport 80 -j DIVERT Создаем правило которое в случае если на пакете стоит метка 1 отправит его в 101 таблицу маршрутизации ip rule add fwmark 1 lookup 101 Собственно сама таблица маршрутизации ip route list table 101 default via 192.168.1.35 dev eth1.3 И на последок. Вот так у нас сформирован список плохих сайтов create badip hash: ip ipset flush badip ipset add badip 111.111.111.111 ipset add badip 2.2.2.2 … Списки блокируемых сайтов на обеих машинах загружаются автоматически, но интерпретируются уже по разному.
Схема движения пакетов
Синяя — линия исходящий пакетЗеленая — обратный пакет.
