Страница 1 из 1

Реализация блокировки некошерной инфо с помощью Squid3

Добавлено: 03 фев 2022, 18:42
xor

Источник: https://forum.nag.ru/index.php?/topic/1 ... yu-squid3/

Реализация блокировки некошерной инфо с помощью Squid3

Для определенной группы абонентов с белыми адресами понадобилась более правильная реализация схемы блокировки, с подсовыванием мажорной странички, на которой всё расписано, почему нельзя и кто он по жизни.

Решили реализовать это схемой, где в конце будет tproxy от squid3. В клиентский vrf подгружаются маршруты /32 на некошерные ресурсы, где nexthop`ом будет адрес виртуалки с кваггой и сквидом, iptables заворачивает все пакеты с dst-port 80 на порт сквида. В сам сквид подгружается список с url`ми плохих парней и с помощью его acl - блокируются данные url. Ну, это вкратце о схеме, а теперь ниже, суть проблемы:

дальше сквида ничего не улетает и в логи сквида сыпятся сообщения, типа

TCP_MISS_ABORTED/000 0 GET http://blablabla_url
или

TCP_MISS/503 3745 GET http://blablabla_url
Более ничего криминального в логах сквида не появляется, бывает, что пролетает TCP_MISS/200 или 302, но не более и редко.

IPTABLES

Код: Выделить всё

echo 1 > /proc/sys/net/ipv4/ip_forward
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100 
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -F INPUT
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -F OUTPUT
/sbin/iptables -P FORWARD DROP
/sbin/iptables -F FORWARD
/sbin/iptables -F PREROUTING
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -F
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS  --clamp-mss-to-pmtu
/sbin/iptables -t mangle -N DIVERT
/sbin/iptables -t mangle -A DIVERT -j MARK --set-mark 1
/sbin/iptables -t mangle -A DIVERT -j ACCEPT
/sbin/iptables  -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129

И конфигурация сквида

Код: Выделить всё

cat /etc/squid3/squid.conf |grep -v -E "#|^$"
acl blocksites url_regex "/etc/squid3/block_url"
acl our_networks src x.x.x.x/21
http_access deny blocksites
acl SSL_ports port 443
acl CONNECT method CONNECT
acl GET method GET
acl POST method POST
cache deny all
dns_v4_first on
http_access allow our_networks CONNECT
http_access allow our_networks GET
http_access allow our_networks POST
http_access allow our_networks Safe_ports
http_access allow our_networks all
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all
http_port 0.0.0.0:3128
http_port 0.0.0.0:3129 tproxy
cache_dir ufs /var/spool/squid3 100 16 256
access_log daemon:/var/log/squid3/access.log squid
logfile_rotate 4
coredump_dir /var/spool/squid3
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .		0	20%	4320
deny_info http://url_to_denyinfo_page blocksites
nonhierarchical_direct off
dns_nameservers x.x.x.x y.y.y.y

Если, к примеру, клиент набирает url из некошерного списка

http://zepic.org/2013/04/loli-i-tentakli/
, то в логе сквида все хорошо,

TCP_DENIED/302 347 GET http://zepic.org/2013/04/loli-i-tentakli/ - HIER_NONE/- text/html
. Но, если набрать не блокированный адрес, http://zepic.org/, то через некоторое время ожидания сквид выдаст в лог

TCP_MISS/503 2451 GET http://zepic.org/ - HIER_DIRECT/104.28.8.117 text/html
и клиенту отдается страница с ошибкой.

С помощью tcpdump, на исходящем интерфейсе, было выяснено, что имеет место быть неверная контрольная сумма

Код: Выделить всё

tcpdump -i eth1 -vvvv host zepic.org
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
10:58:01.213056 IP (tos 0x0, ttl 64, id 65022, offset 0, flags [DF], proto TCP (6), length 60)
   ip216-194.isp_xxx.ru.49799 > 104.28.8.117.http: Flags [s], cksum 0x786d (incorrect -> 0xe0df), seq 2638483124, win 29200, options [mss 1460,sackOK,TS val 448197450 ecr 0,nop,wscale 7], length 0

Мужчины, что делать посоветуете? Пускать трафик этих абонентов через SCE нельзя, сразу говорю, для них делается минимальное количество узлов и устройств на пути следования трафика.

Код: Выделить всё

uname -a
Linux quagga 3.13.0-49-generic #83-Ubuntu SMP Fri Apr 10 20:11:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Код: Выделить всё

squid3 -v
Squid Cache: Version 3.3.8
Ubuntu
configure options:  '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' 
'--sysconfdir=/etc' '--localstatedir=/var' '--libexecdir=${prefix}/lib/squid3' '--srcdir=.' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silent-rules' 
'--datadir=/usr/share/squid3' '--sysconfdir=/etc/squid3' '--mandir=/usr/share/man' '--enable-inline' '--enable-async-io=8' '--enable-storeio=ufs,aufs,diskd,rock' 
'--enable-removal-policies=lru,heap' '--enable-delay-pools' '--enable-cache-digests' '--enable-underscores' '--enable-icap-client' '--enable-follow-x-forwarded-for'
'--enable-auth-basic=DB,fake,getpwnam,LDAP,MSNT,MSNT-multi-domain,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos,wrapper'
'--enable-auth-ntlm=fake,smb_lm' '--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,unix_group,wbinfo_group' 
'--enable-url-rewrite-helpers=fake' '--enable-eui' '--enable-esi' '--enable-icmp' '--enable-zph-qos' '--enable-ecap' '--disable-translation' 
'--with-swapdir=/var/spool/squid3' '--with-logdir=/var/log/squid3' '--with-pidfile=/var/run/squid3.pid' '--with-filedescriptors=65536' '--with-large-files' '--with-default-user=proxy' 
'--enable-linux-netfilter' 'build_alias=x86_64-linux-gnu'
'CFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall'
'LDFLAGS=-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' 'CPPFLAGS=-D_FORTIFY_SOURCE=2' 
'CXXFLAGS=-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security'


iptables v1.4.21

_____

времени прошло очень много, но как-то раз решение было найдено :)

В сквиде нет необходимости использовать опцию tproxy, как это делал я, достаточно

Код: Выделить всё

http_port $ip:3129 intercept

$ip это адрес интерфейса, который слушает squid

Ну и в iptables

Код: Выделить всё

/sbin/iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS  --clamp-mss-to-pmtu
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 3129
/sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE --random

Где eth1 является выходным интерфейсом. Не знаю, пригодится это кому или нет, пусть будет.