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服务状态,需保持开启状态
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构