LINUX.ORG.RU
ФорумAdmin

squid + ssl bump

 , ,


2

2

Доброго дня. Ситуация такая - есть vps за бугром, есть домашняя сеть с ubuntu в качестве шлюза. Домашний шлюз и vps соединены openvpn туннелем. Хочется часть сайтов пускать через vps, так как есть ограничения и обходить их установкой на каждую машину vpn не подходит. А те ресурсы, которые не подпадают под «ограничения», чтобы работали напрямую.

squid подошел идеально, но, видимо, я его настроить нормально не могу и работает «кривенько». шлюз с ubuntu(далее просто ubuntu) имеет named, который форвардит запросы на 1.1.1.1 через туннель vps, чтобы в днс траф никто не лазил.

squid version:

squid --version
Squid Cache: Version 4.13
Service Name: squid
Ubuntu linux

This binary uses OpenSSL 1.1.1f  31 Mar 2020. For legal restrictions on distribution see https://www.openssl.org/source/license.html

configure options:  '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--disable-silent-rules' '--libdir=${prefix}/lib/x86_64-linux-gnu' '--runstatedir=/run' '--disable-maintainer-mode' '--disable-dependency-tracking' 'BUILDCXXFLAGS=-g -O2 -fdebug-prefix-map=/home/builder/ubuntu20/build/squid/squid-4.13=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now ' 'BUILDCXX=g++' '--with-build-environment=default' '--enable-build-info=Ubuntu linux' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid' '--libexecdir=/usr/lib/squid' '--mandir=/usr/share/man' '--enable-inline' '--disable-arch-native' '--enable-async-io=8' '--enable-storeio=ufs,aufs,diskd,rock' '--enable-removal-policies=lru,heap' '--enable-delay-pools' '--enable-cache-digests' '--enable-icap-client' '--enable-ssl' '--enable-follow-x-forwarded-for' '--enable-auth-basic=DB,fake,getpwnam,LDAP,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,time_quota,unix_group,wbinfo_group' '--enable-security-cert-validators=fake' '--enable-storeid-rewrite-helpers=file' '--enable-url-rewrite-helpers=fake' '--enable-eui' '--enable-esi' '--enable-icmp' '--enable-zph-qos' '--enable-ecap' '--disable-translation' '--with-swapdir=/var/spool/squid' '--with-logdir=/var/log/squid' '--with-pidfile=/run/squid.pid' '--with-filedescriptors=65536' '--with-large-files' '--with-default-user=proxy' '--enable-linux-netfilter' '--with-systemd' '--with-openssl' '--enable-ssl-crtd' 'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2 -fdebug-prefix-map=/home/builder/ubuntu20/build/squid/squid-4.13=. -fstack-protector-strong -Wformat -Werror=format-security -Wall' 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now ' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' 'CXXFLAGS=-g -O2 -fdebug-prefix-map=/home/builder/ubuntu20/build/squid/squid-4.13=. -fstack-protector-strong -Wformat -Werror=format-security'

на vps squid является parent proxy с конфигом:

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

shutdown_lifetime 5 seconds

dns_nameservers 1.1.1.1

http_port 3128
http_port 3129 intercept
https_port 1080 intercept cert=/etc/squid/cert/squidCA.pem ssl-bump

sslproxy_cert_error allow all
always_direct allow all

acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3


ssl_bump stare step2
ssl_bump bump step3


sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/ssl_db -M 4MB

access_log stdio:/var/log/squid/access.log squid
logfile_rotate 4

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy

acl authenticated proxy_auth REQUIRED
http_access allow authenticated

на ubuntu пакеты с 443 и 80-ых портов с помощью правил nftables перекидываются на squid:

table nat {
	chain prerouting {
		ip saddr 10.0.0.0/24 ip daddr != 10.0.0.0/24 tcp dport 80 counter redirect to 3129 comment "HTTP traffic"
		ip saddr 10.0.0.0/24 ip daddr != 10.0.0.0/24 tcp dport 443 counter redirect to 3130 comment "HTTPS traffic"
	}
}

на ubuntu squid настроен на просмотр доменов и в зависимости от домена: либо пускать напрямую запросы, либо через parent squid на vps:

acl SSL_ports port 443
acl SSL_ports port 1012 # for badssl.comm
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1012        # for badssl.com
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT


acl localnet src 10.0.0.0/24
dns_nameservers 127.0.0.1

debug_options ALL,2 28,9
shutdown_lifetime 5 seconds


acl rkn_domain dstdomain .ya.ru .facebook.com .instagram.com .mail.ru .fbcdn.net .linkedin.com

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny manager

http_access allow localnet
http_access allow localhost
http_access deny all

icp_access deny all 
htcp_access deny all


http_port 10.0.0.1:3128
http_port 10.0.0.1:3129 intercept
https_port 10.0.0.1:3130 intercept ssl-bump \
 options=ALL:NO_SSLv3:NO_TLSv1:NO_TLSv1_1:NO_TLSv1_2 \
 connection-auth=off \
 generate-host-certificates=on \
 dynamic_cert_mem_cache_size=4MB \
 tls-cert=/etc/squid/sslcert/squid.pem \
 tls-key=/etc/squid/sslcert/squid.key

sslproxy_cert_error allow all
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3

ssl_bump stare step2
ssl_bump bump step3


# http://www.squid-cache.org/Doc/config/cache_peer/
#                                        proxy  icp
#          hostname             type     port   port	options
#          -------------------- -------- -----	-----	-----------
cache_peer OPENVPN_IP		parent	 1080	0	proxy-only no-query default no-digest no-delay no-netdb-exchange

cache_peer_access OPENVPN_IP allow rkn_domain
cache_peer_access OPENVPN_IP deny !rkn_domain
never_direct allow rkn_domain



logformat self %{%Y.%m.%d/%H:%M:%S}tl %Ss %>Hs %rm %ru %Sh/%<A
logformat squid_full      %ts.%03tu %6tr %>A %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<A %mt



sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 4MB

access_log stdio:/var/log/squid/access_rkn.log squid_full rkn_domain
access_log stdio:/var/log/squid/access.log squid_full
#access_log none
cache_log /dev/null

# logfile_rotate 4
logfile_rotate 0

# Disable via and x-forwarded-for headers
via off
forwarded_for delete

netdb_filename none

Связка работает для instagram.com как нужно, но вот для linkedin.com не работает. Когда я вбиваю linkedin.com на машине из сети, то запись появляется в /var/log/squid/access.log, то есть либо домен не подошел под .linkedin.com,либо может squid не смог домен вытащить?

1653466922.169  30000 10.0.0.54 TCP_TUNNEL/200 0 CONNECT 13.107.42.14:443 - ORIGINAL_DST/13.107.42.14 -
  • ping
PING linkedin.com (13.107.42.14) 56(84) bytes of data.

Ну и 2-ой момент, не могу понять какой формат логов указать, чтобы мне в логах писались домены, а не IP адреса. Буду благодарен за советы!

Проблема в том, что ip-адрес который отрезолвил squid должен совпадать с ip-адресом на который устанавливается соединение.

Это реальная проблема для имен с коротким ttl.

Это проблема, если клиенты пользуются своими резолверами.

Для https соединения в лог пишется 2 строки. Первая всегда с ip-адресам, вторая с именем (по завершению соединения).

1653476958.310      0 10.4.76.120 NONE_NONE/000 0 CONNECT 93.186.227.142:443 xxxxx HIER_NONE/- -
1653476968.489  10178 10.4.76.120 TCP_TUNNEL/200 237782 CONNECT sun9-31.userapi.com:443 xxxxx ORIGINAL_DST/93.186.227.142 -

Если для имени sun9-31.userapi.com сквид не получит адрес 93.186.227.142, то сквид будет ругаться в логи и соединение не будет установлено.

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

Для домашнего использования можно пропатчить сквид (отключить эту проверку). Генерация подставных сертификатов тоже ненужна в домашних условиях. Учти, что некоторые особо умные программы могут самостоятельно проверять сертификаты.

vel ★★★★★ ()
Ответ на: комментарий от vel

Проблема в том, что ip-адрес который отрезолвил squid должен совпадать с ip-адресом на который устанавливается соединение.

у меня этой проблемы быть не должно, и squid и устройства в сети получают имена с 1-ого локального днс сервера. И я привел пример, что linkedin в лог и пинг попал с 1-м адресом.

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

я бы все-таки хотел добить бы именно прозрачный режим работы прокси.

Учти, что некоторые особо умные программы могут самостоятельно проверять сертификаты.

пока, насколько я понимаю, такие программы себя не проявили(их не использую), потому что пару недель уже эта схема проработала. Хочется допилить ее, чтобы уж все сайты поддерживались, а не только часть, которая пока не понятно как именно выбирается.(часть сайтов из списка работает, часть нет)

Graybit ()
Ответ на: комментарий от Graybit

для начала убедись, что ты можешь выполнить запрос через OPENVPN_IP:1080 со своего сквида.

Включи отладку для cache_peer и acl. Посмотри через кого выполняются запросы.

ORIGINAL_DST/13.107.42.14 говорит, что он напрямую идет.

vel ★★★★★ ()
Ответ на: комментарий от vel

для начала убедись, что ты можешь выполнить запрос через OPENVPN_IP:1080 со своего сквида. это работает. Включи отладку для cache_peer и acl. Посмотри через кого выполняются запросы. в логах видны сообщения, если обработка уходит через peer:

1653557277.378  61023 10.0.0.220 TCP_TUNNEL/200 5795 CONNECT static-exp1.licdn.com:443 - FIRSTUP_PARENT/OPENVPN_IP -

Понял, что для моей задачи слишком жирно влезать в https трафик с bump, поэтому step2 stare + step3 bump заменил на

ssl_bump peek step1
ssl_bump splice all

Это исправило проблему, что с частью сайтов не работала схема. Те сайты, что блокируются по IP адресам не могли ответить на клиентский запрос, соответственно до step2 вся схема не доходила. Сейчас я влезаю в обработку соединения раньше и на 1-ом же шаге смотрю куда запрос должен уходить, поэтому схема начала работать для тех сайтов, которые не работали раньше. Но появилась другая проблема - кальмар ругается и рвет соединения:

1653557277.629      1 10.0.0.220 NONE/409 3981 CONNECT www.instagram.com:443 - HIER_NONE/- text/html
1653557277.629      0 10.0.0.220 NONE/000 0 NONE error:transaction-end-before-headers - HIER_NONE/- -

Dns у меня стоит общий для машины в сети и ubuntu, а parent squid на vps смотрит напрямую на 1.1.1.1 днс. Проблема может быть в этом или что-то другое?

Graybit ()
Ответ на: комментарий от Graybit

Dns у меня стоит общий для машины в сети и ubuntu, а parent squid на vps смотрит напрямую на 1.1.1.1 днс. Проблема может быть в этом или что-то другое?

Вообще, не должно создавать проблемы, но хрен его знает.

Про невозможность установить соединение - сложный вопрос. Нужно включать отладку и смотреть причины. Там все может оказаться не так тривиально как кажется.

vel ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.