瑞瑞哥的博客

安装Squid3作为HTTPS代理服务器

安装Squid3作为HTTPS代理服务器

前言

墙内的跳板服务器没了,需要直连国外VPS主机了。那么我们怎么上网呢?我知道的有以下几类:

  • VPN
  • Shadowsocks等socks代理
  • HTTPS代理

前两者需要安装比较重的客户端,尤其是ss新版在Win7下还需要Net Framework 4.5,这个又需要Server Pack 2的支持,总之就是烦得很。而HTTPS代理就没这么多破事,顶多需要一个浏览器插件即可完成。

注意,这里的HTTPS代理不是说用HTTP connect的方法转发https请求,而是说用SSL/TLS 加密HTTP/HTTPS请求。换句话说你的HTTP请求也是加密的。

本文更新说明

  • 2017.11.10:使用systemd托管服务,并且使之自启动
  • 2019.09.03:支持ubuntu 18.04安装。ubuntu 18.04自带openssl 1.1.x,squid不兼容这个,因此改用squid 4,细节内容请看这个文件
  • 2021.08.05:续2019.09.03的更新,ubuntu 18.04如果仍然要坚持安装squid 3,可以安装3.5.27

安装Squid3

注意,如果直接apt-get安装的squid默认是没有ssl模块的,因此我们必须下载源代码重新编译,在编译时候指定选项。

安装openssl依赖:

1
sudo apt-get install openssl libssl-dev ssl-cert

安装其他依赖:

1
sudo apt-get install devscripts build-essential fakeroot

下载Squid3源代码:

1
2
3
wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.24.tar.gz
tar -xvzf squid-3.5.24.tar.gz
cd squid-3.5.24

编译:

1
2
3
./configure --enable-ssl --with-openssl=/usr/include/openssl
make
sudo make install

注意:是--with-openssl而不是--with-open-ssl

另外,如果是Ubuntu 18.04,自带的OpenSSL是1.1.x版本的,编译可能会出错。解决办法:

  1. 执行:sed -i s/SSL_library_init/OPENSSL_init_ssl/ configure.ac configure,再编译

  2. 直接使用squid 3.5.27代替3.5.24,可以避免以下两种报错:

    1. 内容具体如这个链接(需要科学上网打开),报错信息如下:

      1
      2
      3
      >       ../../src/ssl/gadgets.h:116:58: error: template argument 3 is invalid
      > typedef LockingPointer<SSL, SSL_free_cpp, CRYPTO_LOCK_SSL> SSL_Pointer;
      >
解决办法就是安装` libssl1.0-dev`
  1. 具体内容如这个链接,报错信息如下:

    1
    2
    >       dynamic exception specifications are deprecated
    >
解决办法是从3.5.24升级到3.5.27

我的1U1G的虚拟机编译用了好久,好生气啊。

编辑/usr/local/squid/etc/squid.conf,按照以下内容粘贴,记得修改

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
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 program /usr/local/squid/libexec/basic_ncsa_auth /usr/local/squid/etc/squid_passwd
acl ncsa_users proxy_auth REQUIRED

http_access allow ncsa_users
http_access deny to_localhost
http_access allow CONNECT all
http_access allow localhost manager
http_access deny manager
http_access allow localhost

pid_filename /usr/local/squid/var/logs/squid.pid
# 修改为证书路径
https_port youdomain.com:443 cert=/usr/local/squid/etc/public.pem key=/usr/local/squid/etc/private.key

coredump_dir /usr/local/squid/var/spool/

via off
forwarded_for delete

dns_v4_first on
visible_hostname rrg

cache_effective_user squid
  1. 如果想要监听0.0.0.0,需要把https_port这一项的域名换成0.0.0.0

  2. 如果https代理使用了证书,需要像范例中那样,把你的域名填进去,否则得设置一下允许不安全的连接

  3. 如果你是云上虚拟机,而且是VPC网络,记得在/etc/hosts文件中加入域名和本机器私网IP的映射,即:

    1
    2
    >   192.168.1.100 youdomain.com
    >

添加证书

把证书拷贝到配置文件里所述的地方,即:

1
cert=/usr/local/squid/etc/public.pem key=/usr/local/squid/etc/private.key

我是在腾讯云申请的免费的SSL证书,为期一年

设置密码

需要生成密码文件,这个密码文件的路径记得要和上文配置文件里指定的一样。

输入以下命令,创建账号密码:

1
htpasswd -c /usr/local/squid/etc/squid_passwd user

如果你没有htpasswd,需要:

1
sudo apt-get install apache2-utils

把squid加入环境变量

建议把squid加入环境变量,这样每次操作就不用/usr/local/squid那么恶心了,编辑/etc/profile,加入一行:

1
export PATH=$PATH:/usr/local/squid/sbin/

创建squid账号

Squid启动需要squid账号(配置文件里指定了),同时配置文件里还指定了一些目录没有被创建,需要手动创建,另外有的目录是root创建的,权限不在squid用户那里,这些都需要搞一搞:

1
2
3
4
5
6
# root 下
useradd squid
chown -R squid /usr/local/squid

su squid
mkdir -p /usr/local/squid/var/spool/

注意,这个账号安全性自己负责,最好不要开启空密码

前台调试squid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1,初始化你在 squid.conf 里配置的 cache 目录
#/usr/local/squid/sbin/squid -z //初始化缓存空间
如果有错误提示,请检查你的 cache目录的权限。

2,对你的squid.conf 排错,即验证 squid.conf 的 语法和配置。
#/usr/local/squid/sbin/squid -k parse
如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid。

3,在前台启动squid,并输出启动过程。
#/usr/local/squid/sbin/squid -N -d1
如果有到 ready to server reques,恭喜,启动成功。
然后 ctrl + c,停止squid,并以后台运行的方式启动它。

4,启动squid在后台运行。
#/usr/local/squid/sbin/squid -s
这时候可以 ps -A 来查看系统进程,可以看到俩个 squid 进程。

5,停止 squid
#/usr/local/squid/sbin/squid -k shutdown
这个不用解释吧。

6,重引导修改过的 squid.conf
#/usr/local/squid/sbin/squid -k reconfigure //载入新的配置文件
这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改squid.conf,然后别忘记对你的 squid.conf排错,然后再执行此指令,即可让squid重新按照你的 squid.conf 来运行。

后台执行

1
/usr/local/squid/sbin/squid -s

添加启动项

虽然已经万事俱备了,但是我们希望开机的时候能够自启动,那么需要添加启动项到/lib/systemd/system/squid.service

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=squid3
Documentation=https://ruiruigeblog.com
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/squid/sbin/squid -s
ExecStop=/usr/bin/killall squid
LimitNOFILE=65535

并且使之载入、自启动:

1
2
systemctl daemon-reload
systemctl enable squid

参考

http://www.darrenfang.com/2015/05/install-squid-on-ubuntu-and-enable-ssl/

http://smallfish01.blog.51cto.com/3565/282393/

http://blog.163.com/sword_111/blog/static/6658941620114163458435/