SNI フィルタリングを備えた squid を使用して HTTPS を透過的にトンネリングする

SNI フィルタリングを備えた squid を使用して HTTPS を透過的にトンネリングする

私の要件は次のとおりです:

  1. プロキシは透過的である必要があります。
  2. ドメイン名でウェブサイトをフィルタリングできるはずです。
  3. 私はしますないトラフィックを復号化したい。クライアントに証明書をインストールしない、SNI スニッフィング ベースのソリューションを探しています。

たくさんの回答が出回っていますが、それらは間違っているか(これを行うにはトラフィックを復号化する必要があると主張している)、不完全です。

答え1

これを実現するには、Squid 3.5で導入されたSSLピーク機能を使用します。ここ詳細な説明については、 を参照してください。 または--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

(余談ですが、ステップ 2 ではサーバー証明書の受信のみが行われるのに、なぜステップ 1 だけをチェックする必要があり、ステップ 2 をチェックする必要がないのかはわかりません。ドキュメントではこの点がまったく明確にされていません。ドキュメントssl_bump peek allの推奨どおりに使用すると、完全に機能しなくなります)。

次に、iptables を使用して通常のポート 443 から 3129 へのリダイレクトを実行します (または、必要に応じて 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

出典:

[1]https://unix.stackexchange.com/questions/613359/setting-up-squid-transparent-proxy-with-ssl-bumping-on-debian-10

[2]https://web.archive.org/web/20210128152111/https://www.cammckenzie.com/blog/index.php/2018/07/19/squid-https-interception-and-filtering-without-client-certificates/

[3]https://wiki.squid-cache.org/Features/SslPeekAndSplice

関連情報