Table of Contents

Рабочий вариант Squid transparent proxy с поддержкой SSL без подмены сертификатов

По мотивам https://habr.com/ru/post/267851/
Собираю на Ubuntu 19.04.
Вот пакеты, собранные на Ubuntu 19.04 x64 - squid_4.4_transparent_ssl_ubuntu19.04_x64.tar.gz
Для начала - включаем deb-src репозитории в /etc/apt/sources.list
Ставим запчасти для сборки и исходники squid:

sudo apt-get update
sudo apt-get install git fakeroot build-essential devscripts checkinstall
sudo apt-get build-dep squid
sudo apt-get build-dep libecap
sudo apt-get install libssl-dev libgnutls28-dev

Сборка LibreSSL - не обязательно

Скачиваем, собираем и ставим LibreSSL:

wget http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.9.2.tar.gz
tar -xvf ./libressl-2.9.2.tar.gz 
cd libressl-2.9.2/

./configure 
make
sudo checkinstall --pkgname libressl --pkgversion 2.9.2
sudo dpkg -i ./libressl_2.9.2-1_amd64.deb

sudo ldconfig

sudo mv /usr/bin/openssl /usr/bin/openssl-1
sudo update-alternatives --install /usr/bin/openssl openssl /usr/bin/openssl-1 10
sudo update-alternatives --install /usr/bin/openssl openssl /usr/local/bin/openssl 50
sudo update-alternatives --config openssl

Проверяем, что LibreSSL поставился:

$ openssl version
LibreSSL 2.9.2

Сборка libecap

cd ..
apt-get source libecap

cd libecap-1.0.1/
dpkg-buildpackage -us -uc -nc -d
cd ..
sudo apt-get purge libecap3
sudo dpkg -i ./libecap3_1.0.1-3.2_amd64.deb
sudo dpkg -i ./libecap3-dev_1.0.1-3.2_amd64.deb

Сборка Squid с поддержкой ssl_bump

apt-get source squid  
cd squid-4.4/

внесем в debian/rules следующие опции компиляции:

  --enable-ssl
  --enable-ssl-crtd
  --with-openssl

Отключаем проверку зависимостей:

export DEB_DH_SHLIBDEPS_ARGS_ALL=--dpkg-shlibdeps-params=--ignore-missing-info

Собираем:

dpkg-buildpackage -us -uc -nc

Установка собранного squid

Удаляем старый squid и squid-common:

sudo apt-get -y purge squid squid-common squid3 squidclient

Устанавливаем свежесобранные пакеты:

sudo apt-get install squid-langpack libdbi-perl
sudo dpkg -i ../squid_4.4*.deb ../squidclient*.deb ../squid-common*.deb ../squid3_*_all.deb
sudo dpkg -i ../squid_4.4*.deb ../squidclient*.deb ../squid-common*.deb ../squid3_*_all.deb

Запрещаем обновление из репозиториев:

echo "squid hold" | sudo dpkg --set-selections
echo "squid-common hold" | sudo dpkg --set-selections
echo "squid3 hold" | sudo dpkg --set-selections
echo "squidclient hold" | sudo dpkg --set-selections

Настройка squid

Инициализируем базу сертификатов:

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

Прописываем в конфигурационный файл squid'а такое:

acl localnet src 192.168.0.0/16         #local Networks
acl pvenet src 192.168.122.0/24         #Proxmox local network
acl dockernet src 172.0.0.0/8           #Docker containers

acl SSL_ports port 443
acl CONNECT method CONNECT

dns_nameservers 127.0.0.53

http_access deny CONNECT !SSL_ports

#http_access allow localhost manager
#http_access deny manager

http_access allow localnet
http_access allow dockernet
http_access allow pvenet
http_access allow localhost
#http_access allow all

#transparent HTTP proxy (option intercept)
http_port 3128 intercept

visible_hostname 127.0.0.1:80

#transparent HTTPS proxy
https_port 3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squid-ca-cert-key.pem

sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER

# ssl_bump option splice just tunneling connection
ssl_bump splice all

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

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
cache_dir aufs /var/spool/squid 20000 49 256
maximum_object_size 61440 KB
minimum_object_size 3 KB

cache_swap_low 90
cache_swap_high 95
maximum_object_size_in_memory 512 KB
memory_replacement_policy lru
logfile_rotate 4

cache_peer 10.77.70.7 parent 3128 0 no-query default login=login:password
#login=PASSTHRU
#login=username:password
never_direct allow all

перезапускаем squid:

sudo service squid restart  

настройка iptables

Перенаправляем все локальные исходящие подключения к портам 80 и 443 на локальный squid, за исключением локальных подключений и подключений к локальным сетям:

sudo iptables -t nat -A PREROUTING -d 10.77.0.0/16 -j RETURN
sudo iptables -t nat -A PREROUTING -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A PREROUTING -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3129

Устанавливаем iptables-persistent для автоматического применения правил после рестара:

sudo apt-get install iptables-persistent

на вопрос о сохранении текущих правил отвечаем положительно. Правила лежат в файлике /etc/iptables/rules.v4.
В дальнейшем сохраняем правила так:

sudo iptables-save | sudo tee /etc/iptables/rules.v4