![使用带有 SNI 过滤功能的 squid 透明地建立 HTTPS 隧道](https://linux22.com/image/769202/%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%20SNI%20%E8%BF%87%E6%BB%A4%E5%8A%9F%E8%83%BD%E7%9A%84%20squid%20%E9%80%8F%E6%98%8E%E5%9C%B0%E5%BB%BA%E7%AB%8B%20HTTPS%20%E9%9A%A7%E9%81%93.png)
我的要求是:
- 代理应该是透明的。
- 我应该能够通过域名过滤网站。
- 我愿意不是想要解密流量。我正在寻找基于 SNI 嗅探的解决方案 - 无需在客户端上安装证书。
有很多答案,但它们要么不正确(声称您需要解密流量才能做到这一点),要么不完整。
答案1
实现此目的的方法是使用 Squid 3.5 中引入的 ssl peek 功能。请参阅这里详细解释。请注意,您需要使用--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
按照他们的建议使用会使其完全停止工作)。
然后使用 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
资料来源: