前言

所谓的HTTP代理或者HTTPS代理指的是“代理协议”,即客户端与代理服务器端之间的通信协议,而无关乎代理服务器与请求网站服务器的通信方式,代理服务器与请求网站服务器的通信是根据情况正常的通信 。代理过程发生在客户端与代理服务器之间 。

安装Squid

正文

# Ubuntu、Debian
apt update
apt install squid 

# CentOS
yum install squid

闲言

不知道旧版怎么样,但较新版本安装后Squid服务是会自动启动的,我们可以选择先关掉Squid服务,方便之后的试验 。

# Ubuntu
systemctl stop squid

不知道旧版怎么样,新版安装后其实就已经配置了Squid服务的开机自动启动了……

# Ubuntu
systemctl is-enabled squid
# 会输出: "enabled"

当然不想Squid服务开机自动启动的,可以直接关掉

# Ubuntu
systemctl disable squid
systemctl is-enabled squid # 输出: "disabled"

HTTP代理

闲言

HTTP代理是无加密通信,因此如果中国大陆想通过代理服务器来“科学上网”的话,“科学上网”相关的通信回复流量会被“国家防火墙政策相关配置”识别并干扰掉

查看配置文件:

# Ubuntu
vim /etc/squid/squid.conf

我们会发现默认的这个配置文件里写了很多“注释”,一些配置就夹杂在其中,看起来相当的冗杂且不直观

因此我们可以选择把默认配置文件重命名掉,再创建一个新的配置文件 。

# Ubuntu
mv /etc/squid/squid.conf /etc/squid/squid.conf.backward

正文

编辑配置文件:

# Ubuntu

vim /etc/squid/squid.conf
# /etc/squid/squid.conf

# 必须,执行完需要特别权限的任务后,变成 "squid" 用户,这是一种安全策略。用户名任意但需要存在,如果不存在,需要创建,并确保squid程序的相关文件夹能够被此用户读写:
cache_effective_user squid 

# 可选,指定squid进程所属组 。如果不指定,使用进程用户的默认组:
cache_effective_user squid 

# 必须,指定缓存目录,第一个参数是缓存策略,第二个参数是文件夹路径,第三个参数是最大缓存大小,第四个参数是最大一级目录个数,第五个参数是最大二级目录个数:
cache_dir ufs /var/squid_cache 7000 16 256 


http_port 3128     # 指定HTTP代理的监听端口

# 即使目标是HTTP代理,仍然需要允许443端口,因为需要保证代理过程中Squid代理访问HTTPS网站时,目标网站给与的回复可以被正常接收
acl SSL_ports port 443                                 # 添加443端口到访问控制列表
acl CONNECT method CONNECT               # 添加CONNECT方法到控制访问列表
http_access allow CONNECT SSL_ports   # 允许远程服务器的443端口以CONNECT方法访问Squid

# 访问控制
acl allow_address src 0.0.0.0        # 访问控制列表添加规则,以allow_address代指 src 0.0.0.0
http_access allow allow_address # 允许来源为 allow_address 的访问
http_access deny all                       # 拒绝其他任何未允许来源的访问

以上是一些实现 HTTP 代理的基本配置 。

解析配置文件的语法:

# Ubuntu

# 解析配置文件,如果有语法错误会提示
squid -k parse 

如果配置没有语法错误。接下来,我们可以在前台运行一下Squid,来进行试验 。

# Ubuntu

# 初始化cache目录,在首次运行squid,或者增加新的cache目录时,你必须使用该选项:
squid -zX                    # -z :初始化缓存目录,-X :强迫完整调试模式(方便观察完整过程)

squid -N -d1              # -N :强制在前台运行,-d1 :标准错误里显示一级调试信息
# 客户端
# cmd


# -4 :强制使用IPV4访问,-x :代理访问模式,ifconfig.me是一个查看IP的网站域名:
curl -4 -x http://your.squid.com:3128/ ifconfig.me

如果试验无恙,可以 “Ctrl+C” 终止前台Squid程序,选择在后台启动:

# Ubuntu

systemctl start squid

值得一提的是,新版的Squid,最起码我使用的 5.9 版本,是完全可以使用例如 systemctl 的工具来管理服务的 。

最后提一句 squid 配置文件中日志配置的一些选择:

/etc/squid/squid.conf

# cache.log,包含状态性的和调试性的消息:
cache_log /squid/logs/cache.log

# access.log文件包含了对squid发起的每个客户请求的单一行:
cache_access_log /squid/logs/access.log

# store.log包含了进入和离开缓存的每个目标的记录:
cache_store_log /squid/logs/store.log

如果不配置日志文件的路径的话,默认的日志目录可能是:/var/log/squid/

错误可能原因

  • 文件权限不足,请确保日志文件的读写权限被合理分配给 Squid 用户
  • 访问控制列表配置,请确保在配置文件中合理分配了可访问来源
  • 防火墙未放行相关入行流量
  • 相关端口被占用
  • ……

HTTPS代理

前言

如果要为配置有关于 Squid 的 HTTPS 代理,我们首先要有“证书和对应私钥”,这是 “TLS” 过程所必须的 。

这里推荐大家使用 Let’s Encrypt ,它不仅可以免费配置证书,而且它的证书链路已经被主流浏览器和操作系统所内置信任了,非常的不错 。

具体如何使用 Let’s Encrypt 申请免费证书,大家可以自行上网百度一下,非常的简单 。

当然大家如果想使用自签名证书的话,可能需要处理“信任问题”,这一点需要注意 。

正文

非常的简单,只需要在 Squid 配置文件中添加一句:

# /etc/squid/squid.conf

# 监听 443 端口的 https 请求,Let's Encrypt 生成的全链证书一般在这里
https_port 443 \
tls-cert=/etc/letsencrypt/live/your.domain.com/fullchain.pem \
tls-key=/etc/letsencrypt/live/your.domain.com/privkey.pem

# 以上配置实际需要是“一行”,这里使用 "\"加"回车" 是为了使看起来更美观 。注意如果不是使用 "\"+"回车" 会出现解析错误 

cache deny all         # 可选。拒绝缓存,毕竟 HTTPS 是加密通信

这里需要确保 443 端口没有被占用,并且防火墙要放行 443 端口的入行流量 。

用户认证

前言

为了安全,我们可以为Squid配置用户认证 。此例使用最简单的 Basic 验证 。

正文

# Ubuntu

# 安装 apache 工具箱
sudo apt install squid apache2-utils

# 创建密码存储文件(初次添加用户使用 -c 参数),-c 表示创建密码文件,如果已存在此文件会覆盖
sudo htpasswd -c /etc/squid/passwords username

# 后续添加其他用户(去掉 -c 参数防止覆盖文件)
sudo htpasswd /etc/squid/passwords another_user

编辑配置文件:

# /etc/squid/squid.conf

# 启用Basic认证并指定密码文件
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords

# 设置认证领域提示(用户看到的登录框描述)(可有可无)
auth_param basic realm Squid Proxy Authentication

# 认证进程设置
auth_param basic children 5           # 用于认证的最大子进程数
auth_param basic credentialsttl 2 hours # 凭据缓存时间

# 更改访问控制列表(ACL),添加“需要认证对象”
acl authenticated proxy_auth REQUIRED

# 允许通过认证的用户访问
http_access allow authenticated

# 可以选择注释或删除掉其他的"http_access allow ..." 以使每个用户都需要进行认证

# 拒绝其他所有未认证的访问(确保在allow规则之后)
http_access deny all
# Ubuntu

# 确保没有出现语法错误
squid -k parse 

# 重新加载squid配置
systemctl reload squid

客户端验证:

# cmd

curl -x https://your_proxy_ip:443 -U username:password http://example.com

结语

为了文章的精简性,我在以上叙述中省去了一些非必要的过程。但这些过程往往可以避免很多错误,因此我在这里强调一下:

  • 确定相关的文件权限足够!
  • 确保防火墙相关端口放行!
  • 确保访问策略中允许客户端地址的访问!
  • 确保相关端口没有被其他程序占用!
  • ……

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

作者

3049874370@qq.com

相关文章

ssh的密钥认证以及通道保持

密钥验证登录 以下讨论皆以密钥在本地主机、公...

读出全部