Вопрос или проблема
Окончательное обновление: в итоге я использовал
nginx
, так какsquid
оказалось трудно работать, см. последнее обновление в конце для более подробной информации
Что я пытаюсь сделать, так это настроить прозрачный HTTPS-прокси с помощью squid, используя SNI (без расшифровки), но это не работает.
Я не знаю, что я делаю не так, буду признателен за вашу помощь.
События, произошедшие во время ведения журнала:
HTTP-запрос
curl -v http://example.com
* Trying 127.0.0.1:80...
* Connected to example.com (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.82.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Age: 512560
< Cache-Control: max-age=604800
< Content-Type: text/html; charset=UTF-8
< Date: Sun, 11 Jun 2023 15:28:56 GMT
< ETag: "3147526947+ident"
< Expires: Sun, 18 Jun 2023 15:28:56 GMT
< Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
< Server: ECS (bsa/EB17)
< Vary: Accept-Encoding
< X-Cache: HIT
< Content-Length: 1256
< X-Cache: MISS from eb91c8aa314b
< X-Cache-Lookup: MISS from eb91c8aa314b:3128
< Via: 1.1 eb91c8aa314b (squid/5.7)
< Connection: keep-alive
HTTPS-запрос
curl -v https://example.com
* Trying 127.0.0.1:443...
* Connected to example.com (127.0.0.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* CApath: none
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
Для HTTPS он зависает.
squid.conf:
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN)
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
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
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
include /etc/squid/conf.d/*.conf
# http_access allow localhost
# http_access deny all
# http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
# ---------------------- Added configs ----------------------
http_access allow all
# always_direct allow all
# Squid kept crashing and after checking out the logs and searching, I found following bug report
# which in first comment there was some suggested workarounds one of them was setting a value for max_filedescriptors
# https://bugs.launchpad.net/ubuntu-docker-images/+bug/1978272
max_filedescriptors 1048576
# transparent proxy for http
http_port 3128 accel vhost allow-direct
# transparent proxy for https
acl step1 at_step SslBump1
# acl step2 at_step SslBump2
# acl step3 at_step SslBump3
ssl_bump peek step1
ssl_bump splice all
# ssl_bump bump
https_port 3129 intercept ssl-bump cert=/etc/squid/squid.pem
access.log:
1686498023.786 671 172.17.0.1 TCP_MISS/304 436 GET http://example.com/ - HIER_DIRECT/93.184.216.34 -
1686498025.905 0 172.17.0.1 NONE_NONE/000 0 - error:accept-client-connection - HIER_NONE/- -
cache.log:
2023/06/11 15:40:17 kid1| Set Current Directory to /var/spool/squid
2023/06/11 15:40:17 kid1| Starting Squid Cache version 5.7 for x86_64-pc-linux-gnu...
2023/06/11 15:40:17 kid1| Service Name: squid
2023/06/11 15:40:17 kid1| Process ID 9
2023/06/11 15:40:17 kid1| Process Roles: worker
2023/06/11 15:40:17 kid1| With 1048576 file descriptors available
2023/06/11 15:40:17 kid1| Initializing IP Cache...
2023/06/11 15:40:17 kid1| DNS Socket created at 0.0.0.0, FD 8
2023/06/11 15:40:17 kid1| Adding nameserver 1.1.1.1 from /etc/resolv.conf
2023/06/11 15:40:17 kid1| Adding nameserver 8.8.8.8 from /etc/resolv.conf
2023/06/11 15:40:17 kid1| Adding nameserver 9.9.9.9 from /etc/resolv.conf
2023/06/11 15:40:17 kid1| Adding domain . from /etc/resolv.conf
2023/06/11 15:40:17 kid1| helperOpenServers: Starting 5/32 'security_file_certgen' processes
2023/06/11 15:40:17 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2023/06/11 15:40:17 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2023/06/11 15:40:17 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2023/06/11 15:40:17 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2023/06/11 15:40:17 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2023/06/11 15:40:17 kid1| Logfile: opening log daemon:/var/log/squid/access.log
2023/06/11 15:40:17 kid1| Logfile Daemon: opening log /var/log/squid/access.log
2023/06/11 15:40:17 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2023/06/11 15:40:17 kid1| Local cache digest enabled; rebuild/rewrite every 3600/3600 sec
2023/06/11 15:40:17 kid1| Store logging disabled
2023/06/11 15:40:17 kid1| Swap maxSize 0 + 262144 KB, estimated 20164 objects
2023/06/11 15:40:17 kid1| Target number of buckets: 1008
2023/06/11 15:40:17 kid1| Using 8192 Store buckets
2023/06/11 15:40:17 kid1| Max Mem size: 262144 KB
2023/06/11 15:40:17 kid1| Max Swap size: 0 KB
2023/06/11 15:40:17 kid1| Using Least Load store dir selection
2023/06/11 15:40:17 kid1| Set Current Directory to /var/spool/squid
2023/06/11 15:40:17 kid1| Finished loading MIME types and icons.
2023/06/11 15:40:17 kid1| HTCP Disabled.
2023/06/11 15:40:17 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted
2023/06/11 15:40:17 kid1| Pinger socket opened on FD 24
2023/06/11 15:40:17 kid1| Squid plugin modules loaded: 0
2023/06/11 15:40:17 kid1| Adaptation support is off.
2023/06/11 15:40:17 kid1| Accepting reverse-proxy HTTP Socket connections at conn12 local=0.0.0.0:3128 remote=[::] FD 21 flags=9
2023/06/11 15:40:17 kid1| Accepting NAT intercepted SSL bumped HTTPS Socket connections at conn14 local=0.0.0.0:3129 remote=[::] FD 22 flags=41
2023/06/11 15:40:17| WARNING: BCP 177 violation. Detected non-functional IPv6 loopback.
2023/06/11 15:40:17| pinger: Initialising ICMP pinger ...
2023/06/11 15:40:17| pinger: ICMP socket opened.
2023/06/11 15:40:17| pinger: ICMPv6 socket opened
2023/06/11 15:40:18 kid1| storeLateRelease: released 0 objects
2023/06/11 15:40:25 kid1| ERROR: NF getsockopt(ORIGINAL_DST) failed on conn23 local=172.17.0.2:3129 remote=172.17.0.1:57978 FD 14 flags=33: (2) No such file or directory
listening port: 3129
2023/06/11 15:40:25 kid1| ERROR: NAT/TPROXY lookup failed to locate original IPs on conn23 local=172.17.0.2:3129 remote=172.17.0.1:57978 FD 14 flags=33
listening port: 3129
Среда:
Я запускаю squid внутри контейнера Docker с опубликованными портами 80:3128 и 443:3129
Host: Fedora 37
Docker version: 24.0.2
Docker image: my_own_dockerfile and ghcr.io/b4tman/squid-ssl-bump (tired both)
Squid version: 5.7 (squid-openssl debian package)
Изображение squid-ssl-bump
взято от b4tman@github
Я пробовал оба изображения, но получил тот же результат, также пробовал вне docker, и результаты были такими же.
Мой docker файл:
FROM debian:bookworm-slim
RUN apt-get update \
&& apt-get install -y squid-openssl \
&& rm -rf /var/lib/apt/lists/*
RUN /usr/lib/squid/security_file_certgen -c -s /var/spool/squid/ssl_db -M 4MB
RUN touch /run/squid.pid && chmod o=rw /run/squid.pid
USER proxy
EXPOSE 3128 3129
CMD ["squid","--foreground"]
Тестирование:
Я использовал /etc/hosts для направления определенного домена (example.com) на 127.0.0.1 (только для тестирования) и использовал curl и firefox для проверки результата.
В итоге:
цель: Иметь squid в качестве прозрачного HTTPS-прокси с использованием SNI (с расшифровкой трафика).
нецель: Расшифровывать HTTPS-трафик и установить сертификат на клиенте.
проблема: Это не работает (для HTTPS) в моем случае, и поиск ошибок, которые отображаются в журналах, не очень помогает.
P.S. У меня очень ограниченные знания о сетях.
Обновление 1:
По предложению в комментариях, что это может быть связано с docker, я провел больше испытаний вне docker.
Я тестировал на fedora 37 в качестве основной машины и на debian 11 сервере
Среда Fedora 37:
squid version: 5.8 (squid package on fedora)
Среда Debian 11:
squid version: 4.13 (squid-openssl package on debian)
Результаты были почти одинаковыми в обоих случаях, и цель не была достигнута, однако журнал отличался от docker.
Вот конфигурационные и журнальные файлы на fedora:
squid.conf
#
# Recommended minimum configuration:
#
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN)
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
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
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny to_localhost
http_access deny to_linklocal
# For example, to allow access from your local networks, you may uncomment the
# following rule (and/or add rules that match your definition of "local"):
# http_access allow localnet
#http_access deny all
#http_port 3128
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
# ---------------------- Added configs ----------------------
http_access allow all
# always_direct allow all
# Squid kept crashing and after checking out the logs and searching, I found following bug report
# which in first comment there was some suggested workarounds one of them was setting a value for max_filedescriptors
# https://bugs.launchpad.net/ubuntu-docker-images/+bug/1978272
#max_filedescriptors 1048576
# transparent proxy for http
http_port 80 accel vhost allow-direct
# transparent proxy for https
acl step1 at_step SslBump1
# acl step2 at_step SslBump2
# acl step3 at_step SslBump3
ssl_bump peek step1
ssl_bump splice all
https_port 443 intercept ssl-bump cert=/etc/squid/squid.pem
access.log
1686566705.397 869 127.0.0.1 TCP_MISS/200 1708 GET http://example.com/ - HIER_DIRECT/93.184.216.34 text/html
1686567418.039 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.039 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.039 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.040 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.040 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.040 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.040 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.041 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.041 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.041 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.042 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.042 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.042 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.042 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.043 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.043 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.043 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.044 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.044 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.044 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.044 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.045 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.045 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.045 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.046 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567418.046 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
.........
1686567420.514 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567420.514 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567420.514 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
1686567420.515 0 127.0.0.1 NONE_NONE/000 0 CONNECT 127.0.0.1:443 - HIER_NONE/- -
cache.log
2023/06/12 14:14:10 kid1| Set Current Directory to /var/spool/squid
2023/06/12 14:14:10 kid1| Starting Squid Cache version 5.8 for x86_64-redhat-linux-gnu...
2023/06/12 14:14:10 kid1| Service Name: squid
2023/06/12 14:14:10 kid1| Process ID 20583
2023/06/12 14:14:10 kid1| Process Roles: worker
2023/06/12 14:14:10 kid1| With 16384 file descriptors available
2023/06/12 14:14:10 kid1| Initializing IP Cache...
2023/06/12 14:14:10 kid1| DNS Socket created at [::], FD 8
2023/06/12 14:14:10 kid1| DNS Socket created at 0.0.0.0, FD 9
2023/06/12 14:14:10 kid1| Adding nameserver 127.0.0.53 from /etc/resolv.conf
2023/06/12 14:14:10 kid1| Adding domain . from /etc/resolv.conf
2023/06/12 14:14:10 kid1| helperOpenServers: Starting 5/32 'security_file_certgen' processes
2023/06/12 14:14:10 kid1| Logfile: opening log daemon:/var/log/squid/access.log
2023/06/12 14:14:10 kid1| Logfile Daemon: opening log /var/log/squid/access.log
2023/06/12 14:14:10 kid1| Local cache digest enabled; rebuild/rewrite every 3600/3600 sec
2023/06/12 14:14:10 kid1| Store logging disabled
2023/06/12 14:14:10 kid1| Swap maxSize 0 + 262144 KB, estimated 20164 objects
2023/06/12 14:14:10 kid1| Target number of buckets: 1008
2023/06/12 14:14:10 kid1| Using 8192 Store buckets
2023/06/12 14:14:10 kid1| Max Mem size: 262144 KB
2023/06/12 14:14:10 kid1| Max Swap size: 0 KB
2023/06/12 14:14:10 kid1| Using Least Load store dir selection
2023/06/12 14:14:10 kid1| Set Current Directory to /var/spool/squid
2023/06/12 14:14:10 kid1| Finished loading MIME types and icons.
2023/06/12 14:14:10 kid1| HTCP Disabled.
2023/06/12 14:14:10 kid1| Squid plugin modules loaded: 0
2023/06/12 14:14:10 kid1| Adaptation support is off.
2023/06/12 14:14:10 kid1| Accepting reverse-proxy HTTP Socket connections at conn13 local=[::]:80 remote=[::] FD 22 flags=9
2023/06/12 14:14:10 kid1| Accepting NAT intercepted SSL bumped HTTPS Socket connections at conn15 local=[::]:443 remote=[::] FD 23 flags=41
2023/06/12 14:14:11 kid1| storeLateRelease: released 0 objects
2023/06/12 14:27:00 kid1| WARNING! Your cache is running out of filedescriptors
listening port: 443
Тестирование:
Так как squid работал на хостовой ОС, я не мог использовать /etc/hosts
(чтобы предотвратить циклические обращения), я тестировал с помощью curl -x
.
HTTP:
curl -x http://127.0.0.1:80 -v http://example.com
* Trying 127.0.0.1:80...
* Connected to (nil) (127.0.0.1) port 80 (#0)
> GET http://example.com/ HTTP/1.1
> Host: example.com
> User-Agent: curl/7.82.0
> Accept: */*
> Proxy-Connection: Keep-Alive
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Age: 370504
< Cache-Control: max-age=604800
< Content-Type: text/html; charset=UTF-8
< Date: Mon, 12 Jun 2023 10:45:05 GMT
< ETag: "3147526947+ident"
< Expires: Mon, 19 Jun 2023 10:45:05 GMT
< Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
< Server: ECS (nyb/1D20)
< Vary: Accept-Encoding
< X-Cache: HIT
< Content-Length: 1256
< X-Cache: MISS from fedora
< X-Cache-Lookup: MISS from fedora:80
< Via: 1.1 fedora (squid/5.8)
< Connection: keep-alive
HTTPS:
curl -x https://127.0.0.1:443 -v https://example.com
* Trying 127.0.0.1:443...
* Connected to (nil) (127.0.0.1) port 443 (#0)
* ALPN, offering http/1.1
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* CApath: none
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* SSL connection timeout
* Operation timed out after 300000 milliseconds with 0 bytes received
* Closing connection 0
curl: (28) SSL connection timeout
Обновление 2:
Я выполнил шаги, которые @tegan-yorek предложил добавить cache
в мой squid.conf:
cache_dir ufs /var/squidcache 100 16 256
ipcache_size 2048
fqdncache_size 2048
но появилось множество новых ошибок.
У меня была рабочая настройка nginx
, которая решила мою проблему, поэтому я не стал искать решение для ошибок.
Окончательное обновление:
Поскольку оказалось, что squid трудно работать, я в итоге искал альтернативы
И я нашел nginx's
ngx_stream_ssl_preread_module, который сделал то, что мне нужно.
Поскольку я не смог заставить squid работать, я оставлю этот вопрос без принятого ответа, спасибо всем за помощь.
Попробуйте поставить ваш https_port 3129
выше вашей конфигурации ssl_bump
. Также, не работая с squid внутри docker, я всегда настраивал свой https_port
с интерцепцией, что требует переадресации с 443
.
Пример:
#https_port 443 cert=/xyz
#https_port 3129 intercept ssl-bump cert=/xyz
ssl_bump peek step1
ssl_bump splice all
Так что после некоторых испытаний, к сожалению, на Ubuntu, а не на Fedora, я пришел к следующему. Ssl_bump peek step1 ssl_bump splice все. Что я обнаружил, так это что squid сбрасывала соединение, потому что CDN-хостингомые веб-сайты вызывали обнаружение подделки заголовков хоста. Мой обходной путь заключался в добавлении отдельного кэша, а затем добавлении ipcache_size и fqdncache_size ниже второй строки кэша. Ipcache само за себя объясняет, fqdn кэширует доменное имя IP-адреса сервера. Что происходит, так это что клиентская машина получает один IP-адрес, а squid-proxy получает другой IP-адрес, что затем вызывает обнаружение подделки заголовков хоста.
Обновление, чтобы помочь с обходным путём squid sni.
В файле конфигурации squid установите другую строку кэша.
cache_dir aufs /route/to/cache 2000 16 256
Затем ниже этого добавьте.
ipcache_size # любой единичный размер MB/KB/B
fqdncache_size # любой единичный размер MB/KB/B
Затем добавьте эти две другие строки.
positive_dns_ttl # любая единица времени час/минут/сек
negative_dns_ttl # также любая единица времени.
Примечание, что при отсутствии установки размера хранилища squid автоматически установит значение по умолчанию в байтах. Также держите negative_dns_ttl меньше, чем positive, я установил свой на 1 минуту. Как только конфигурации установлены в файле, остановите squid с помощью sudo service squid stop. Создайте директорию для назначенного кэша в конфигурации, sudo mkdir -p /path/to/cache. Затем дайте squidu право собственности с помощью sudo chmod proxy:proxy /path/to/cache. В зависимости от дистрибутива Linux, пользователем может быть squid. Proxy является значением по умолчанию в Ubuntu. Затем выполните другую команду, чтобы инициализировать кэш sudo squid -z. Затем перезапустите squid с помощью sudo service squid restart. Проверьте свои журналы, вы увидите множество ошибок: error:transaction-end-before-headers, но со временем они начнут утихать.
Я знаю, что прошло много времени, но хотел обновить его для будущей ссылки и для других, кто сталкивается с аналогичными проблемами.
.
Ответ или решение
Настройка прозрачного HTTPS-прокси с использованием Squid и SNI (Server Name Indication) — довольно сложная задача, особенно если вы хотите сохранить трафик зашифрованным и отказаться от раскрытия содержимого сессии. Учитывая последствия этой конфигурации, стоит понять теорию, примеры и применение данной технологии.
Теория
SNI и HTTPS-прокси:
SNI (Server Name Indication) позволяет серверу идентифицировать несколько доменных имен на одном IP-адресе и сертификате SSL/TLS. При использовании Squid для проксирования трафика через HTTPS с SNI становится возможно фильтровать или контролировать трафик без расшифровки, показа и утраты содержания передачи данных.
Проблемы с прозрачным прокси:
Прозрачный проксирование включает в себя перенаправление трафика на прокси-сервер незаметно для пользователя. Обычно используется для HTTP-трафика, поскольку HTTPS предъявляет особые требования к проксированию из-за шифрования. Проблемы передтапливания шифрованных данных становятся очевидны, когда необходимо поддерживать сессионное состояние и безопасное соединение без раскрытия пользовательских данных.
В случае ошибок подключения, таких как описано в вашем вопросе — зависание HTTPS-соединении с Squid, — это может быть вызвано различными факторы, включая неправильную настройку конфигурации, вопросы связанные с оригинальной дирекцией IP, а также проблемы в инфраструктуре контейнеров Docker.
Пример
Опыт работы с подобной архитектурой показал, что для успешной настройки прозрачного HTTPS-прокси с использованием Squid критически важна правильная конфигурация и понимание, когда и где объект данных должен быть раскрыт (Peek) или оставлен в шифрованном виде (Splice).
Пример конфигурации может выглядеть следующим образом:
# Настройка https_port для обработки перехвата
https_port 3129 intercept ssl-bump cert=/etc/squid/squid.pem
# Имена шагов
acl step1 at_step SslBump1
# Определение "peek" и "splice" действий
ssl_bump peek step1
ssl_bump splice all
Применение
Конфигурация и проверка:
-
Изучение конфигурации: Первыми шагами для устранения проблем с настройкой являются тщательная проверка файлы конфигурации
squid.conf
, удостоверившись, что директивы следуют правильному семантическому порядку. Расположениеhttps_port
перед конфигурациейssl_bump
может иметь решающее значение. -
Сетевые проверки: Убедиться, что NAT и маршрутизация настроены корректно, чтобы Squid мог видеть оригинальный IP-адрес тела сообщения, а не только адрес переадресации.
-
Кэширование и DNS: Убедитесь, что настройки связанные с DNS и кэшированием находятся в порядке, поскольку некорректные кэшированные данные могли вызвать ошибки в заголовках host.
-
Проверка в других условиях: Если возможна работа без контейнеров или в других операционных системах, это может выявить проблемы, связанные с специфичностью оригинальной среды контейнеров.
-
Мониторинг и логирование: Изучение файлов логов позволяло бы получиться на зоны, где по сути возникают ошибки. При настройке Squid в вашей архитектуре системы, это может открыть глаза на ошибки в конфигурациях или политике фильтрации.
-
Альтернативный подход: Если препятствия продолжаются, поиск альтернатив может оказаться полезным, как например использование
nginx
c модулемngx_stream_ssl_preread_module
, который зарекомендовал себя как более простой способ обработки трафика без расшифровки.
Ваш успешный переход на nginx
подчеркивает сложность работы с Squid, позволяя сделать выводы об особенностях и трудностях манипуляции HTTPS без расшифровки. Стоит учесть, что несмотря на то, что изначальные задачи не удалось полностью реализовать с Squid, альтернативные решения оказались более удобными и менее трудозатратными при внедрении.