问题描述
由于网络访问的原因,或者需要网络加速,又或者其他原因,我们需要搭建 HTTP 与 HTTPS 代理。
该笔记将记录:在 Linux 中,如何快速创建 HTTP 与 HTTPS 代理。
解决方案
我们这里主要使用 Squid 搭建 HTTP 与 HTTPS 正向代理。
并且 Squid 的 HTTP 代理支持 CONNECT 方法,所以 HTTP 能够作为 HTTPS 代理。
方法一、使用 Dokcer 镜像
#1 安装Docker服务 # https://docs.docker.com/install/ # 略过…… #2 启动服务 docker run --name squid-proxy -d --restart=always --publish 3128:3128 \ -e USERNAME=jeffrey -e PASSWORD=swordfish \ yegor256/squid-proxy # 附加说明 # 1)根据作者的介绍,这是一个匿名的代理。可以访问http://amibehindaproxy.com/进行验证。 # 2)该服务只启用了基础认证(Basic Authorization)
其他 Docker 镜像:
1)sameersbn/squid
方法二、使用 Squid 服务
本部分介绍如何使用 Squid 搭建 HTTP 与 HTTPS 代理,并使用基础认证(Digest Access Authentication)功能。
实验环境
注意,本部分所记录的搭建过程适用于以下发行版,其他发行版也是类似的:
CentOS Linux release 7.5.1804 (Core) => 成功
Kali GNU/Linux Rolling => 成功
第一步、安装服务
# Debian apt-get install -y squid apache2-utils # CentOS yum install -y squid httpd-tools
第二步、配置服务
配置认证信息(如果不需要认证,则跳过该步骤):
mkdir -pv /etc/squid/conf.d/ # 定义认证信息(Digest Access Authentication) htdigest -c /etc/squid/password.digest public foo # 定义配置文件 cat > /etc/squid/conf.d/09-forward-proxy.conf <<EOF # 在Debian中,取消该行注释 # auth_param digest program /usr/lib/squid3/digest_file_auth -c /etc/squid/password.digest # 在CentOS中,取消该行注释 auth_param digest program /usr/lib64/squid/digest_file_auth -c /etc/squid/password.digest auth_param digest realm public acl acl_require_auth proxy_auth REQUIRED http_access allow acl_require_auth EOF # 引入配置文件(仅在 CentOS 中执行,因为 Debian 默认已经引入) # 预留空行,防止配置文件最后一行没有换行 cat <<EOF >> /etc/squid/squid.conf include /etc/squid/conf.d/*.conf EOF
开启 HTTP 监听:
mkdir -pv /etc/squid/conf.d/ # 注释某些配置行(在 CentOS 中需要执行,而 Debin 需要检查) sed -i 's/http_access deny all/# http_access deny all/g' /etc/squid/squid.conf # 开启IPv4监听(默认只监听IPv6) sed -i 's/http_port 3128/http_port 0.0.0.0:3128/g' /etc/squid/squid.conf
注意事项:
1)参数含义已在配置文件(squid.conf)的注释中已经解释,因此不再复述
2)要留意配置文件(squid.conf)中有没有 http_access deny all 配置行,尤其是在 CentOS 中。
第三步、启动服务
systemctl start squid.service systemctl enable squid.service
第四步、服务测试
curl -O -x http://squid.example.com:3128 --proxy-digest -U 'username:password' \ https://needproxy.example.com
附加说明
在 HTTPS 代理中,客户端与代理服务器,先通过 CONNECT 发起连接,然后进行认证,而这个过程还没有建立 SSL 连接,密码是明文的。
另外,由于 HTTPS 代理只是形成 TCP 隧道,所以远程服务器看到的是代理服务器的网络地址,而看不到客户端的网络地址。除非代理服务器拥有了证书。
相关链接
Using Basic Auth HTTPS_PROXY over HTTP
Authenticating a Proxy server over HTTPS
参考文献
GitHub/yegor256/squid-proxy
(Squid) forward Proxy for Internet Access Control and Visibility
Wikipedia/Digest access authentication
Squid 3 is only listening only on IPv6