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服务
$ yum -y install squid openssl # 安装squid及openssl
$ cat /etc/squid/squid.conf # 编写配置文件如下
# 定义允许哪些网段可以访问此代理,根据实际修改,可以写多行
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
# 定义可以代理的端口,根据实际修改,基本下面的就够用
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 85
cache_dir ufs /var/spool/squid 100 16 256
logformat squid_custom_log [%tl] %>Hs %>a [%<a] "%rm %ru HTTP/%rv" %Ss:%Sh "%{User-Agent}>h"
access_log daemon:/var/log/squid/access.log squid_custom_log
coredump_dir /usr/local/squid/var/cache/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
关于squid支持的指令及解释,请参考官方文档,基本上面的配置就够用了,squid支持的其他指令都有默认值,使用默认值即可。
这里需要注意下,当squid应用运行了一段时间以后,cache_dir对应目录下的swap.state文件就会变得越来越大,里面的无效接口数据越来越多,这可能影响squid的响应时间,可以配置计划任务,定时清空文件。
启动squid
# 设置为开机自启并启动squid服务
$ systemctl enable squid && systemctl start squid
$ ss -lnput | grep -w 85 # 确定端口在监听
tcp LISTEN 0 128 :::85 :::* users:(("squid",pid=2912,fd=16))
客户端测试
以下操作在客户端上进行配置
# 将http代理及https代理指定为squid监听端口写入环境变量并重载配置文件
$ cat >> /etc/profile << EOF
export http_proxy=192.168.20.6:85
export https_proxy=192.168.20.6:85
EOF
$ source /etc/profile
# 也可以不写入环境变量,临时使用,自行琢磨吧。
# 执行下面的指令,测试是否可以正常下载
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-x86_64.rpm
wget http://nginx.org/download/nginx-1.18.0.tar.gz
客户端只要可以正常下载,则表明squid没问题。
docker方式运行squid
我将Dockerfile打了个包,如果需要,请点此下载(提取码: 36gt,参考目录下的readme.md文件进行使用)。
注:docker版本需在18.xx以上,版本过低可能会报错。
squid维护指令
# 初始化你在squid.conf里配置的cache目录
squid -z
如果有错误提示,请检查你的 cache目录的权限。
# 验证 squid.conf 的语法和配置。
squid -k parse
如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,尝试启动squid。
# 在前台启动squid,并输出启动过程。
/usr/local/squid/sbin/squid -N -d1
如果有ready to server reques相关信息,说明Squid启动成功。
然后 ctrl + c,停止squid,并以后台运行的方式启动它。
# 启动squid在后台运行。
squid -s
# 停止 squid
squid -k shutdown
# 重引导修改过的 squid.conf
squid -k reconfigure -f /XXX/squid.conf
当squid进行过配置更改后,可以使用该命令进行squid配置重载。
# squid命中率分析
/usr/local/squid/bin/squidclient -p 80 mgr:info
/usr/local/squid/bin/squidclient -p 80 mgr:5min
可以看到详细的性能情况,其中PORT是你的proxy的端口,5min可以是60min
# 取得squid运行状态信息
squidclient -p 80 mgr:info
# 取得squid内存使用情况
squidclient -p 80 mgr:mem
# 取得squid已经缓存的列表
squidclient -p 80 mgr:bjects. use it carefully,it may crash
# 取得squid的磁盘使用情况
squidclient -p 80 mgr:diskd
# 强制更新某个url
squidclient -p 80 -m PURGE http://www.xxx.com/xxx.php