HTTP通信,在Squid中可以正常识别method和详细urlpath
但是HTTPS通信时,method一律识别成CONNECT,并且只显示domain,不显示详细urlpath
所以,有关url_regex和urlpath_regex的过滤都无法生效
如果想让squid能获取详细urlpath和method的话
就需要把Squid设置成一个中间人
Squid与Client使用虚假证书建立https通信
将request解密
再与Server建立https通信,将解密的request重新加密送出
零,版本要求
必须Squid3.5以上版本才可以实现
一,ssl_bump设置
原文连接:
Intercept HTTPS CONNECT messages with SSL-Bump
https://wiki.squid-cache.org/ConfigExamples/Intercept/SslBumpExplicit#Features.2FDynamicSslCert.Create_Self-Signed_Root_CA_Certificate
1.创建自签名CA根证书
用于squid生成动态证书
cd /etc/squid
mkdir ssl_cert
chown squid:squid ./ssl_cert
chmod 700 ./ssl_cert
cd ssl_cert
使用openssl创建自签名证书
openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem
创建der编码证书,用来导入客户端浏览器
openssl x509 -in myCA.pem -outform DER -out myCA.der
2.修改Squid配置文件
Squid必须具备以下模块
–with-openssl
–enable-ssl-crtd
一般yum安装的,都默认会添加上这些模块
以下是配置信息,需要粘贴到squid.conf中
文件默认位置:
/etc/squid/squid.conf
指定代理端口,指定ssl-bump模式,指定证书
pem证书已经包含了私有key,所以不用再指定私有key
生成主机证书,定义动态证书缓存大小
http_port 3128 ssl-bump \
cert=/etc/squid/ssl_cert/myCA.pem \
generate-host-certificates=on \
dynamic_cert_mem_cache_size=4MB
对于Squid 3.5版本,使用以下配置
# For squid 3.5.x
sslcrtd_program /usr/local/squid/libexec/ssl_crtd -s /var/lib/ssl_db -M 4MB
对于Squid 4.0以上版本
# For squid 4.x
sslcrtd_program /usr/local/squid/libexec/security_file_certgen -s /var/lib/ssl_db -M 4MB
注意: security_file_certgen的存放位置会有变化,centos8的存放位置是
/usr/lib64/squid/security_file_certgen
设定bump step
acl step1 at_step SslBump1
ssl_bump peek step1
设定ssl_bump的范围
全部request都ssl-bump
ssl_bump bump all
或者定义,只针对部分域名进行ssl-bump
acl bump_sites dstdomain "/etc/squid/ssl_cert/bump_sites.txt"
ssl_bump bump bump_sites
3.创建和初始化TLS证书缓存目录
Squid3.5
/usr/local/squid/libexec/ssl_crtd -c -s /var/lib/ssl_db -M 4MB
chown squid:squid -R /var/lib/ssl_db
Squid4.0以上
/usr/local/squid/libexec/security_file_certgen -c -s /var/lib/ssl_db -M 4MB
chown squid:squid -R /var/lib/ssl_db
注意: security_file_certgen的存放位置会有变化,Centos 8的存放位置是
/usr/lib64/squid/security_file_certgen
这样基本就可以监听https的connect消息了
二,过滤
1.URL过滤
将需要过滤的路径添加到path_banned.ws中
acl banned_files urlpath_regex -i "/etc/squid/path_banned.ws"
http_access deny banned_files
2.Method过滤
过滤request header大于30k的POST送信
acl UPLIMIT req_header Content-Length [3-9][0-9]{4,}
acl UPLOAD method post
http_access deny UPLIMIT UPLOAD
最后.补充
1.Squid和父级代理连接的时候无法使用https
cache_peer IP_xx.xx.xx.xx parent HTTPPort_xxxx ICPPort_xxxx no-query default tls sslcert=/etc/squid/ssl_cert/myCA.pem sslflags=DONT_VERIFY_PEER
会提示SSL连接协商失败
Error negotiating SSL connection on FD 24: error:00000001:lib(0):func(0):reason(1) (1/-1)
即使父级代理开通了https_port也无法建立连接
所以,暂时无法实现ssl-bump的Squid向上一级代理转发
2.根据url,选择cache_peer
cache_peer_access peer-name allow|deny [!]aclname …
acl domain1 dstdomain www.domain1.com
cache_peer IP1 Port1 ICPport1 default name=peer1
cache_peer IP2 Port2 ICPport2 default name=peer2
cache_peer_access peer1 allow domain1
cache_peer_access peer2 deny domain1