Docker部署Squid做代理服务器

默认分类 · 2023-09-25

有一批http接口需要通过ip白名单访问,因为我这里没有固定ip,需要开一台云服务器做代理中转请求,squid配置比较方便,简单记一下操作流程
因为是http接口,没有https,就没做https相关的配置了

使用的镜像:ubuntu/squid:5.2-22.04_beta

正向代理(带身份验证)

正向代理不需要额外配置就可以代理https
先拉取镜像,然后写配置文件,位置无所谓,我这里是/etc/squid/squid.conf

# Squid监听端口
http_port 3128

# 认证程序及密码文件位置
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/pwd
# 认证程序的线程数
auth_param basic children 5
# 认证领域?不知道有啥用
auth_param basic realm proxy
# 认证令牌的有效期
auth_param basic credentialsttl 2 hours
# 是否大小写敏感
auth_param basic casesensitive off

# 配置认证规则
acl gembo_proxy proxy_auth REQUIRED
http_access allow gembo_proxy
http_access deny all

acl all src 0.0.0.0/0.0.0.0

生成密码

openssl passwd -apr1 password

敲完之后会得到一串加密后的密码字符串

$apr1$bj/B3XOz$S0b7ZAgNzZiyMLYieh9QM/

在字符串前面加上用户名,把字符串拼接成Username:Password

Username:$apr1$bj/B3XOz$S0b7ZAgNzZiyMLYieh9QM/

把上面的字符串保存到密码文件,我这里是/etc/squid/pwd
启动容器

docker run -d \
  --name squid \
  --restart unless-stopped \
  -p 3128:3128 \
  -e TZ=Asia/Shanghai \
  -v /etc/squid/squid.conf:/etc/squid/squid.conf \
  -v /etc/squid/pwd:/etc/squid/pwd \
  ubuntu/squid:5.2-22.04_beta

配置文件的位置在容器里是固定的/etc/squid/squid.conf,密码文件的位置无所谓,和配置文件里设置的一致就行

在windows设置里设置代理服务器的地址和ip,点击保存
proxy_settings.jpg
打开浏览器,随便打开个网站,会弹出来登录框,用之前设置的账号密码登录
Login.jpg
登录后能正常浏览网页,说明代理正常工作,也可以打开一些工具网站看看自己ip有没变

反向代理

只有正向代理当然是不够的,正向代理需要应用侧主动设置代理服务器,如果不希望修改应用侧,可以用劫持DNS+反向代理的方式来实现代理访问
首先写配置文件

# 设置代理入口,因为是劫持DNS,无法指定应用访问过来的端口,所以设置http默认的80
http_port 80 accel

# 设置要代理的域名
acl TargetDomain1  dstdomain domain1.example.com
acl TargetDomain2  dstdomain domain2.example.com

# 设置上游服务器,可以写域名也可以写ip,端口在parent后面指定,这里是80
cache_peer domain1.example.com parent 80 0 no-query default name=Domain1-upstream
cache_peer domain2.example.com parent 80 0 no-query default name=Domain2-upstream

# 如果上游有身份验证,要这么写
cache_peer domain1.example.com parent 80 0 no-query default login=username:password name=Domain1-upstream

never_direct allow TargetDomain1 # 强制走代理,不允许直连
cache_peer_access Domain1-upstream allow TargetDomain1 # 指定走上游服务器

never_direct allow TargetDomain2
cache_peer_access Domain2-upstream allow TargetDomain2

# 如果不需要上游服务器,而是直接从代理服务器发出请求,也可以不设置cache_peer
# always_direct allow TargetDomain1
# always_direct allow TargetDomain2

# 允许指定的域名通过代理
http_access allow TargetDomain1
http_access allow TargetDomain2
# 拒绝其他代理请求
always_direct deny all

之后设置DNS服务器,把域名解析劫持到代理服务器
这一步根据实际使用的DNS服务端来修改,我这里用的是dnsmasq

# proxy
192.168.0.101 domain1.example.com
192.168.0.101 domain2.example.com

在客户端请求目标域名的数据,看到squid打印如下日志则说明代理正常工作

TCP_REFRESH_MODIFIED/200 xxx GET http://domain1.example.com/xxx - FIRSTUP_PARENT/xxx.xxx.xxx.xxx -
Theme Jasmine by Kent Liao