Squid 代理服务器的应用
一、Squid代理服务器的概述
squid 作为一款服务器代理工具,可以缓存网页对象,减少重复请求,从而达到加快网页访问速度,隐藏客户机真实IP,更为安全。
Squid主要提供缓存加速、应用层过滤控制的功能
1、squid代理的工作机制:
• 代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址
• 将获得的网页数据(静态 web元素)保存到缓存中并发给客户机,以便下次请求相同的数据时快速响应
当我们客户机通过squid代理去访问web页面时,指定的代理服务器会先检查自己的缓存,若是缓存中有我们客户机需要的页面,那么squid服务器将直接把缓存中的页面内容返回给客户机
如果缓存中没有客户端请求的页面,那么squid代理服务器就会向internet发送访问请求,获得返回的web页面后,将网页的数据保存到缓存中并发送给客户机。
由于客户机的web访问请求实际上是squid代理服务器来代替完成的,所以隐藏了用户的真实IP地址,从而起到一定的保护作用。
另一方面,squid也可以针对要访问的目标、客户机的地址、访问的时间段进行过滤控制。
2、squid代理的基本类型
① 传统代理:适用于internet,需在客户机指定代理服务器的地址和端口
② 透明代理:客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将web访问重定向给代理服务器处理
③ 反向代理:如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的web服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存(静态)在本地,供下一个请求者使用
根据实现的方式不同,基本可以分为传统代理和透明代理两种方式:
传统代理:也就是普通的代理服务,需要我们客户端在浏览器、聊天工具等一些程序中设置代理服务器的地址和端口,然后才能使用代理来访问网络,这种方式相比较而言比较麻烦,因为客户机还需手动指定代理服务器,所以一般用于Internet环境。
透明代理:与传统代理实现的功能是一样的,区别在于客户机不需要手动指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将web访问重定向,实际上仍然交给代理服务器来处理,重定向的过程完全是由squid服务器进行的,所以对于客户机来说,甚至不知道自己使用了squid代理服务,因此呢,我们称之为透明模式。
透明代理多用于局域网环境,如在Linux网关中启用透明代理后,局域网主机无须进行额外设置就能享受更好的上网速度。
3、squid代理的工作模式图解
3.1、传统模式:
此类工作模式为三种模式中最简单的构成,对客户端配置较不友好,主要功能为正向代理,加速内网用户的访问速度,减少出口流量。
(如果搭建公用的代理服务器,用这样方式,需要用户进入其本机的网络设置中,设置搭建了squid服务器的IP和端口)
3.2、透明模式:
此类工作模式配置较为复杂,同样也是实现正向代理需要借助防火墙对端口进行重定向操作。但是对于客户端来说配置较为友好无需进行任何配置即可使用代理功能,主要功能为加速内网用户的访问速度,减少出口流量。
(如果搭建内网访问外网的代理服务器,建议使用这种,无需到客户端设置代理服务器的IP和端口,自动实现squid代理)
3.3、反向代理模式:
反向代理模式位于本地WEB服务器和公网之间,处理公网用户发起的请求,并代理至内网服务中,有效减轻后端真是服务器的压力,增加服务器的并发处理能力
4、使用squid代理的好处
• 提高web访问速度
• 隐藏客户机的真实IP地址
二、Squid代理服务器的编译安装及运行
1、Squid代理服务器的编译安装及运行的操作步骤
首先关闭防火墙和SElinux
1
2
3
|
systemctl stop firewalld systemctl disable firewalld setenforce 0 |
1.1、编译安装Squid
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#安装依赖环境 yum -y install gcc gcc -c++ make #上传软件包squid-3.5.27. tar到/opt目录下 cd /opt #解压 tar zxvf squid-3.5.27. tar .gz #配置相关模块 cd squid-3.5.27/ . /configure --prefix= /usr/local/squid \ --sysconfdir= /etc \ -- enable -arp-acl \ -- enable -linux-netfilter \ -- enable -linux-tproxy \ -- enable -async-io=100 \ -- enable -err-language= "Simplify_Chinese" \ -- enable -underscore \ -- enable -poll \ -- enable -gnuregex # 编译安装 make && make install ----------------------------------------------- ####_上述脚本解释### . /configure --prefix= /usr/local/squid ##安装目录 --sysconfdir= /etc/ ##单独将配置文件修改到/etc目录下 -- enable -arp-acl ##可在ACL中设置通过MAC地址进行管理,防止IP欺骗 -- enable -1inux-netfilter ##使用内核过滤 -- enable -linux-tproxy ##支持透明模式 -- enable -async-io=100 ##异步I/O,提升储存性能,值可修改 -- enable -err-language= "Simplify_Chinese" ##错误信息的显示语言 -- enable -underscore ##允许URL中有下划线 - enable -poll ##使用Poll () 模式,提升性能 -- enable -gnuregex ##使用GNU正则表达式 |
1
2
3
4
5
6
|
ln -s /usr/local/squid/sbin/ * /usr/local/sbin ##创建链接文件,优化路径 useradd -M -s /sbin/nologin squid ###创建程序用户、组 chown -R squid:squid /usr/local/squid/var/ ##改变目录属主,此目录用来存放缓存文件 |
1.2、修改Squid的配置文件
1
2
3
4
5
6
7
8
9
10
|
vim /etc/squid .conf ...... -----56行--插入------ http_access allow all #放在http_access deny all 之前,允许任意客户机使用代理服务,控制规则自上而下匹配 http_access deny all http_port 3128 #用来指定代理服务监听的地址和端口(默认的端口号为3128) -----61行--插入------ cache_effective_user squid #添加,指定程序用户,用来设置初始化、运行时缓存的账号,否则启动不成功 cache_effective_group squid #添加,指定账号基本组 coredump_dir /usr/local/squid/var/cache/squid #指定缓存文件目录 |
1.3 、Squid 的运行控制
1
2
3
4
5
6
7
8
|
#检查配置文件语法是否正确 squid -k parse #启动Squid, 第一次启动Squid服务时,会自动初始化缓存目录 squid -z #-z选项用来初始化缓存目录 squid #启动squid 服务 netstat -anpt | grep "squid" |
1.4、创建 Squid 服务脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
vim /etc/init .d /squid #!/bin/bash #chkconfig: 2345 90 25 PID= "/usr/local/squid/var/run/squid.pid" CONF= "/etc/squid.conf" CMD= "/usr/local/squid/sbin/squid" case "$1" in start) netstat -natp | grep squid &> /dev/null if [ $? - eq 0 ] then echo "squid is running" else echo "正在启动 squid..." $CMD fi ;; stop) $CMD -k kill &> /dev/null rm -rf $PID &> /dev/null ;; status) [ -f $PID ] &> /dev/null if [ $? - eq 0 ] then netstat -natp | grep squid else echo "squid is not running" fi ;; restart) $0 stop &> /dev/null echo "正在关闭 squid..." $0 start &> /dev/null echo "正在启动 squid..." ;; reload) $CMD -k reconfigure ;; check) $CMD -k parse ;; *) echo "用法:$0{start|stop|status|reload|check|restart}" ;; esac |
#2345是默认自启动级别,如是 - 代表任何级别都不自启动; 90是启动优先级,25是停止优先级, 优先级范围是0一100,数字越大,优先级越低。
1
2
3
|
chmod +x /etc/init .d /squid chkconfig --add squid chkconfig --level 35 squid on |
三、搭建传统代理
1、搭建传统代理的操作步骤
环境准备
Squid 代理服务器:192.168.229.60
web服务器: 192.168.229.80
win10客户端: 192.168.229.200
1.1 修改squid的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
vim /etc/squid .conf ...... http_access allow all http_access deny all http_port 3128 cache_effective_user squid cache_effective_group squid ---63行,插入---- cache_mem 64 MB #指定缓存功能所使用的内存空间大小,便于保持访问较频繁的WEB对象,容量最好为4的倍数,单位为MB,建议设为物理内存的1/4 reply_body_max_size 10 MB #允许用户下载的最大文件大小,以字节为单位,当下载超过指定大小的Web对象时,浏览器的报错页面中会出现“请求或访问太大”的提示默认设置0表示不进行限制 maximum_object_size 4096 KB #允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户 |
1.2 重启服务
1
2
|
service squid restart systemctl restart squid |
1.3 生产环境中还需要修改防火墙规则
1
2
3
|
iptables -F iptables -I INPUT -p tcp --dport 3128 -j ACCEPT iptables -nL INPUT |
1.4 web服务器安装web服务(httpd或者nginx)
1
2
3
4
5
|
systemctl stop firewalld.service setenforce 0 yum -y install httpd systemctl start httpd netstat -natp | grep 80 |
1.5 修改win10客户端,添加代理
打开浏览器,工具-->Internet选项-->连接 -->局域网设置-->开启代理服务器 (地址: Squid服务器IP地址,端口: 3128) 清除缓存后,使用浏览器访问http://192.168.229.80 (web服务器地址)
1.6 在win10客户端访问web服务器进行验证
#查看Squid访问日志的新增记录
1
|
tail -f /usr/local/squid/var/logs/access .log |
#查看Web访问日志的新增记录
1
|
tail -f /var/log/httpd/access_log |
在浏览器输入Web服务器IP地址访问,查看Web服务器访问日志,显示的是由代理服务器替客户机在访问。
四、搭建透明代理
1、搭建透明代理的操作步骤
环境准备:
squid服务器 :双网卡 ens33:192.168.229.60,ens36:12.0.0.1
web服务器:12.0.0.18(网关为squid代理服务器的ens36)
Win10客户端:192.168.229.200(网关为squid代理服务器的ens33)
1.1 Squid服务器:双网卡
1
|
内网ens33: 192.168.229.60 外网ens36: 12.0.0.1 |
1
2
3
4
|
cd /etc/sysconfig/network-scripts/ cp ifcfg-ens33 ifcfg-ens36 vim ifcfg-ens36 #修改IP地址,并注释或者删除DNS与网关 systemctl restart network |
1.2 修改squid配置文件
1
2
3
4
5
6
7
|
vim /etc/squid .conf http_access allow all http_access deny all --60行--修改添加提供内网服务的IP地址,和支持透明代理选项transparent http_port 192.168.229.60:3128 transparent systemctl restart squid |
1.3 squid服务器添加路由转发和iptables规则
1
2
3
4
5
6
7
8
9
10
11
|
#开启路由转发,实现本机中不同网段的地址转发 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl .conf sysctl -p <br> #修改防火墙规则 iptables -F iptables -t nat -F # 添加防火墙规则(将来源为229网段:80/443端口的流量重定向到3128端口) iptables -t nat -I PREROUTING -i ens33 -s 192.168.229.0 /24 -p tcp --dport 80 -j REDIRECT --to 3128 #用于转发Http协议 iptables -t nat -I PREROUTING -i ens33 -s 192.168.229.0 /24 -p tcp --dport 443 -j REDIRECT --to 3128 #用于转发https协议 #如果要进行重启,则需要配置以下规则 iptables -I INPUT -p tcp --dport 3128 -j ACCEPT |
1.4 web服务器
修改IP地址为12.0.0.18,并设置网关为12.0.0.1
并开启httpd服务,之前已安装该服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[root@192 ~] # vim /etc/sysconfig/network-scripts/ifcfg-ens33 [root@192 ~] # cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE= yes IPV4_FAILURE_FATAL=no IPV6INIT= yes IPV6_AUTOCONF= yes IPV6_DEFROUTE= yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID= "4ff14eea-f777-4bc2-b50b-7179db6ba998" DEVICE=ens33 ONBOOT= yes IPADDR=12.0.0.18 NETMASK=255.255.255.0 GATEWAY=12.0.0.1 #DNS1=192.168.229.2 [root@192 ~] # systemctl restart network [root@localhost ~] # systemctl restart httpd.service |
1.5.客户端关闭代理并访问web服务器
添加网关,网关为squid服务器的ens33
查看Web1访问日志的新增记录
tail -f /var/log/httpd/access_log
五、ACL访问控制
1、ACL访问控制概述
1.1、ACL访问控制列表的概念
ACL(Access Control List)访问控制列表,主要用于过滤网络中的流量,是控制访问的一种技术手段。网络设备为了过滤报文,需要配置一系列的匹配条件对报文进行分类,应用在端口上,根据预先设定的策略,对特定端口的流量起到控制作用。
访问控制列表(ACL)由一组规则组成,在规则中定义允许或拒绝通过路由器的条件
利用ACL可以对经过路由器的数据包按照设定的规则进行过滤,使数据包有选择的通过路由器,起到防火墙的作用。
ACL一般只在以下路由器上配置:
- 内部网和外部网的边界路由器。
- 两个功能网络交界的路由器。
1.2、在配置文件squid.conf中,ACL访问控制的步骤
通过以下两个步骤来实现:
- 使用acl配置项定义需要控制的条件
- 通过http_access配 置项对已定义的列表做“允许"或“拒绝”访问的控制
1.3、定义访问控制列表
格式: acl 列表名称 列表类型 列表内容
• 列表名称: 名称自定义,相当于给acl起个名字
• 列表类型: 必须使用squid预定义的值,对应不同类别的控制条件
• 列表内容: 是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格为分
隔,为“或"的关系)
1.4 ACL访问控制方式
根据源地址、目标URL、文件类型等定义列表
acl 列表名称 列表类型 列表内容…
针对已定义的acl列表进行限制
http_access allow或deny列表名称…
1.5 ACL规则优先级
一个用户访问代理服务器时,Squid会顺序匹配Squid中定义的所有规则列表,一旦匹配成功,立即停止匹配
所有规则都不匹配时,Squid会使用与最后一条相反的规则
1.6 常用的ACL列表类型
src →>源地址
dst >自标地址
port→>端口
dstdomain>目标域
time →>访问时间
maxconn →最大并发连接
ourl_regex→目标URL地址
Urlpath_regex→整个目标URL路径
2、设置ACL访问控制的步骤
环境准备
Squid 代理服务器:192.168.229.60
web服务器: 192.168.229.80
win10客户端: 192.168.229.200
使用传统代理方式进行设置ACL访问控制(传统代理的设置见上文)
2.1 定义访问控制列表
方法一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
vim /etc/squid .conf ...... acl localhost src 192.168.229.60 /32 #源地址为192.168.229.60 acl MYLAN src 192.168.229.0 /24 #客户机网段 acl destinationhost dst 192.168.229.80 /32 #目标地址为192.168.229.80 acl MC20 maxconn 20 #最大并发连接20 acl PORT port 21 #目标端口21 acl DMBLOCK dstdomain .qq.com #目标域,匹配域内所有站点 acl BURL url_regex -i ^rtsp: // ^emule: // #以rtsp://.emule://开头的URL,-i表示忽略大小写 acl PURL urlpath_regex -i \.mp3$ \.mp4$ \.rmvb$ #以.mp3、.mp4、.rmvb结尾的URL路径 acl WORKTIME time MTWHF 08:30-17:30 #时间为周一--至周五8:30~17:30,"MTWHF"为每个星期的英文首字母 第一条插入: http_access deny localhost |
方法二:
#启动对象列表管理
1
2
3
4
5
6
7
8
9
10
11
|
mkdir /etc/squid vim /etc/squid/dest .list 192.168.229.60 #Squid服务器IP 192.168.200.0 /24 #任意需要的网段 vim /etc/ squid.conf ....... acl destinationhost dst "/etc/squid/dest.list" #调用指定文件中的列表内容 http access deny(或allow) destinationhost #注意,如果是拒绝列表,需要放在http_access allow all前面 systemctl restart squid |
2.2. WEB服务器上安装httpd服务
1
2
|
yum install -y httpd systemctl start httpd |
2.3 Client客户上测试
浏览器中输入192.168.229.80查看web是否被拒绝
六、Squid日志分析
sarg ( Squid Analysis Report Generator),是一款squid日志分析工具,采用HTML格式,详细列出每一位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等
1、实现Squid日志分析的步骤
1.1 安装图像处理软件包
1
2
|
yum install -y gd gd-devel pcre-devel mkdir /usr/local/sarg |
1.2 将zxvf sarg-2.3.7. tar.gz压缩包上传到/opt目录下,解压并配置相关模块,编译安装
1
2
3
4
5
6
7
8
9
10
11
12
|
tar zxvf sarg-2.3.7. tar .gz -C /opt/ cd /opt/sarg-2 .3.7 . /configure --prefix= /usr/local/sarg \ #指定安装路径 --sysconfdir= /etc/sarg \ #配置文件目录 -- enable -extraprotection #额外安全防护 ----------------------------------------------------------------------------------------------- . /configure --prefix= /usr/local/sarg --sysconfdir= /etc/sarg -- enable -extraprotection -------------------------------------------------------------------------------------------------- make && make install |
1.3 修改sarg配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
vim /etc/sarg/sarg .conf --7行--取消注释 access_log /usr/local/squid/var/logs/access .1og #指定访问日志文件 --25行--取消注释 title "Squid User Access Reports" #网页标题 -- 120行--取消注释,修改 output_dir /var/www/html/squid-reports #报告输出目录 --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行--取消注释 weekdavs 0-6 #top排行的星期周期 --525行--取消注释 hours 0-23 #top排行的时间周期 --633行--取消注释 www_document_root /var/www/html #指定网页根目录 |
1.4 添加不计入站点文件,添加的域名将不被显示在排序中
1
2
3
4
5
6
|
touch /usr/local/sarg/noreport ln -s /usr/local/sarg/bin/sarg /usr/local/bin/ sarg --help #获取帮助 #运行 sarg #启动一次记录 |
1.5 验证
1
2
|
yum install httpd -y systemctl start httpd |
在squid服务器上使用浏览器访问http://192.168.229.60/squid-reports, 查看sarg报告网页
date -s
1.6 添加计划任务,执行每天生成报告
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
vim /usr/local/sarg/report .sh #/bin/bash #Get current date TODAY=$( date +%d/%m/%Y) #Get one week ago today YESTERDAY=$( date -d "1 day ago" +%d/%m/%Y) /usr/local/sarg/bin/sarg -l /usr/1ocal/squid/var/logs/access .log -o /var/www/html/sarg -z -d $YESTERDAY-$TODAY &> /dev/null exit 0 chmod +x /usr/local/sarg/report .sh crontab -e 0 0 * * * /usr/1ocal/sarg/report .sh |
七.反向代理
1、squid反向代理的概述
如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;
否则反向代理服务器将向后台的Web服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地供下一个请求者使用
工作机制:
• 缓存网页对象,减少重复请求
• 将互联网请求轮询或按权重分配到内网web服务器
• 代理用户请求,避免用户直接访问Web服务器,提高安全
2、squid反向代理的操作步骤
环境准备
Squid 代理服务器:192.168.229.60
web1服务器: 192.168.229.80
web1服务器: 192.168.229.70
win10客户端: 192.168.229.200
2.1本地关闭httpd
1
|
systemctl stop httpd |
2.2 清空防火墙规则,并放空3128端口
1
2
3
|
iptables -F iptables -t nat -F iptables -I INPUT -p tcp --dport 3128 -j ACCEPT |
2.3 .修改squid配置文件
1
2
3
4
5
6
|
vim /etc/ squid.conf 60行--修改,插入------- http_port 192.168.229.60:80 accel vhost vport cache_peer 192.168.229.80 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1 cache_peer 192.168.229.70 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2 cache_peer_domain web1 web2 www.ly.com #表示对www.ly.com的请求,squid向192.168.229.80和192.168.229.70的80端口发出请求 |
####关键字解释如下####
http_port 80 accel vhost vport
#squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,同时和webserver的请求端口(vhost vport)绑定,这个时候请求到了squid, squid是不用转发请求的,而是直接要么从缓存中拿数据要么向,绑定的端口直接请求数据。
accel:反向代理加速模式
vhost:支持域名或主机名来表示代理节点
vport:支持IP和端口来表示代理节点
parent:代表为父节点,上下关系,非平级关系
80:代理内部web服务器的80端口
0:没有使用icp,表示就一台squid服务器
no-query:不做查询操作,直接获取数据
originserver:指定是源服务器
round-robin:指定squid 通过轮询方式将请求分发到其中一-台父节点
max_conn:指定最大连接数
weight:指定权重
name:设置别名
2.4 重启squid服务
1
2
|
systemctl stop squid service squid reload |
2.5 后端web节点服务器设置
1
2
3
4
5
6
7
|
yum install -y httpd systemctl start httpd #节点1(web1): echo "this is test01" >> /var/www/html/index .html #节点2(web2): echo "this is test02" >> /var/www/html/index .html |
2.6 客户机的域名映射配置
修改C: \Windows\System32 \drivers\etc\hosts 文件
192.168.229.60 www.ly.com
2.7 客户机的代理配置并访问测试
打开浏览器,工具-->Internet选项-->连接-->局域网设置-->开启代理服务器(地址: Squid服务器IP地址,端口:80)
浏览器访问http://www.ly.com