Фильтрация черного списка сайтов по URL

в 11:47, , рубрики: iproute2, iptables, linux, Сетевые технологии, метки: , ,

В данной статье рассмотрена связка 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 0x1/0x1 --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
...

Списки блокируемых сайтов на обеих машинах загружаются автоматически, но интерпретируются уже по разному.

Схема движения пакетов

image
Синяя — линия исходящий пакет
Зеленая — обратный пакет.

Автор: StreSS_t

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js