一、简介

代理服务器(Proxy Server),功能就是代理网络用户去取得网络信息。

Squid是一个缓存Internet 数据的软件,其接收用户的网络申请,并自动处理所下载的数据,返回给用户。当一个用户想要下载一个主页(如米扑科技:https://mimvp.com)时,可以向Squid 发出一个申请,要Squid 代替其进行下载,然后Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid 把保存的备份立即传给用户,使用户觉得速度相当快。Squid 可以代理HTTP、FTP、GOPHER、SSL、WAIS等协议,自动地进行处理,但不能处理如POPNNTPRealAudio以及其它类型的东西,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。

centos-7-install-squid-proxy-server-0

What is Squid

Squid is a fully-featured HTTP/1.0 proxy which is almost (but not quite - we're getting there!) a fully-featured HTTP/1.1 proxy. Squid offers a rich access control, authorization and logging environment to develop web proxy and content serving applications. Squid offers a rich set of traffic optimization options, most of which are enabled by default for simpler installation and high performance.

Squid 官网http://www.squid-cache.org

 

1.1 工作流程

场景1)当代理服务器中客户端需要的数据时:

a. 客户端向代理服务器发送数据请求;

b. 代理服务器检查自己的数据缓存;

c. 代理服务器在缓存中找到了用户想要的数据,取出数据;

d. 代理服务器将从缓存中取得的数据返回给客户端。

 

场景2)当代理服务器中没有客户端需要的数据时:

1. 客户端向代理服务器发送数据请求;

2. 代理服务器检查自己的数据缓存;

3. 代理服务器在缓存中没有找到用户想要的数据;

4. 代理服务器向Internet 上的远端服务器发送数据请求;

5. 远端服务器响应,返回相应的数据;

6. 代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。

centos-7-3-an-zhuang-pei-zhi-squid-dai-li-fu-wu-qi-01

 

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

Squid

1.2 Squid 分类

按照代理类型的不同,可以将Squid 代理分为正向代理和反向代理

正向代理中,根据实现方式的不同,又可以分为普通代理和透明代理

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

官方:http://www.squid-cache.org/

文档:http://www.squid-cache.org/Doc/config/

 

二、系统环境

代理服务器操作系统:CentOS release 7.4.1708

代理服务器IP地址:58.87.90.149

测试用的浏览器:Chrome 插件 “Proxy SwitchyOmega

Squid版本:squid-3.5.20-10.el7.x86_64

测试网址:https://proxy.mimvp.com/exist.php

 

三、安装Squid服务

3.1 检查squid软件是否安装

# rpm -qa | grep squid
squid-migration-script-3.5.20-10.el7.x86_64
squid-3.5.20-10.el7.x86_64

 

3.2 如果未安装,则使用yum 方式安装

# yum -y install squid

 

3.3 设置开机自启动

# systemctl enable squid.service

 

四、Squid服务器的配置文件说明

squid 的配置文件夹为 /etc/squid/

# tree /etc/squid/
/etc/squid/
├── cachemgr.conf
├── cachemgr.conf.default
├── errorpage.css
├── errorpage.css.default
├── mime.conf
├── mime.conf.default
├── passwd
├── squid.conf
└── squid.conf.default

Squid 主要文件

服务名:        squid
主程序:         /usr/sbin/squid
配置目录:    /etc/squid
主配文件:    /etc/squid/squid.conf
监听端口号:    3128  (默认端口号,可修改)
访问日志文件:    /var/log/squid/access.log
缓存日志文件:    /var/log/squid/cache.log

 

主配置文件是 /etc/squid/squid.conf

所有squid的设定都是在这个文件里配置,下面介绍该文件的配置选项。

http_port 3128      // 设置监听的IP与端口号

cache_mem 64 MB      // 额外提供给squid使用的内存,squid的内存总占用为 X * 10+15+“cache_mem”,其中X为squid的cache占用的容量(以GB为单位),
               //比如下面的cache大小是100M,即0.1GB,则内存总占用为0.1*10+15+64=80M,推荐大小为物理内存的1/3-1/2或更多。
maximum_object_size 4 MB   // 设置squid磁盘缓存最大文件,超过4M的文件不保存到硬盘

minimum_object_size 0 KB   // 设置squid磁盘缓存最小文件

maximum_object_size_in_memory 4096 KB		// 设置squid内存缓存最大文件,超过4M的文件不保存到内存

cache_dir ufs /var/spool/squid 100 16 256	// 定义squid的cache存放路径 、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量

logformat combined %&gt;a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}&gt;h" %Ss:%Sh        // log文件日志格式

access_log /var/log/squid/access.log combined  	// log文件存放路径和日志格式

cache_log /var/log/squid/cache.log           // 设置缓存日志

logfile_rotate 60   // log轮循 60天

cache_swap_high 95  // cache目录使用量大于95%时,开始清理旧的cache

cache_swap_low 90   // cache目录清理到90%时停止。

acl localnet src 192.168.1.0/24  	// 定义本地网段

http_access allow localnet  		// 允许本地网段使用

http_access deny all  			// 拒绝所有访问

visible_hostname squid.mimvp.dev  	// 可见的主机名

cache_mgr squid@mimvp.com   // 管理员邮箱

其中:

cache_dir ufs /var/spool/squid 100 16 256
    usf:缓存数据的存储格式
        /var/spool/squid 缓存目录
        100    : 缓存目录占磁盘空间大小(M)
        16     :缓存空间一级子目录个数
        256 :缓存空间二级子目录个数

注明:以上仅做参考,最新的Squid代理配置文件,跟以上配置说明有所差异

 

Squid服务器的访问控制

使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。 Squid 访问控制有两个要素:ACL 元素和 访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。

下面列出一些重要的 ACL 元素类型

* src : 源地址 (即客户机IP地址)

* dst : 目标地址 (即服务器IP地址)

* srcdomain : 源名称 (即客户机名称)

* dstdomain : 目标名称 (即服务器名称)

* time : 一天中的时刻和一周内的一天

* url_regex : URL 规则表达式匹配

* urlpath_regex: URL-path 规则表达式匹配,略去协议和主机名

* proxy_auth : 通过外部程序进行用户验证

* maxconn : 单一 IP 的最大连接数

为了使用控制功能,必须先设置 ACL 规则并应用。

ACL 声明的格式如下:

acl   acl_element_name   type_of_acl_element   values_to_acl

示例样式:

acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

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 1025-65535  # unregistered ports
acl CONNECT method CONNECT
acl myproxy proxy_auth REQUIRED

解释说明:

1. acl_element_name 可以是任一个在 ACL 中定义的名称。

2. 任何两个 ACL 元素不能用相同的名字。

3. 每个 ACL 由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;即任一 ACL blog.mimvp.com元素的值被匹配,则这个 ACL 元素即被匹配。

4. 并不是所有的 ACL 元素,都能使用访问列表中的全部类型。

5. 不同的 ACL 元素写在不同行中,Squid 将把它们组合在一个列表中。

我们可以使用许多不同的访问条目。下面列出我们将要用到的几个:

* http_access: 允许 HTTP 访问。这个是主要的访问控制条目。

* no_cache: 定义对缓存请求的响应。

访问列表的规则由一些类似 'allow' 或 'deny' 的关键字构成,用以允许或拒绝向特定或一组 ACL 元素提供服务。

解释说明: 

1. 这些规则按照它们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束。

2. 一个访问列表可以又多条规则组成。

3. 如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。

4. 一个访问条目中的所有元素将用逻辑与运算连接:

http_access Action 声明1 AND 声明2 AND 声明 OR.

http_access Action 声明3

多个 http_access 声明间用或运算连接,但每个访问条目的元素间用与运算连接。

5. 请记住列表中的规则总是遵循由上而下的顺序。

关于ACL的知识,大家可以自行百度查阅,其他更多高级选项,请参考官方文档:http://www.squid-cache.org/Doc/config/

注意:squid2.0 和 squid3.0 的差别还是很大的,如果配置完,启动squid不正确,请大家多多参考官方文档的相应版本说明。

 

五、普通代理服务

标准的、传统的代理服务,需要客户机在浏览器中指定代理服务器的 IP地址、端口、代理协议(HTTP)

实验拓扑图如下:

centos-7-3-an-zhuang-pei-zhi-squid-dai-li-fu-wu-qi-03

 

5.1 配置Squid 代理服务器IP地址

腾讯云搭建的代理服务器外网IP地址为: 58.87.90.149

 

5.2  修改squid 主配置文件

vim /etc/squid/squid.conf

http_port 3128 
cache_mem 64 MB 
maximum_object_size 4 MB 
cache_dir ufs /var/spool/squid 100 16 256 
access_log /var/log/squid/access.log 
acl localnet src 192.168.1.0/24 
http_access allow localnet 
http_access deny all 
visible_hostname squid.mimvp.dev 
cache_mgr squid@mimvp.com

 

默认配置如下:

vim /etc/squid/squid.conf

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

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

 

5.3 初始化缓存

# squid –z

# squid -z
[root@mimvp-bj script]# 2017/09/29 18:35:26 kid1| Set Current Directory to /var/spool/squid
2017/09/29 18:35:26 kid1| Creating missing swap directories
2017/09/29 18:35:26 kid1| No cache_dir stores are configured.

检查语法错误

# squid –k parse

 

5.4 启动Squid

# systemctl start squid

 

5.5 配置Web 服务器

A. 安装Apache httpd

# rpm -qa | grep httpd
# yum -y install httpd httpd-devel

 

B. 启动Apache并加入开机启动

systemctl enable squid.service
systemctl start squid.service

 

C. 创建index.html

# echo "<h1>hello mimvp.com from 58.87.90.149</h1>" > /var/www/html/index.html

 

5.6 配置浏览器代理

1)安装Chrome插件:SwitchyOmega(SwitchySharp 升级版

2)SwichyOmega 设置代理

 

centos-7-install-squid-proxy-server-04

 

5.7 访问代理服务器测试

http://58.87.90.149

centos-7-3-an-zhuang-pei-zhi-squid-dai-li-fu-wu-qi-05

5.8 访问米扑代理网站测试

https://proxy.mimvp.com/exist.php

centos-7-3-an-zhuang-pei-zhi-squid-dai-li-fu-wu-qi-06

 

六、透明代理服务

适用于企业的网关主机,客户机不需要指定代理服务器地址、端口、协议等信息

通过iptables将客户机的Web访问数据转交给代理服务程序处理。

实验拓扑图如下:

centos-7-3-an-zhuang-pei-zhi-squid-dai-li-fu-wu-qi-07

 

6.1 修改squid 主配置文件

vim /etc/squid/squid.conf

http_port 3128 transparent 
cache_mem 64 MB 
maximum_object_size 4 MB 
cache_dir ufs /var/spool/squid 100 16 256 
access_log /var/log/squid/access.log 
acl localnet src 192.168.1.0/24 
http_access allow localnet 
http_access deny all 
visible_hostname squid.mimvp.dev 
cache_mgr squid@mimvp.com

如上,http_port 3128 后添加关键字 transparent 

http_port 3128 transparent

 

6.2  reload 重新加载 Squid

reload 让上面的配置生效。

# systemctl reload squid.service

 

6.3 添加iptables规则

需要把内部的http请求重定向到3128端口,先做一些准备工作

A. 启动iptables 服务

# systemctl start iptables.service

 

B. 清除现有iptables filter 表规则

## delete all
#
iptables -P INPUT ACCEPT
# iptables -F

# /etc/init.d/iptables save
# /etc/init.d/iptables restart

注意:执行 iptables -F 命令之前,

推荐必须先执行 iptables -P INPUT ACCEPT

否则可能导致远程连接掉线,连接不上远程服务器

 

C. 查看nat 表设置

# iptables -t nat -L -n

# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     

 

D. 在nat表中新增一条规则

# iptables -t nat -I PREROUTING -i eth0 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128

删除 nat 规则

## delte line-number of nat
# iptables -t nat -vnL PREROUTING --line-number
# iptables -t nat -D PREROUTING 1
# /etc/init.d/iptables save
# /etc/init.d/iptables restart

 

E. 保存

# /etc/init.d/iptables save

保存后,再次查看 iptables

# iptables -t nat -L -n

# iptables -t nat -L -n    
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  192.168.1.0/24       0.0.0.0/0           tcp dpt:80 redir ports 3128 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

 

F. 设置iptables 开机启动

# systemctl enable iptables.service

 

6.4 取消代理设置,测试

# curl "http://58.87.90.149" 
<h1>hello mimvp.com from 58.87.90.149</h1>

透明代理测试成功。

 

七、反向代理服务

Squid反向代理机制,可以为Internet用户访问企业Web站点,提供缓存加速。

实验拓扑图如下:

centos-7-3-an-zhuang-pei-zhi-squid-dai-li-fu-wu-qi-08

 

7.1 关闭防火墙

# systemctl stop iptables.service

 

7.2 修改Web Server 主页

58.87.90.149 服务器上执行命令:

# echo "<h1>hello mimvp.com from 58.87.90.149</h1>" > /var/www/html/index.html

211.159.166.225 服务器上执行命令:

# echo "<h1>hello mimvp.com from 211.159.166.225</h1>" > /var/www/html/index.html

 

7.3 配置squid 

http_port 80 accel vhost 
http_access allow all 
cache_peer 58.87.90.149 parent 80 0 originserver round-robin weight=1 
cache_peer 211.159.166.225 parent 80 0 originserver round-robin weight=1 
visible_hostname squid.mimvp.dev 
cache_mgr squid@mimvp.com

 

7.4 启动Squid服务

如果 squid启动失败,则是因为上面设定了squid的监听端口是80,和系统的http服务冲突,所以要将http服务停掉。

systemctl stop httpd.service           // 先关闭 httpd

systemctl start squid.service          // 然后开启 squid

 

7.5 测试

squid 采用了round-robin,所以客户端的访问将轮询两台web服务器,采用 "Ctrl + F5" 来强制刷新测试。

 

 

八、实际应用

下面实验将模拟通过不同的域名访问不同的机器,简单实现企业应用中的负载均衡。客户端在浏览器地址栏中输入www.squid.dev,将访问192.168.1.18这台机器,访问bbs.squid.dev,将访问192.168.1.19这台机器。

实验拓扑图如下:

centos-7-3-an-zhuang-pei-zhi-squid-dai-li-fu-wu-qi-11

 

8.1 修改Web Server 主页

58.87.90.149 服务器上执行命令:

# echo "<h1>hello mimvp.com from 58.87.90.149</h1>" > /var/www/html/index.html

211.159.166.225 服务器上执行命令:

# echo "<h1>hello mimvp.com from 211.159.166.225</h1>" > /var/www/html/index.html

 

8.2 配置Squid

http_port 80 accel vhost 
http_access allow all 
cache_peer 192.168.1.18 parent 80 0 originserver name=www 
cache_peer 192.168.1.19 parent 80 0 originserver name=bbs 
cache_peer_domain www www.squid.dev 
cache_peer_domain bbs bbs.squid.dev 
visible_hostname squid.mimvp.dev 
cache_mgr squid@mimvp.com

 

 

参考推荐

CentOS 7安装squid代理服务器

浏览器设置代理的插件

Linux shell脚本通过expect实现自动输入密码