我已经设置 Squid 来阻止我自己的系统上的页面(即不在网络上),并且我正在尝试让 SSL 与页面阻止一起使用。为此,我设置了 ssl-bump 并将证书安装到我的浏览器中。
我想阻止*.reddit.com/*
(在 HTTPS 和 HTTP 上),但我想*.reddit.com/r/LearnJapanese
仅允许子 URL(在 HTTP 和 HTTPS 上)
这是我的squid.conf 文件的一部分:
acl bad_domain url_regex "/usr/local/squid/etc/block.acl"
acl good_domain url_regex "/usr/local/squid/etc/allow.acl"
http_access deny bad_domain !good_domain
http_access allow good_domain
http_access allow localnet
http_access allow localhost
http_access deny all
# Squid normally listens to port 3128
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=10MB cert=/usr/local/squid/etc/squid.pem
ssl_bump allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
block.acl的内容:
^http(s)?://(.+)?reddit\.com(.+)?$
allowed.acl的内容:
^http(s)?://(.+)?reddit\.com/r/LearnJapanese(.+)?$
它在 HTTP 上工作得很好(即可以访问 reddit.com/r/LearnJapan,但 Reddit 的其余部分不能),但我在 HTTPS 上却没有同样的运气。
当我通过 HTTPS 访问 Reddit 时,页面根本没有被阻止,但它们应该被阻止(当然 reddit.com/r/LearnJapan 除外)。
我怎样才能阻止对所有 Reddit 的访问(除了.reddit.com/r/Learn日语/)通过 HTTP 和 HTTPS ?谢谢。
答案1
由于 SSL 是端到端加密,因此像 Squid 这样的代理通常对 HTTPS 请求的了解远少于对 HTTP 的了解(http://wiki.squid-cache.org/Features/HTTPS#CONNECT_tunnel):
CONNECT 请求中不存在请求 URL 的[许多]公共部分:
- URL 方案或协议(例如,http://、https://、ftp://、voip://、itunes:// 或 telnet://),
- URL 路径(例如 /index.html 或 /secure/images/),
- 和查询字符串(例如?a=b&c=d)
要了解有关 HTTPS 请求的更多信息,Squid 必须对其客户端执行基本上是中间人的攻击。鱿鱼文档解释了如何做到这一点,但请注意,这会带来一些有关隐私的问题(您的用户应该信任您提供他们通常加密的信息,并且网络浏览器可能会警告有关攻击的信息)。
答案2
我通过编写ssl_bump server-first all
和删除解决了我的问题ssl_bump allow all
。我不确定它是否有助于解决问题,但我也将这些行放入我的终端中:
/sbin/iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --dport 80 -j REDIRECT --to-port 3128
/sbin/iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --dport 443 -j REDIRECT --to-port 3128
虽然当我尝试使用 HTTPS 导航到黑名单页面时,这不会产生“访问被拒绝”消息,但当我将 Firefox 配置为对所有协议(即 HTTP 和 HTTPS)使用 Squid 代理时,它确实会给出“代理服务器拒绝连接”消息)并添加了之前生成的根证书(/usr/local/squid/etc/squid.pem
)。