Squid代理服务的搭建
前言
所谓的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
