Pull to refresh

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

Reading time3 min
Views19K
В данной статье рассмотрена связка 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

Основные настройки.
http_port 3129 tproxy disable-pmtu-discovery=off
...
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 на указанный сайт в случае если пользователь запросит один из запрещенных сайтов.

Остальные настройки в squid3 по вкусу.

Настройки на роутере


Эти настройки нам потребуется применить и к маршрутизатору.
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
Синяя — линия исходящий пакет
Зеленая — обратный пакет.
Tags:
Hubs:
Total votes 24: ↑8 and ↓16-8
Comments13

Articles