В данной статье рассмотрена связка 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
...
Списки блокируемых сайтов на обеих машинах загружаются автоматически, но интерпретируются уже по разному.
Схема движения пакетов
Синяя — линия исходящий пакет
Зеленая — обратный пакет.
Автор: StreSS_t