Squid切换到https代理

最近使用Squid代理发现http代理没法用了,无法使用http代理上youtube或者facebook,只好寻思着切换到加密的https代理上。参照网路上的教程,记录下来,以便日后配置时使用。

编译带有SSl的squid3

1.安装编译依赖环境和源码

1
2
3
4
5
mkdir ~/squid_src
cd ~/squid_src
apt-get install -y build-essential fakeroot devscripts gawk gcc-multilib dpatch libssl-dev openssl squid-langpack ssl-cert
apt-get build-dep squid3
apt-get source squid3

2.修改默认的编译选项,增加SSL支持和高匿
编辑文件squid3-3.4.8/debian/rules,在DEB_CONFIGURE_EXTRA_FLAGS配置中添加--enable-ssl--enable-http-violations:

1
2
3
4
5
6
7
DEB_CONFIGURE_EXTRA_FLAGS := --datadir=/usr/share/squid3 \
--sysconfdir=/etc/squid3 \
--mandir=/usr/share/man \
--enable-inline \
--enable-ssl \
--enable-http-violations \
--enable-async-io=8 \

3.编译 squid3,编译完成的deb包在~/squid_src目录

1
2
cd squid3-3.4.8
debuild -us -uc -b

4.安装必要的软件

1
2
3
dpkg -i squid3-common_3.4.8-6+deb8u4_all.deb \
squid3_3.4.8-6+deb8u4_amd64.deb \
squid3-dbg_3.4.8-6+deb8u4_amd64.deb

生成配置证书

编译完成之后,配置好浏览器代理,发现出现ERR_PROXY_CERTIFICATE_INVALID错误,并且网站无法打开,说明可以连上,但是由于其它原因无法使用代理。后面继续在网路上搜了下才知道,跟证书有关,而且通过openssl自己生成的证书好像没法被chrome识别使用,只好使用免费的SSL证书letsencrypt

使用letsencrypt生成免费证书首先需要一个域名。需要一条A记录解析到VPS服务器IP,然后方可生成,生成后的证书替换掉原来的即可。然后再Squid配置文件中/etc/squid3/squid.confhttp_port更改为https_port并配置好证书路径即可:

1
2
3
4
5
# 通过Certbot来安装letsencrypt
wget https://dl.eff.org/certbot-auto
chmod +x certbot-auto
# 安装生成证书
./certbot-auto certonly

免费证书

需要注意的是,免费证书有效期有限制,需要过期继续生成。

生成完毕后配置squid.conf文件:

1
https_port 443 cert=/etc/letsencrypt/live/us.vpn666.xin/cert.pem key=/etc/letsencrypt/live/us.vpn666.xin/privkey.pem

配置账号认证

使用系统自带的htpasswd生成账号密码,如若没有,先安装apt-get install apache2-utils
生成账号密码文件:

1
2
httpasswd -c /etc/squid3/up telanx
<输入密码>

修改squid.conf文件配置密码认证方式

1
2
3
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/up
acl auth_user proxy_auth REQUIRED
http_access allow auth_user

启动squid3服务

1
2
service squid3 start
# 或者/etc/init.d/squid3 start

客户端配置代理

配置好代理协议https,域名,端口号即可.
在浏览器中配置https代理时,不能填写IP地址,否则仍然出现ERR_PROXY_CERTIFICATE_INVALID错误,换成绑定的域名即可。

https代理

ZARD

附录:一个squid3配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
auth_param basic children 5
auth_param basic realm Squid proxy web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/up
acl auth_user proxy_auth REQUIRED
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow all
#http_port 403
# 配置https代理
https_port 4433 cert=/etc/letsencrypt/live/us.vpn666.xin/cert.pem key=/etc/letsencrypt/live/us.vpn666.xin/privkey.pem
http_access allow auth_user
coredump_dir /var/spool/squid3
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
strip_query_terms off
visible_hostname aa.dw.com
request_header_access Via deny all
request_header_access X-Forwarded-For deny all
request_header_access All allow all
reply_header_access Server deny all
reply_header_access X-Cache deny all
reply_header_access X-Cache-Lookup deny all
reply_header_access Warning deny all
reply_header_access Expires deny all
reply_header_access Cache-Control deny all
reply_header_access age deny all