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
192.168.4.0/24
192.168.1.0/24-192.168.4.0/24

源地址、网段、IP地址范围

dst

216.163.137.3
61.135.167.0/24
www.baidu.com

目标IP地址、网段、主机名

port

80
443
8080
20
21

目标端口

dstdomain

.qq.com
.msn.com

目标域

time

MTWHF 8:30-17:30
12:00-13:00
AS

字母表示一星期中各天的英文缩写。
MTWHF:代表星期一到星期五
AS:代表星期六和星期天

maxconn

20

每个客户机的并发连接数

url_regex

url_regex -i ^rtsp://
url_regex -i ^emule://

目标资源的URL地址,-i表示忽略大小写

urlpath_regex

urlpath_regex –i sex adult
urlpath_regex -i .mp3$

目标资源整个URL路径,-i表示忽略大小写

proto

FTP
HTTP
HTTPS

URI访问(或传输)协议

browser

Mozilla
Firefox
Opera

浏览器

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服务状态,需保持开启状态

posted @   wang-a  阅读(727)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示