Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
squid代理服务器
实验一:传统代理
一、 实验名称:
- squid代理服务器传统代理模式
二、 实验目的:
- 学会构建传统代理模式
三、 实验环境:
设备名称 |
系统版本 |
IP地址 |
所需软件 |
客户机 |
Linux-6.5 |
eth0=172.16.16.110
|
|
服务器B(squid) |
Linux-6.5 |
eth0=172.16.16.22
|
squid-3.5.23 sarg-2.3.7 |
服务器A(web) |
Linux-6.5 |
eth0=172.16.16.172 |
|
注:将所需软件拷贝至/usr/src中
一:安装squid
1:设置各个设备的ip地址
2:将squid拷贝到linux中
[root@localhost ~]# yum -y install gcc*
[root@localhost ~]# tar zxvf squid-3.5.23.tar.gz
[root@localhost ~]# cd squid-3.5.23
3:配置安装参数(时间较长)
[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-gnuregex
参数解析:
--enable-async-io:异步I/O可以用来提升存储性能。aufs模块使用大量的线程来执行磁盘I/O操作,N_THREADS参数改变Squid使用的线程数量。
--enable-async-io:等同于如下三个选项,用于异步IO,提升存储性能:
--with-pthreads:在编译过程中链接到系统的P线程库,aufs存储模块是Squid中唯一需要使用线程的部分。
--with-aufs-threads=N_THREADS:指定aufs存储机制使用的线程数量。Squid会根据cache目录的数量,自动计算需要使用多少线程。
--enable-storeio=ufs,aufs,diskd, coss, null:告诉Squid编译时使用哪个存储模块,源码中/src/fs下面有所有可用的存储模块
--enable-default-err-language=Simplify_Chinese:错误信息的显示语言
--enable-linux-netfilter:使用内核过滤,目的是对透明模式提供支持
--disable-poll --enable-epoll:关闭默认的poll模式,开启epoll模式提升性能
--enable-gnuregex:允许规则中使用GNU正则表达式
poll是Linux中的字符设备驱动中的一个函数。Linux 2.5.44版本后,poll被epoll取代。
./configure --prefix=/usr/local/squid --sysconfdir=/etc --enable-linux-netfilter --enable-gnuregex
4:编译并安装
[root@s2 squid-3.5.23]#make && make install
[root@s2 squid-3.5.23]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[root@s2 squid-3.5.23]# useradd -M -s /sbin/nologin squid ##M:不建立宿主目录
[root@s2 squid-3.5.23]# chown -R squid:squid /usr/local/squid/var/
5:编辑配置文件
[root@s2 ~]# vi /etc/squid.conf
开启62行,指定缓存目录,缓存大小为100M,16个一级目录,256个二级目录
cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
添加下面两行(可以放在末尾)
cache_effective_user squid ##指定squid程序的用户
cache_effective_group squid ##指定squid账号的基本组
6:检查配置结果
[root@s2 ~]# squid -k parse ##检查配置文件的语法是否正确
[root@s2 ~]#squid –k reconfigure ##重新加载,相当于reload
[root@s2 ~]# squid -z ##初始化缓存目录
[root@s2 ~]# squid ##启动squid服务
[root@s2 ~]# netstat -anpt | grep "squid"
7:使用squid服务脚本
[root@s2 ~]# vi /etc/init.d/squid
输入以下内容
#!/bin/bash
#chkconfig: 2345 90 25
#discription: /etc/squid.conf
#pidfile: /usr/local/squid/var/run/squid.pid
#description: squid - internet object cache.
PID="usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -anpt | 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 -anpt | 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 |restart | reload | check | status}"
;;
esac
将squid添加为系统服务
[root@s2 init.d]# chmod +x /etc/init.d/squid
[root@s2 init.d]# chkconfig --add squid
[root@s2 init.d]# chkconfig squid on
二:传统代理的设置
1:修改配置文件
[root@s2 ~]# vi /etc/squid.conf
添加
reply_body_max_size 10 MB ##下载文件的大小限制
http_access allow all ##放在http_access deny all前面
2:在防火墙上添加允许策略
[root@s2 ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
[root@s2 ~]# service iptables save
[root@s2 ~]# service squid reload
3:设置客户端
a:windows客户端
b:linux客户端的firefox浏览器
打开firefox浏览器
编辑—首选项—高级—网络—设置—选择手动设置代理
将代理服务器的IP地址都和端口号填写上,并勾选为所有协议使用相同代理,保存即可
c:linux客户端的命令行工具(elinks或wget等命令行工具,)
vim /etc/profile
添加如下内容
HTTP_PROXY=http://172.16.1.111:3128
HTTPS_PROXY=http://172.16.1.111:3128
FTP_PROXY=http://172.16.1.111:3128
NO_PROXY=192.168.1.,192.168.4.
export HTTP_PROXY HTTPS_PROXY FTP_PROXY NO_PROXY
测试:客户端上访问网站,关掉squid的network后再访问。
C:squid上查看日志
[root@localhost ~]# tail /usr/local/squid/var/logs/access.log
实验二:透明代理
一、 实验名称:
- squid代理服务器透明代理模式
二、 实验目的:
- 学会构建传统代理模式
- 学会访问控制列表的设置
- 掌握sarg日志分析
三、 实验环境:
设备名称 |
系统版本 |
桥接 |
IP地址 |
所需软件 |
测试客户机 |
Linux-6.5 |
eth0桥接vm1 |
ens0=192.168.4.110
|
|
Squid代理服务器 |
Linux-6.5 |
eth0桥接vm1 eht1桥接vm2 |
ens1=192.168.4.1 ens0=172.16.16.1
|
squid-3.5.23 sarg-2.3.7 |
测试网站 |
Linux-6.5 |
桥接vm2 |
ens0=172.16.16.172 |
|
注:将所需软件拷贝至/usr/src中
内网桥接vm1,外网桥接vm2
一:实验环境的调整
1:为squid服务器添加一个网卡:设置eth1的ip地址为192.168.4.1,并修改客户端的ip地址:192.168.4.110
将web服务器和squid的eth0桥接到vm1,将squid的eth1和客户端桥接到vm2
2:修改配置文件以支持透明代理
[root@s2 ~]# vi /etc/squid.conf
找到http_port 3128这一行,将其修改为http_port 192.168.4.1:3128 transparent
[root@s2 ~]# service squid reload ##重启squid服务
3:设置iptables重定向策略
[root@localhost ~]# firewall-cmd --zone=external --add-interface=ens0
[root@localhost ~]# firewall-cmd --zone=internal --add-interface=ens1
[root@localhost ~]# firewall-cmd --zone=internal --add-service=http
[root@localhost ~]# firewall-cmd --zone=internal --add-port=3128/tcp
[root@localhost ~]# firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -i ens0 -p tcp --dport 80 -j REDIRECT --to-ports 3128
[root@localhost ~]# firewall-cmd --runtime-to-permanent
4:客户端设置
以windows客户端为例
验证透明代理,将代理服务器的钩去掉,并保存设置,设置其网关为squid的eth1的ip地址,然后访问web服务
无法访问重启squid服务在试
[root@localhost ~]# tail /usr/local/squid/var/logs/access.log
删除squid缓存
[root@s2 ~]# grep cache_dir /etc/squid.conf
#cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
[root@s2 ~]#service squid stop
[root@s2 ~]# rm -rf /usr/local/squid/var/cache/squid
[root@s2 ~]#service squid start
二:ACL访问控制
1:查看acl
[root@s2 ~]# vi /etc/squid.conf
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
2:源ip为控制条件
修改acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
为 acl aaa src 192.168.0.0/16 # RFC1918 possible internal network
在acl列的末尾添加 http_access deny aaa
[root@s2 ~]#service squid reload
3:黑名单文件作为控制条件
[root@s2 ~]# vi /etc/squid.conf
修改
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
为
acl MYLAN src 192.168.0.0/16 # RFC1918 possible internal network
针对目标ip建立黑名单
[root@s2 ~]# mkdir /etc/squid
[root@s2 ~]# cd /etc/squid
[root@s2 squid]# vi ipblock.list
添加172.16.16.172 ##web服务器的IP
[root@s2 squid]# vi dmblock.list
添加 qq.com
[root@s2 ~]# vi /etc/squid.conf
添加(在acl列表的末尾,放在http_access allow前面)
acl IPBLOCK dst "/etc/squid/ipblock.list"
acl DMBLOCK dstdomain "/etc/squid/dmblock.list"
http_access deny MYLAN IPBLOCK ##拒绝MYLAN的主机访问IPBLOCK的主机
http_access deny MYLAN DMBLOCK
[root@s2 ~]#service squid reload
4:测试
三、squid日志分析
1、安装GD库
[root@s2 ~]#yum -y install gd
将gd-devel.tar.gz拷贝至usr/src中
[root@s2 ~]# cd /usr/src
[root@localhost src]# tar zxvf gd-devel.tar.gz
修改yum 仓库位置
[root@localhost src]# vim /etc/yum.repos.d/CentOS-Media.repo
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///usr/src
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[aaa]
name=123123
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
[root@localhost src]# yum clean all
[root@localhost src]# yum makecache
[root@s2 src]#yum -y install gd-devel
2、安装sarg
[root@s2 ~]#cd /usr/src
[root@s2 src]#tar zxvf sarg-2.3.7.tar.gz
[root@s2 src]#cd sarg-2.3.7
[root@s2 sarg-2.3.7]# ./configure --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection && make && make install
3、配置
[root@s2 ~]#cd /etc/sarg/
[root@s2 sarg]#vim sarg.conf
里面要改的东西较多,可以删掉sarg.conf,在创建一个将红字部分的内容复制进去
[root@s2 sarg]# grep -v "^#" /etc/sarg/sarg.conf | grep -v "^$"
7 access_log /usr/local/squid/var/logs/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
190 user_sort_field connect reverse
206 exclude_hosts /usr/local/sarg/noreport
257 overwrite_report no
289 mail_utility mailq.postfix
charset UTF-8
516 weekdays 0-6
523 hours 9-12,14-16,18-20
633 www_document_root /var/www/html
access_log /usr/local/squid/var/logs/access.log
title "Squid User Access Reports"
output_dir /var/www/html/sarg
user_ip no
topuser_sort_field connect reverse
user_sort_field connect reverse
exclude_hosts /usr/local/sarg/noreport
overwrite_report no
mail_utility mailq.postfix
charset UTF-8
weekdays 0-6
hours 9-12,14-16,18-20
www_document_root /var/www/html
4、运行
[root@s2 sarg]#setenforce 0
[root@s2 sarg]#touch /usr/local/sarg/noreport ##该文件中添加的域名将不被显示在排序中
[root@s2 sarg]#ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
[root@localhost sarg]# sarg
[root@localhost sarg]# yum -y install httpd
[root@localhost sarg]# systemctl start httpd
[root@localhost sarg]# systemctl enable httpd
[root@localhost sarg]# service httpd start
用客户端访问一次网站
[root@s2 sarg]# sarg
或
[root@s2 sarg]# /usr/local/sarg/bin/sarg
SARG: 纪录在文件: 396, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/sarg/2015Sep18-2015Sep18
5、验证
开启squid服务器的httpd服务service httpd start
多次访问web,并多次在squid上执行sarg
在客户端访问http://172.16.16.1/sarg
6、计划任务
vim /usr/local/sarg/daily.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/local/squid/var/logs/access.log -o /var/www/html/sarg -z -d $YESTERDAY-$TODAY &> /dev/null
exit 0
chmod +x /usr/local/sarg/daily.sh
crontab -e
20 10 * * * /usr/local/sarg/daily.sh
chkconfig crond on