一切福田,不離方寸,從心而覓,感無不通。

部署与使用 Squid 正向代理

 

目录

 


背景

在医院项目中,由于安全性和其他网络策略的考虑,经常会遇到某些服务器无法直接访问公网的情况。而 Nginx 服务器,因为充当了公网用户和后端服务器之间的媒介(反向代理),是可以与公网进行通信的。为了克服这种局限性,使得相关的服务器(如应用服务器)能访问到互联网,我们一般会引入正向代理的解决方案,也就是在 Nginx 服务器上安装其他透明的正向代理软件,以避免业务上出现异常。

有人可能会问,为什么不直接用 Nginx 服务器上的 Nginx 进行正向代理呢?其实,Nginx 做 HTTP 的正向代理是完全没问题的,配置起来也非常简单。只是,它无法很好地支持 HTTPS 请求的正向代理

这里展开讲一下正向代理 HTTPS 流量的机制——

  1. 客户端使用明文 HTTP 协议,向代理发送CONNECT请求,请求与目标服务器建立一个 TCP 隧道

     

  2. 代理尝试与目标服务器建立 TCP 连接
  3. 一旦连接建立,代理告诉客户端连接已建立(返回 200 状态码,跟常见的 200 OK 不一样哦)

     

  4. 然后,客户端开始与目标服务器进行 TLS 握手,以此建立加密的连接
  5. 此后,所有流量(已加密)只是通过代理传输,而代理不会(也不能)查看其内容,除非你配置它们为“中间人”攻击模式(Man-in-the-Middle, MITM)

Nginx 就麻烦在它默认不支持 CONNECT 方法,因为 Nginx 的设计初衷主要是作为 HTTP 服务器和反向代理来用的,而不是作为正向代理。

所以,通常我们会使用 Squid 来做正向代理,毕竟人家是专业干这个的~


解决方案: Squid 正向代理

Squid 是一款流行的、高性能的正向代理和缓存服务器,非常适合我们的问题场景。


在 Nginx 服务器上部署 Squid

使用 Docker 安装与运行 Squid
  1. 获取 Squid 镜像:

     

  2. 创建 Squid 配置文件目录(自己修改目录位置):

     

    将定制的 squid.conf 文件(如下方所示)放入此目录中。

  3. 启动 Squid 容器:

     

squid.conf 配置文件示例

 


在应用服务器上配置和使用 Squid

环境变量/系统设置

  • 通过 Docker 运行参数设置:

     

  • 或通过修改 /etc/environment 文件(如果改了后不生效,需要 source /etc/environment 一下),添加以下内容:

     

    然后在 Docker 运行参数里,可以直接引用咱们在这个文件里定义的环境变量,如下:

 

此处的 NGINX_SERVER_IP 代表 Nginx 服务器的内网 IP 地址。而 INTERNAL_DOMAINS 代表不应通过代理访问的内部域名,多个域名之间用英文的逗号分隔开,比如 localhost,127.0.0.1,xxx.xxx.com,这个 xxx.xxx.com 是我们项目本身的域名,访问项目本身的域名我们不希望它被 Squid 正向代理,而是希望它被 Nginx 反向代理(当然,需要先在应用服务器的 hosts 文件里配好项目域名到 Nginx 服务器内网 IP 地址的解析)!

现有 Docker 容器的适应性

对于已存在的 Docker 容器,直接设置环境变量是无效的。最佳实践是使用新的环境变量,重建容器,步骤如下:

  1. 创建容器的新镜像:首先,从正在运行的容器上,创建一个新的镜像。

 

  1. 运行新的容器:使用此新镜像启动新的容器,并传递所需的环境变量。

 


总结

通过 Squid 正向代理的部署和配置,我们可以为无法直接访问公网的应用服务器提供一个桥梁,从而允许其访问公网服务(比如腾讯云 COS、TRTC 的一些服务,以及我们公司的一些 SaaS 公共服务)。这一策略避免了在应用级别做任何代码上的修改,同时确保了访问的安全性和可控性。

最后,最坏的情况是如果 Nginx 服务器要访问公网服务得指定 IP,而不能直接不限制所有域名,那只能整理一下要使用的公网服务的 IP 了,虽然这些 IP 很可能是动态的,那也没办法……

目前整理如下,有增加的话会及时补充进来——

腾讯云 COS 的 API 对应的 IP ,开通 TCP 443
58.217.250.104
58.217.250.16
58.217.250.17
58.217.250.18
58.217.250.19
58.217.250.27
180.111.196.17

公司 Nginx 1 的 IP,开通 TCP 443、8888、9999
1*.228.1.36

公司 Nginx 2 的 IP,开通 TCP 443
131.53.47.16

阿里云及腾讯云的 DNS 的 IP,开通 UDP 53
119.29.29.29
223.5.5.5
223.6.6.6