Squid是Linux系统中最常用的一款开源代理服务软件,可以很好地实现HTTP和FTP,以及DNS查询、SSL等应用的缓存代理,功能十分强大。
Squid服务基础
- squid的功能
用于web代理,缓存网页对象,减少重复请求。
- 代理的基本类型
传统代理:也就是普通的代理服务,首先必须在客户机的浏览器、聊天工具。下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发给指定的代服务器。
透明代理:提供与传统代理相同的服务和功能,其区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将web访问重定向,实际仍然交给代理服务器来处理。重定向的过程对客户机来说是“透明”的,用户甚至并不知道自己在使用代理服务,所以称为透明代理。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先发给DNS服务器。
安装及运行控制
编译安装Squid
配置Squid的编译选项时,将安装目录设为/usr/local/squid,其他选项根据实际需求来定,配置前可参考"./configure --help"说明。
1. [root@localhost ~]# mount /dev/cdrom /media 2. mount: /dev/sr0 is write-protected, mounting read-only 3. [root@localhost ~]# tar zxf /media/squid-3.5.23.tar.gz -C /usr/src 4. [root@localhost ~]# cd /usr/src/squid-3.5.23/ 5. [root@localhost squid-3.5.23]# ./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-linux-netfilter --enable-async-io=240 --enable-default-err-language=Simplify_Chinese --disable-poll --enable-epoll --enable-gunregex 6. [root@localhost squid-3.5.23]# make && make install
上述选项含义如下:
--prefix=/usr/local/squid :安装目录。
--sysconfdir=/etc :单独将配置文件修改到其他目录。
--enable-linux-netfilter :使用内核过滤。
--enable-async-io=240 :异步l/O,提升存储性能。
--enable-default-err-language=Simplify_Chinese :错误信息的显示语言。
--disable-poll与--enable-epoll :关闭默认使用poll模式,开启epoll模式提升性能。
--enable-gunregex:使用GNU正则表达式。
创建链接文件、创建用户和组。
1. [root@localhost ~]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ 2. [root@localhost ~]# useradd -M -s /sbin/nologin squid 3. [root@localhost ~]# chown -R squid:squid /usr/local/squid/var/
Squid的配置文件
1. [root@localhost ~]# vim /etc/squid.conf 2. ......//省略部分 3. # Squid normally listens to port 3128 4. http_port 3128 //用来指定代理服务监听的地址和端口(默认为3128) 5. cache_effective_user squid //指定squid的程序用户,用来设置初始化、运行时缓存的账号、否则启动不成功。 6. cache_effective_group squid 7. ......//省略部分
默认情况下,配置文件中不包括cache_effective_user squid与cache_effective_group squid配置项,需要手动添加。
Squid的运行控制
检查配置文件语法
[root@localhost ~]# squid -k parse
启动、停止Squid
第一次启动Squid服务时,会自动初始化缓存目录。在没有可用的Squid服务脚本的情况下,也可以直接调用Squid程序来启动服务,这时需要先进行初始化。
1. [root@localhost ~]# squid -z //-z选项用来初始化缓存目录 2. [root@localhost ~]# squid //启动squid服务
确认Squid监听状态。
1. [root@localhost ~]# netstat -anpt | grep squid 2. tcp6 0 0 :::3128 :::* LISTEN 47321/squid-1)
使用Squid服务脚本
为了使Squid服务的启动、停止、重载等操作更加方便,可以编写Squid服务脚本,并使用chkconfig和systemctl工具来进行管理。
1. [root@localhost ~]# vim /etc/init.d/squid 2. #!/bin/bash 3. # chkconfig: 2345 90 25 4. # config: /etc/squid.conf 5. # pidfile: /usr/local/squid/var/run/squid.pid 6. # Description: Squid - Internet Object Cache. 7. PID="/usr/local/squid/var/run/squid.pid" 8. CONF="/etc/squid.conf" 9. CMD="/usr/local/squid/sbin/squid" 10. case "$1" in 11. start) 12. netstat -anpt | grep squid &> /dev/null 13. if [ $? -eq 0 ] 14. then 15. echo "squid is running" 16. else 17. echo "正在启动 squid..." 18. $CMD 19. fi 20. ;; 21. stop) 22. $CMD -k kill &> /dev/null 23. rm -rf $PID &> /dev/null 24. ;; 25. status) 26. [ -f $PID ] &> /dev/null 27. if [ $? -eq 0 ] 28. then 29. netstat -anpt | grep squid 30. else 31. echo "Squid is not runing." 32. fi 33. ;; 34. restart) 35. $0 stop &> /dev/null 36. echo "正在关闭 squid..." 37. $0 start &> /dev/null 38. echo "正在启动 squid..." 39. ;; 40. reload) 41. $CMD -k reconfigure 42. ;; 43. check) 44. $CMD -k parse 45. ;; 46. *) 47. echo "用法: $0 (start | stop | restart | reload | check | status)" 48. ;; 49. esac 50. [root@localhost ~]# chmod +x /etc/init.d/squid 51. [root@localhost ~]# chkconfig --add squid //添加为系统服务 52. [root@localhost ~]# systemctl restart squid
构建代理服务器
本节主要从三个方面来学习Squid服务的构建和使用,分别为传统代理、透明代理、和ACL访问控制。传统代理的实现最为简单,透明代理还需要结合默认路由、防火墙策略等一起来完成,ACL列表主要用来针对客户机的Web访问过程进行过滤控制。
传统代理
使用传统代理的特点在于,客户机的相关程序,必须指定代理服务器的地址、端口等基本信息。下面通过案例学习传统代理的配置和使用方法。
环境如下:
在客户机1.10上,指定Squid作为Web代理,以隐藏自己的真实IP地址。
在Squid服务器上为客户机访问各种网站提供代理服务,但是禁止代理下载超过10MB大小的文件。
Web服务器上搭建Apache,作为测试网站。
web服务器配置
1. [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 2. [root@localhost ~]# systemctl restart network 3. [root@localhost ~]# systemctl stop firewalld 4. [root@localhost ~]# systemctl disable firewalld 5. [root@localhost ~]# rm -rf /etc/yum.repos.d/* 6. [root@localhost ~]# vim /etc/yum.repos.d/test.repo 7. [yum] 8. name=a 9. baseurl=file:///media 10. gpgcheck=0 11. 保存退出,挂载系统光盘并安装httpd服务 12. [root@localhost ~]# mount /dev/cdrom /media 13. mount: /dev/sr0 写保护,将以只读方式挂载 14. [root@localhost ~]# yum -y install httpd 15. 创建一个测试网页 16. [root@localhost ~]# echo 6666666 > /var/www/html/index.html 17. [root@localhost ~]# systemctl start httpd 18. [root@localhost ~]# systemctl enable httpd 19. 生一个大文件:cat /dev/zero > /var/www/html/yy (回车后,等几秒,ctrl+c结束)
首先配置IP地址、关闭防火墙等配置,Squid服务器需要配置两个IP。
1. [root@localhost ~]# ifconfig //查看两个网卡名称 2. ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 3. ......//省略部分 4. ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 5. ......//省略部分 6. [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //修改网络配置 7. [root@localhost ~]# cd /etc/sysconfig/network-scripts 8. [root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens36 //复制ens33到当前文件夹命名为第二块网卡信息 9. ......//省略部分 10. 修改IP地址等配置,把网卡名称为ens33的都改为ens36 11. [root@localhost ~]# systemctl restart network 12. [root@localhost ~]# systemctl stop firewalld 13. [root@localhost ~]# systemctl disable firewalld
Squid服务器的配置
配置Squid实现传统代理服务时,需要注意添加http_access allow all访问策略,以便允许任意客户机使用代理服务。除此之外,为了限制下载的文件大小,还需要设置reply_body_max_size项,其他各种参数均可保持默认。
1. [root@localhost ~]# vim /etc/squid.conf 2. reply_body_max_size 10 MB //在配置文件中添加限制文件大小(10MB)
重载Squid服务
修改squid.conf配置文件以后,需要重启服务生效。做了前面的脚本可以用"systemctl restart squid"启动,没做脚本用"squid -k reconfigure"启动。
[root@localhost ~]# squid -k reconfigure
客户机的代理配置
在火狐浏览器中,点击下图所示位置,首选项→高级→网络→设置→手动配置代理→添加代理的ip和端口号→保存即可。其他浏览器配置基本相同。
代理服务的验证方法
客户机1.10中通过浏览器访问目标网站http://200.0.0.10,然后观察Squid代理服务器、Web服务器的访问日志是否发挥作用。
- 查看Squid访问日志的新增记录
1. [root@localhost ~]# tail -f /usr/local/squid/var/logs/access.log 2. 1655638857.719 2 192.168.1.10 TCP_MISS/200 360 GET http://200.0.0.10/ - HIER_DIRECT/200.0.0.10 text/html 3. 1655638857.799 1 192.168.1.10 TCP_MISS/404 482 GET http://200.0.0.10/favicon.ico - HIER_DIRECT/200.0.0.10 text/html 4. 1655638857.806 1 192.168.1.10 TCP_MISS/404 482 GET http://200.0.0.10/favicon.ico - HIER_DIRECT/200.0.0.10 text/html
- 查看Web访问日志的新增记录
1. [root@localhost ~]# tail -f /var/log/httpd/access_log 2. 200.0.0.10 - - [19/Jun/2022:19:39:02 +0800] "GET /yy HTTP/1.1" 200 253325312 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" 3. 200.0.0.10 - - [19/Jun/2022:19:39:07 +0800] "GET /yy HTTP/1.1" 200 253325312 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0" 4. 200.0.0.1 - - [19/Jun/2022:19:39:36 +0800] "GET /yy HTTP/1.1" 200 253325312 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
当客户机再此访问同一Web页面时,Squid访问日志中会增加新的记录,但Web访问日志中的记录不会有变化(除非页面变更或执行强制刷新等操作)。这说明客户机访问统一静态页面时,实际上是有代理服务器缓存提供的。
透明代理
透明代理提供的服务功能与传统代理是一致的,但是其”透明“的现实依赖于默认路由和防火墙的重定向策略,因此更适用于为局域网主机服务,而不适合为internet中的客户机提供服务。
基于局域网主机通过Linux网关访问internet的环境,需求如下。
- 在linux网关上,构建Squid为客户家访问internet提供代理服务。
- 在所有的局域网客户机上,只需要正确设置IP地址、默认网关和DNS,不需要手动指定代理服务器的地址和端口等信息。
以上实验环境,透明代理的关键在于linux网关服务器,而对于客户机仅需正确设置网络地址、默认网关、而并不需要指定代理服务器。
配置Squid支持透明代理
Squid服务的默认配置并不支持透明代理,因此需要调整相关设置。对于2.6以上版本的Squid服务,只需要在http_port配置行加上一个"transparent"(透明)选项,就可以支持透明代理了。
1. [root@localhost ~]# vim /etc/squid.conf 2. ......//省略部分 3. http_port 192.168.1.1:3128 transparent //只在其中一个IP地址上提供服务(ens33网卡) 4. [root@localhost ~]# squid -k reconfigure 5. [root@localhost ~]# vim /etc/sysctl.conf 6. net.ipv4.ip_forward = 1 //开启路由转发功能 7. [root@localhost ~]# sysctl -p //刷新 8. net.ipv4.ip_forward = 1
设置firewalld的重定向策略
透明代理中的Squid服务实际上是构建在linux网关主机上的,因此只需正确设置防火墙策略,就可以将局域网主机访问internet的数据包转交给Squid进行处理。这需要用到firewalld的IP伪装与端口转发策略,其作用是实现本机端口的重定向,将访问网站协议HTTP、HTTPS的转发数据包交给本机的Squid服务(3128端口)。
防火墙做端口转发操作,将访问本机80/443端口的请求转发到3128端口。
1. [root@localhost ~]# systemctl start firewalld 2. [root@localhost ~]# firewall-cmd --zone=external --add-interface=ens33 3. The interface is under control of NetworkManager, setting zone to 'external'. 4. success 5. [root@localhost ~]# firewall-cmd --zone=internal --add-interface=ens36 6. The interface is under control of NetworkManager, setting zone to 'internal'. 7. success 8. [root@localhost ~]# firewall-cmd --zone=external --add-service=http 9. success 10. [root@localhost ~]# firewall-cmd --zone=external --add-service=https 11. success 12. [root@localhost ~]# firewall-cmd --zone=external --add-port=3128/tcp 13. success 14. [root@localhost ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens33 -p tcp --dport 80 -j REDIRECT --to-ports 3128 15. success 16. [root@localhost ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens33 -p tcp --dport 443 -j REDIRECT --to-ports 3128 17. success 18. [root@localhost ~]# firewall-cmd --runtime-to-permanent 19. success
验证透明代理的使用
为了验证透明代理效果,如果存在手动指定的代理服务器设置应在客户机中将其去除。例如,在火狐浏览器中的连接设置中不要勾选使用代理服务器;客户机网关应设为Squid代理服务器的地址。
在客户机1.10中通过浏览访问目标网站http://200.0.0.10/,然后观察Squid代理服务器、web服务器的访问日志,已验证透明代理是否发挥作用。在被访问的web服务器中,应该能够发现来自代理服务器200.0.0.1的访问记录。
ACL访问控制
Squid提供了强大的代理控制机制,通过合理设置ACL并进行限制,可以针对源地址、目标地址、访问的URL路径、访问的时间等各种条件进行过滤。
在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现:其一,使用ACL配置项定义需要控制的条件;其二,通过http_access配置项对已定义的列表作允许或拒绝的访问的控制。
定义访问控制列表
每一行acl配置可以定义一条访问控制列表,格式如下:
acl 列表名称 列表类型 列表内容 ...
”列表名称“由管理员自行指定,用来识别控制条件;“列表类型”必须使用Squid预定义的值,对应不同类别的控制条件;“列表内容”是要控制的具体对象,不同类型的列表对应的内容也不一样,可以有多个值(以空格分隔,为“或”的关系)。
常用的ACL列表类型
列表类型 | 列表内容示例 | 用途/含义 |
src | 192.168.1.0/24 | 源IP地址、网段、IP地址范围 |
dst | www.123.com | 目标IP地址、网段、主机名 |
port | 80 443 8080 20 21 | 目标端口 |
dstdomain | .q.com .w.com | 目标域,匹配域内所有站点 |
time | MTWHT 8:00-18:00 | 使用代理服务的时间段,字母表示一星期中的英文缩写M-Monday、T-Tuesday、W-Wednesday、H-Thursday、F-Friday、A-Saturday、S-Sunday |
maxconn | 20 | 每个客户机的并发连接数 |
url_regex | url_regex -i ^rtsp:// | 目标资源的URL地址,-i表示忽略大小写 |
Urlpath_regex | urlpath_regex -i sex adult | 网址中主机名后面的部分,-i表示忽略大小写 |
在定义访问控制列表时,应结合当前网络环境正确分析用户的访问需求,准确定义使用代理服务的控制条件。
1. [root@localhost ~]# vim /etc/squid.conf 2. ......//省略部分 3. #acl localnet src 192.168.0.0/16 4. acl AAA src 192.168.1.0/24 //添加源网段 5. acl BBB time MTWHF 09:00-17:00 //添加访问时间为每周一到周五九点掉下午五点访问 6. http_access allow AAA BBB //允许以上两条规则 7. [root@localhost ~]# squid -k reconfigure
虚拟机可以通过date -s命令修改时间测试ACL规则是否成功
需要限制的同一类对象较多时,可以使用独立的文件来存放,在acl配置行的列表内容处指定对应的文件位置即可。例如,若要针对目标地址建立黑名单文件,可以参考以下操作。
1. [root@localhost ~]# mkdir /etc/squid 2. [root@localhost ~]# vim /etc/squid/ipblock.list //建立目标IP地址名单 3. 61.135.167.36 4. 125.39.127.25 5. 60.28.14.0/24 6. [root@localhost ~]# vim /etc/squid/dmblock.list //建立目标域地址名单 7. .123.com 8. .my.com 9. [root@localhost ~]# vim /etc/squid.conf 10. ......//省略部分 11. acl IPBLOCK dst "/etc/squid/ipblock.list" //调用指定文件中的列表内容 12. acl DMBLOCK dstdomain "/etc/squid/dmblock.list"
设置访问权限
定义好各种访问控制列表以后,需要使用后http_access配置项来进行控制。必须注意的是,http_access配置行必须放在对应的 acl配置行之后。每行http_access配置确定一条访问控制规则。
http_access allow或deny 列表名...
每条http_access规则中,可以同时包含多个访问控制列表名,每个列表之间以空格分隔,为“与”的关系,表示必须满足所有访问控制列表对应的条件才会进行限制。需要使用取反条件时,可以再访问控制列表前面添加“ !”符号。
1. [root@localhost ~]# vim /etc/squid.conf 2. http_access deny MC20 //客户机的并发连接超过20将被阻止 3. http_access allow WORKTIME //允许客户机在工作时间上网 4. http_access deny all //默认禁止所有客户机使用代理
执行访问控制时,Squid将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索。因此,规则的顺序安排是非常重要的,以下两种默认情况需要我们注意。
- 没有设置任何规则时:Squid服务将拒绝客户端的请求。
- 有规则但找不到相匹配的项:Squid将采用与最后一条规则相反的动作,即如果最后一条规则时allow,就拒绝客户端的请求,否则允许该请求。
通常情况下,把最常用到的控制规则放到最前面,以减少Squid的负载。在访问控制的总策略上,建议采用“先拒绝后允许”或”先允许后拒绝“的方式,最后一条规则设为默认策略,设为"http_access allow all"或者"http_access deny all"。
验证访问控制效果
- 测试访问权限限制
对于使用http_access规则拒绝访问的情况(如访问被禁止的网站或者在禁止的时间段访问),浏览器的报错页面中会出现访问被拒绝的提示。
- 测试文件下载权限
对于限制文件下载大小的情况(reply_body_max_size配置项),当下在超过指定大小的Web对象时,浏览器的报错页面中会出现请求或访问太大的提示。
用来下载测试的文件可以通过dd命令生成。(在Web端配置)
1. [root@localhost ~]# dd if=/dev/zero of=/var/www/html/a bs=10M count=10 2. 记录了10+0 的读入 3. 记录了10+0 的写出 4. 104857600字节(105 MB)已复制,0.392383 秒,267 MB/秒
Squid日志分析
SARG全称是Squid Analysis Report Generator,是一款Squid日志分析工具,采用HTML格式,详细列出每位用户访问Internet的站点信息、时间占用信息、排名、连接次数、访问量等。
安装GD库
1. [root@localhost ~]# rm -rf /etc/yum.repos.d/* //采用yum的方式安装 2. [root@localhost ~]# vim /etc/yum.repos.d/yum.repo 3. [yum] 4. name=aaa 5. baseurl=file:///media 6. gpgcheck=0 7. [root@localhost ~]# mount /dev/cdrom /media //挂载系统光盘 8. mount: /dev/sr0 写保护,将以只读方式挂载 9. [root@localhost ~]# yum -y install gd gd-devel httpd //后面还需要httpd服务,在这里直接安装了
安装SARG
1. [root@localhost ~]# eject 2. [root@localhost ~]# mount /dev/cdrom /media //挂载sarg包光盘 3. mount: /dev/sr0 写保护,将以只读方式挂载 4. [root@localhost ~]# mkdir /usr/local/sarg 5. [root@localhost ~]# tar zxf /media/sarg-2.3.7.tar.gz -C /usr/src 6. [root@localhost ~]# cd /usr/src/sarg-2.3.7/ 7. [root@localhost sarg-2.3.7]# ./configure --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection && make && make install
上述配置项含义如下。
--prefix=/usr/local/sarg :路径
--sysconfdir=/etc/sarg :配置文件目录
--enable-extraprotection :添加额外的安全保护
配置
1. [root@localhost ~]# vim /etc/sarg/sarg.conf 2. access_log /usr/local/squid/var/logs/access.log //指定squid的访问日志文件(去掉#注释) 3. title "Squid User Access Reports" //网页标题(去掉#注释) 4. output_dir /var/www/html/sarg //sarg报告的输出目录(将squid-reports改为sarg)(去掉#注释) 5. www_document_root /var/www/html //网页根目录(去掉#注释)
运行
直接执行sarg即可启动一次记录,建议设置符号链接,然后执行sarg,会看到提示信息。
1. [root@localhost ~]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/ 2. [root@localhost ~]# sarg 3. SARG: 未知的选项 /www_document_root /var/www/html 4. SARG: 纪录在文件: 17, reading: 100.00% 5. SARG: 成功的生成报告在 /var/www/html/sarg/2022Jun19-2022Jun23 6. [root@localhost ~]# systemctl start httpd 7. [root@localhost ~]# systemctl enable httpd 8. Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
验证
多次执行sarg后,在客户端上访问sarg/目录可看到SARG报告。因为Squid服务器开启了防火墙,只能在内网查看,如192.168.1.1/sarg或200.0.0.1/sarg。