「Proxy」- 创建 HTTP 与 HTTPS 代理

  CREATED BY JENKINSBOT

问题描述

由于网络访问的原因,或者需要网络加速,又或者其他原因,我们需要搭建 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