Мои требования:
- Прокси-сервер должен быть прозрачным.
- Я должен иметь возможность фильтровать сайты по доменному имени.
- Я делаюнетхочу расшифровать трафик. Я ищу решение на основе сниффинга SNI — без установки сертификатов на клиентах.
Существует множество ответов, но они либо неверны (утверждают, что для этого нужно расшифровать трафик), либо неполны.
решение1
Для этого можно использовать функцию ssl peek, представленную в Squid 3.5. См.здесьдля подробного объяснения. Обратите внимание, что вам нужно будет скомпилировать с помощью --with-gnutls
или --with-openssl
(отметьте squid -v
). Некоторые дистрибутивы их не включают.
Короче говоря, соответствующая конфигурация Squid выглядит так.
acl denylist_ssl ssl::server_name google.com # NOT dstdomain
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump splice !denylist_ssl # allow everything not in the denylist
ssl_bump terminate all # block everything else
https_port 3129 intercept ssl-bump cert=/etc/squid/dummy.pem
(Отступление: я не уверен, почему нам нужно заглянуть только в шаг 1, а не в шаг 2, учитывая, что шаг 2 включает в себя только получение сертификата сервера. В документации это вообще не разъясняется. Использование ssl_bump peek all
в соответствии с их рекомендациями полностью прекращает работу).
А затем выполните обычную операцию перенаправления порта 443 на порт 3129 с помощью iptables (или заставьте Squid прослушивать порт 443 напрямую, если вам так удобнее).
-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3129
В качестве фиктивного сертификата можно использовать любой, на самом деле мы его никогда не используем (потому что не расшифровываем трафик).
Что-то вроде этого работает.
openssl req -new -newkey rsa:4096 -sha256 -days 365 -nodes -x509 -keyout dummy.pem -out dummy.pem
Источники: