Linux--Squid代理服务器(2)
Squid-构建透明代理服务器
四、构建透明代理服务器
1. 服务器配置
服务器 | 主机名 | IP地址 | 主要软件 |
Squid服务器 | squid_server | 内网ens34:192.168.10.2 外网ens33:192.168.42.139 | squid |
Web服务器 | web_server | ens33:192.168.42.138 | apache |
Win10客户端 | 192.168.10.1 | QQ浏览器 |
2. Squid服务器部署
2.1 修改Squid配置文件
2.2 开启路由转发,实现本机中不同网段的地址转发
2.3 修改防火墙规则
清空iptables规则,转发http和https协议,将访问端口重定向到3128,定义防火墙入站规则,允许3128的连接请求
3. 客户端访问测试
win10客户机测试
centos7客户机图形化测试

3.1 查看Squid访问日志的新增记录
来自客户端192.168.122.222前往web服务器12.0.0.12的访问请求。
第一次访问缓存后,第二次访问直接返回的squid服务器中的缓存数据,客户端的响应速度得到了很大的提升。
3.2 查看Web访问日志的新增记录
访问记录来自于squid代理服务器的外网卡,使得服务端无法得知客户的真实IP。
五、构建反向代理服务器
1. 服务器配置
服务器 | 主机名 | IP地址 | 主要软件 |
Squid服务器 | squid_server | 192.168.122.10 | squid |
Web1服务器 | web_server1 | 192.168.122.11 | apache |
Web2服务器 | web_server2 | 192.168.122.12 | apache |
Win10客户端 | 192.168.122.222 | edge浏览器 |
2. 配置Squid服务器
2.1 修改squid配置文件
[root@squid_server ~]# vim /etc/squid.conf
##60行,插入
http_port 192.168.122.10:80 accel vhost vport
http_port 192.168.122.10:443 accel vhost vport
cache_peer 192.168.122.11 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
cache_peer 192.168.122.12 parent 80 0 no-query originaservr round-robin max_conn=30 weight=1 name=web2
cache_peer_domain web1 web2 www.test.com
##表示对www.test.com的请求,squid向192.168.122.11和192.168.122.12的80端口发出请求
http_port 192.168.122.10:80 accel vhost vport
表示squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,同时和web服务器的请求端口(vhost vport)绑定,这个时候请求到了squid,squid是不用转发请求的,而是直接要么从缓存中拿数据要么向绑定的端口直接请求数据。
accel:反向代理加速模式
vhost:支持域名或主机名来表示代理节点
vport:支持IP和端口来表示代理节点
cache_peer 192.168.122.11 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
parent:代表父节点,上下关系,非平级关系
80:代理内部web服务器的80端口
0:没有使用icp(电信运营商),表示就一台squid服务器
no-query:不做查询操作,直接获取数据
originserver:指定是源服务器
ronud-robin:指定squid通过轮询的方式将请求分发到其中一台父节点
max_conn:指定最大连接数
weight:指定权重
name:设置别名
2.2 腾出80端口,清空无效的路由规则
[root@squid_server ~]# systemctl stop httpd
[root@squid_server ~]# netstat -natp | grep ":80"
[root@squid_server ~]# iptables -F
[root@squid_server ~]# iptables -t nat -F
3. Web服务器页面准备
web_server1(192.168.122.11)
[root@web_server1 ~]# yum install -y httpd
[root@web_server1 ~]# systemctl start httpd
[root@web_server1 ~]# echo "this is a web_server1" > /var/www/html/index.html
web_server2(192.168.122.12)
[root@web_server2 ~]# yum install -y httpd
[root@web_server2 ~]# systemctl start httpd
[root@web_server2 ~]# echo "this is web_server2_test" > /var/www/html/index.html
4. 客户端访问测试
4.1 添加主机映射
前往C:\Windows\System32\drivers\etc,修改hosts文件
4.2 访问www.test.com测试

4.3 查看squid访问记录
[root@squid_server ~]# tail -f /usr/local/squid/var/logs/access.log
1631232033.287 6 192.168.122.222 TCP_MISS/200 361 GET http://www.test.com/ - ROUNDROBIN_PARENT/192.168.122.12 text/html
1631232033.380 3 192.168.122.222 TCP_MISS/404 464 GET http://www.test.com/favicon.ico - ROUNDROBIN_PARENT/192.168.122.11 text/html
1631232513.921 1 192.168.122.222 TCP_REFRESH_UNMODIFIED/304 225 GET http://www.test.com/ - ROUNDROBIN_PARENT/192.168.122.12 -
1631232604.228 4 192.168.122.222 TCP_REFRESH_UNMODIFIED/304 225 GET http://www.test.com/ - ROUNDROBIN_PARENT/192.168.122.12 -
1631232659.196 1 192.168.122.222 TCP_REFRESH_MODIFIED/200 361 GET http://www.test.com/ - ROUNDROBIN_PARENT/192.168.122.11 text/html
第一轮访问为TCP_MISS,说明没有缓存数据并GET网站静态资源,且两次访问都是RR轮询,访问结果分别是web2和web1。
第二轮访问为TCP_REFRESH_UNMODIFIED,说明squid服务器中已有网页资源,并直接向客户端返回网页数据。
4.4 查看Web服务器访问记录
web_server1
[root@web_server1 ~]# tail -f /var/log/httpd/access_log
192.168.122.10 - - [10/Sep/2021:08:00:33 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://www.test.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
192.168.122.10 - - [10/Sep/2021:08:10:59 +0800] "GET / HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
web_server2
[root@web_server2 ~]# tail -f /var/log/httpd/access_log
192.168.122.10 - - [10/Sep/2021:08:00:33 +0800] "GET http://www.test.com/ HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
192.168.122.10 - - [10/Sep/2021:08:08:33 +0800] "GET http://www.test.com/ HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
192.168.122.10 - - [10/Sep/2021:08:10:04 +0800] "GET http://www.test.com/ HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38"
访问请求来自于squid代理服务器,无法查看到客户端ip。
4.5 客户端抓包
六、ACL访问控制
1. ACL访问控制方式
● 根据源地址、目标URL、文件类型等定义列表
格式为:acl 列表名称 列表类型 列表内容 ...
● 针对已定义的acl列表进行限制
格式为:http_access allow或deny 列表名称 ...
2. ACL规则优先级
● 一个用户访问代理服务器时,Squid会以从上至下的顺序匹配Squid中定义的所有规则列表,一旦匹配成功,立即停止匹配
● 所有规则都不匹配时,Squid会使用与最后一条相反的规则
3. ACL的定义步骤
在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现呢:
(1)通过acl配置项定义需要控制的条件;
(2)通过http_access对已定义的列表做"允许"或"拒绝"访问的控制。
4. 常用的列表类型
列表类型 | 列表内容示例 | 说明 |
src | 192.168.4.1 | 源地址、网段、IP地址范围 |
dst | 216.163.137.3 | 目标IP地址、网段、主机名 |
port | 80 | 目标端口 |
dstdomain | .qq.com | 目标域 |
time | MTWHF 8:30-17:30 | 字母表示一星期中各天的英文缩写。 |
maxconn | 20 | 每个客户机的并发连接数 |
url_regex | url_regex -i ^rtsp:// | 目标资源的URL地址,-i表示忽略大小写 |
urlpath_regex | urlpath_regex –i sex adult | 目标资源整个URL路径,-i表示忽略大小写 |
proto | FTP | URI访问(或传输)协议 |
browser | Mozilla | 浏览器 |
4.1 src(推荐使用)
IP地址在访问控制元素里是最普遍使用的。大部分站点使用IP地址来控制客户允许或不允许访问Squid。src类型指客户源IP地址。也就是说,当src ACL出现在访问控制列表里时,squid将它与发布请求的客户IP地址进行比较。
正常情况下你允许来自内网中主机的请求,并阻塞其他的。例如,假如你的单位使用192.168.0.0子网,你可以这样指定ACL:
acl MyNetwork src 192.168.0.0
假如你有许多子网,你能在同一个acl行里面列举它们:
acl MyNetwork src 192.168.0.0 10.0.1.0/24 10.0.5.0/24 172.16.0.0/12
squid有许多其他ACL类型用以检查客户地址。srcdomain类型比较客户的完整可验证域名。它要求反向DNS查询,这可能会延缓处理该请求。srcdom_regex ACL是类似的,但它允许你使用正则表达式来匹配域名。最后,src_as类型比较客户的AS号。
4.2 dst(不推荐使用)
dst类型指向原始服务器(目标)IP地址。在某些情况下,你能使用该类型来阻止你的用户访问特定web站点。然而,在使用dst ACL时你须谨慎。大部分squid接受到的请求有原始服务器主机名。例如:
GET http://www.web-cache.com/ HTTP/1.0
这里,www.web-cache.com是主机名。当访问列表规则包含了dst元素时,squid必须找到该主机名的IP地址。假如squid的IP缓存包含了该主机名的有效接口,这条ACL被立即检测。否则,在DNS查询忙碌时,squid会延缓处理该请求。这对某些请求来说会造成延时。为了避免延时,你该尽可能的使用dstdomain ACL类型来代替dst。
如下是简单的dst ACL示例:
acl AdServers dst 1.2.3.0/24
请注意,dst ACL存在的问题是,你试图允许或拒绝访问的原始服务器可能会改变它的IP地址。假如你不关心这样的改变,那就不必麻烦去升级squid.conf。你可以在acl行里放上主机名,但那样会延缓启动速度。假如你的ACL需要许多主机名,你也许该预处理配置文件,将主机名转换成IP地址。
4.3 dstdomain(推荐使用)
在某些情况下,你发现基于名字的访问控制非常有用。你可以使用它们去阻塞对某些站点的访问,去控制squid如何转发请求,以及让某些响应不可缓存。dstdomain之所以非常有用,是因为它检查请求url里的主机名。然而首先我想申明如下两行的不同:
acl A dst www.squid-cache.org (这个其实是IP地址)
acl B dstdomain www.squid-cache.org
A实际上是IP地址ACL。当Squid解析配置文件时,它查询www.squid-cache.org的IP地址,并将它们存在内存里。它不保存名字。假如在squid运行时IP地址改变了,squid会继续使用旧的地址。
然而dstdomain ACL以域名形式存储,并非IP地址。当squid检查ACL B时,它对URL的主机名部分使用字符串比较功能。在该情形下,它并不真正关心是否www.squid-cache.org的IP地址改变了。
使用dstdomain ACL的主要问题是某些URL使用IP地址代替主机名。假如你的目标是使用dstdomain ACL来阻塞对某些站点的访问,聪明的用户能手工查询站点的IP地址,然后将它们放在URL里。例如,下面的2行URL带来同样的页面:
http://www.squid-cache.org/docs/FAQ/ http://206.168.0.9/docs/FAQ/
第一行能被dstdomain ACL轻易匹配,但第二行不能。这样,假如你依靠dstdomain ACL,你也该同样阻塞所有使用IP地址代替主机名的请求。
4.4 srcdomain(不推荐使用)
srcdomain ACL也有点麻烦。它要求对每个客户IP地址进行所谓的反向DNS查询。技术上,squid请求对该地址的DNS PTR记录。DNS的响应--完整可验证域名(FQDN)--是squid匹配ACL值的东西。(请参考O'Reilly's DNS and BIND找到更多关于DNS PTR记录的信息)使用dst ACL,FQDN查询会导致延时。请求会被延缓处理直到FQDN响应返回。FQDN响应被缓存下来,所以srcdomain查询通常仅在客户首次请求时延时。
不幸的是,srcdomain查询有时不能工作。许多组织并没有保持他们的反向查询数据库与日更新。假如某地址没有PTR记录,ACL检查失败。在该情形下,请求可能会延时非常长时间(例如2分钟)直到DNS查询超时。假如你使用srcdomain ACL,请确认你自己的DNS in-addr.arpa区域配置正确并且在工作中。假如这样,你可以使用如下的ACL:
acl LocalHosts srcdomain .users.example.com
4.5 proto
该类型指URI访问(或传输)协议。如下是有效值:http, https (same as HTTP/TLS), ftp, gopher, urn, whois, 和cache_object。也就是说,这些是被squid支持的URL机制名字。例如,假如你想拒绝所有的FTP请求,你可以使用下列指令:
acl FTP proto FTP
http_access deny FTP
cache_object机制是squid的特性。它用于访问squid的缓存管理接口。默认的squid.conf文件有许多行限制缓存管理访问:
acl Manager proto cache_object
acl Localhost src 127.0.0.1
http_access allow Manager Localhost
http_access deny Manager
这些配置行仅允许来自本机地址的缓存管理请求,所有其他的缓存管理请求被拒绝。这意味着在squid机器上有帐号的人,能访问到潜在的敏感缓存管理信息。你也许想修改缓存管理访问控制,或对某些页面使用密码保护
4.6 time
time ACL允许你控制基于时间的访问,时间为每天中的具体时间,和每周中的每天。日期以单字母来表示,见如下表。时间以24小时制来表示。开始时间必须小于结束时间,这样在编写跨越0点的time ACL时可能有点麻烦。
S:Sunday
M:Monday
T:Tuesday
W:Wednesday
H:Thursday
F:Friday
A:Saturday
D:All weekdays (M-F)
可以这样写:
acl Working_hours MTWHF 08:00-17:00
or:
acl Working_hours D 08:00-17:00
另外,你可以这样写:
acl Peak 04:00-20:00
http_access allow !Peak
你不应该在同一个time ACL里放置多个日期和时间范围列表。对这些ACL的解析不一定是你想象的那样。例如,假如你输入:
acl Blah time M 08:00-10:00 W 09:00-11:00
实际能做到的是:
acl Blah time MW 09:00-11:00
解析仅仅使用最后一个时间范围。正确的写法是,将它们写进两行:
acl Blah time M 08:00-10:00
acl Blah time W 09:00-11:00
4.7 maxconn
maxconn ACL指来自客户IP地址的大量同时连接。某些squid管理员发现这是个有用的方法,用以阻止用户滥用代理或者消耗过多资源。
maxconn ACL在请求超过指定的数量时,会匹配这个请求。因为这个理由,你应该仅仅在deny规则里使用maxconn。考虑如下例子:
acl OverConnLimit maxconn 4
http_access deny OverConnLimit
在该情况中,squid允许来自每个IP地址的同时连接数最大为4个。当某个客户发起第五个连接时,OverConnLimit ACL被匹配,http_access规则拒绝该请求。
4.8 srcdom_regex
srcdom_regex ACL允许你使用正则表达式匹配客户域名。这与srcdomain ACL相似,它使用改进的的子串匹配。相同的限制是:某些客户地址不能反向解析到域名。作为示例,下面的ACL匹配以dhcp开头的主机名:
acl DHCPUser srcdom_regex -i ^dhcp
因为领头的^符号,该ACL匹配主机名dhcp12.example.com,但不匹配host12.dhcp.example.com
4.9 dstdom_regex
dstdom_regex ACL也与dstdomain相似。下面的例子匹配以www开头的主机名:
acl WebSite dstdom_regex -i ^www.
如下是另一个有用的正则表达式,用以匹配在URL主机名里出现的IP地址:
acl IPaddr dstdom_regex [0-9]$
这样可以工作,因为squid要求URL主机名完全可验证。既然全局顶级域名中没有以数字结尾的,该ACL仅仅匹配IP地址,它以数字结尾。
4.10 url_regex
url_regex ACL用于匹配请求URL的任何部分,包括传输协议和原始服务器主机名。例如,如下ACL匹配从FTP服务器的MP3文件请求:
acl FTPMP3 url_regex -i ^ftp://.*.mp3$
4.11 urlpath_regex
urlpath_regex与url_regex非常相似,不过传输协议和主机名不包含在匹配条件里。这让某些类型的检测非常容易。例如,假设你必须拒绝URL里的"sex",但仍允许在主机名里含有"sex"的请求,那么这样做:
acl Sex urlpath_regex sex
另一个例子,假如你想特殊处理cgi-bin请求,你能这样捕获它们:
acl CGI1 urlpath_regex ^/cgi-bin
当然,CGI程序并非总在/cgi-bin/目录下,这样你应该编写其他的ACL来捕获它们。
4.12 browser
大部分HTTP请求包含了User-Agent头部。该头部的值典型如下:
Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686)
browser ACL对user-agent头执行正则表达式匹配。例如,拒绝不是来自Mozilla浏览器的请求,可以这样写:
acl Mozilla browser Mozilla
http_access deny !Mozilla
在使用browser ACL之前,请确认你完全理解cache接受到的User-Agent字符串。某些user-agent与它们的来源相关。甚至squid可以重写它转发的请求的User-Agent头部。某些浏览器例如Opera和KDE的Konqueror,用户可以对不同的原始服务器发送不同的user-agent字串,或者干脆忽略它们。
5. 对象列表管理
5.1 创建列表管理
[root@squid_server ~]# mkdir /etc/squid
[root@squid_server ~]# vim /etc/squid/dest.list
#创建列表文件
12.0.0.12
192.168.122.0/24
[root@squid_server ~]# vim /etc/squid.conf
……
acl destinationhost dst "/etc/squid/dest.list"
#调用指定文件中的列表内容
……
http_access deny(或allow) destinationhost
#注意,如果是拒绝列表,需要放在http_access allow all之前
[root@squid_server ~]# systemctl restart squid
5.2 客户端访问测试
http_access deny destinationhost
http_access allow destinationhost
七、Squid日志分析--sarg软件的安装及应用
1. 安装图像处理软件包
2. 源码编译安装sarg
指定配置文件目录并添加额外的安全保护
安装sarg
3. 修改配置文件/etc/sarg/sarg.conf
7行,取消注释
access_log /usr/local/squid/var/logs/access.log ##指定访问日志文件
如果是yum安装的squid,第7行为
access_log /var/log/squid/access.log
25行,取消注释(并修改)
title "Squid User Access Reports" ##网页标题,可自定义修改
120行,取消注释(并修改)
output_dir /var/www/html/sarg ##报告输出目录,可自定义修改
178行,取消注释
user_ip no ##使用用户名显示
184行,取消注释并修改
topuser_sort_field connect reverse ##top排序中,指定连接次数采用降序排列,升序是normal
190行,取消注释并修改
user_sort_field connect reverse ##对于用户访问记录,连接次数按降序排列
206行,取消注释并修改
exclude_hosts /usr/local/sarg/noreport ##指定不计入排序的站点列表的文件,需自行创建,必须有该文件(可为空文件),否则会报错
257行,取消注释
overwrite_report no ##同名同日期的日志是否覆盖
289行,取消注释并修改
mail_utility mailq.postfix ##发送邮件报告命令
434行,取消注释并修改
charset UTF-8 ##指定字符集UTF-8
518行,取消注释
weekdays 0-6 ##top排行的周期周期,0表示周日
525行,取消注释
hours 0-23 ##top排行的时间周期
633行,取消注释(并修改)
www_document_root /var/www/html ##指定网页根目录,务必为当前网页服务的根目录
4. 创建不计入站点文件,添加的域名将不被显示在排序中
5. 创建软链接到PATH路径
6. 安装apache并生成sarg
7. 浏览器访问查看
通过浏览器访问Squid服务器,查看sarg报告网页
再执行2遍sarg
多了2个文件
点进去看看,很好奇
可以看见访问用户记录
用户访问记录
点一个
我直呼内行
牛!
8. 添加计划任务,执行每天生成报告
8.1 编写执行脚本
8.2 添加计划任务
分时日月周,添加计划性任务
查看计划性任务列表,查看crond服务状态,需保持开启状态

浙公网安备 33010602011771号