title: squid配置正向代理 #标题tags: squid正向代理 #标签
categories: linux大杂烩 # 分类
date: 2020-06-26

用于记录下squid配置正向代理的过程。
需求描述: 需要一台可以同时访问外网和内网的主机作为正向代理,代理内网主机与外网通信。这里以squid来实现。

squid介绍

Squid是一个缓存Internet数据的软件,其接收用户的下载申请,并自动处理所下载的数据。当一个用户想要下载一个主页时,可以向Squid 发出一个申请,要Squid代替其进行下载,然后Squid连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议并且Squid 可以自动地进行处理,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。

Squid代理服务器工作在TCP/IP的应用层。

squid分类

按照代理类型的不同,可以将Squid代理分为正向代理和反向代理,正向代理中,根据实现方式的不同,又可以分为普通代理和透明代理。

  • 普通代理:需要客户机在浏览器中指定代理服务器的地址、端口;
  • 透明代理:适用于企业的网关主机(共享接入Internet)中,客户机不需要指定代理服务器地址、端口等信息,代理服务器需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理;
  • 反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。不建议使用squid来作为反向代理服务器,如果需要反向代理,还是使用nginx、haproxy等产品比较好。

配置squid服务

  1. $ yum -y install squid openssl # 安装squid及openssl
  2. $ cat /etc/squid/squid.conf # 编写配置文件如下
  3. # 定义允许哪些网段可以访问此代理,根据实际修改,可以写多行
  4. acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
  5. acl localnet src fc00::/7 # RFC 4193 local private network range
  6. # 定义可以代理的端口,根据实际修改,基本下面的就够用
  7. acl SSL_ports port 443
  8. acl Safe_ports port 80 # http
  9. acl Safe_ports port 21 # ftp
  10. acl Safe_ports port 443 # https
  11. acl Safe_ports port 70 # gopher
  12. acl Safe_ports port 210 # wais
  13. acl Safe_ports port 1025-65535 # unregistered ports
  14. acl Safe_ports port 280 # http-mgmt
  15. acl Safe_ports port 488 # gss-http
  16. acl Safe_ports port 591 # filemaker
  17. acl Safe_ports port 777 # multiling http
  18. acl CONNECT method CONNECT
  19. http_access allow localnet
  20. http_access allow localhost
  21. http_access deny all
  22. http_port 85
  23. cache_dir ufs /var/spool/squid 100 16 256
  24. logformat squid_custom_log [%tl] %>Hs %>a [%<a] "%rm %ru HTTP/%rv" %Ss:%Sh "%{User-Agent}>h"
  25. access_log daemon:/var/log/squid/access.log squid_custom_log
  26. coredump_dir /usr/local/squid/var/cache/squid
  27. refresh_pattern ^ftp: 1440 20% 10080
  28. refresh_pattern ^gopher: 1440 0% 1440
  29. refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
  30. refresh_pattern . 0 20% 4320

关于squid支持的指令及解释,请参考官方文档,基本上面的配置就够用了,squid支持的其他指令都有默认值,使用默认值即可。

这里需要注意下,当squid应用运行了一段时间以后,cache_dir对应目录下的swap.state文件就会变得越来越大,里面的无效接口数据越来越多,这可能影响squid的响应时间,可以配置计划任务,定时清空文件。

启动squid

  1. # 设置为开机自启并启动squid服务
  2. $ systemctl enable squid && systemctl start squid
  3. $ ss -lnput | grep -w 85 # 确定端口在监听
  4. tcp LISTEN 0 128 :::85 :::* users:(("squid",pid=2912,fd=16))

客户端测试

以下操作在客户端上进行配置

  1. # 将http代理及https代理指定为squid监听端口写入环境变量并重载配置文件
  2. $ cat >> /etc/profile << EOF
  3. export http_proxy=192.168.20.6:85
  4. export https_proxy=192.168.20.6:85
  5. EOF
  6. $ source /etc/profile
  7. # 也可以不写入环境变量,临时使用,自行琢磨吧。
  8. # 执行下面的指令,测试是否可以正常下载
  9. wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-x86_64.rpm
  10. wget http://nginx.org/download/nginx-1.18.0.tar.gz

客户端只要可以正常下载,则表明squid没问题。

docker方式运行squid

我将Dockerfile打了个包,如果需要,请点此下载(提取码: 36gt,参考目录下的readme.md文件进行使用)。

注:docker版本需在18.xx以上,版本过低可能会报错。

squid维护指令

  1. # 初始化你在squid.conf里配置的cache目录
  2. squid -z
  3. 如果有错误提示,请检查你的 cache目录的权限。
  4. # 验证 squid.conf 的语法和配置。
  5. squid -k parse
  6. 如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,尝试启动squid
  7. # 在前台启动squid,并输出启动过程。
  8. /usr/local/squid/sbin/squid -N -d1
  9. 如果有ready to server reques相关信息,说明Squid启动成功。
  10. 然后 ctrl + c,停止squid,并以后台运行的方式启动它。
  11. # 启动squid在后台运行。
  12. squid -s
  13. # 停止 squid
  14. squid -k shutdown
  15. # 重引导修改过的 squid.conf
  16. squid -k reconfigure -f /XXX/squid.conf
  17. squid进行过配置更改后,可以使用该命令进行squid配置重载。
  18. # squid命中率分析
  19. /usr/local/squid/bin/squidclient -p 80 mgr:info
  20. /usr/local/squid/bin/squidclient -p 80 mgr:5min
  21. 可以看到详细的性能情况,其中PORT是你的proxy的端口,5min可以是60min
  22. # 取得squid运行状态信息
  23. squidclient -p 80 mgr:info
  24. # 取得squid内存使用情况
  25. squidclient -p 80 mgr:mem
  26. # 取得squid已经缓存的列表
  27. squidclient -p 80 mgr:bjects. use it carefully,it may crash
  28. # 取得squid的磁盘使用情况
  29. squidclient -p 80 mgr:diskd
  30. # 强制更新某个url
  31. squidclient -p 80 -m PURGE http://www.xxx.com/xxx.php