squid代理服务器

Posted on 2020-06-17 12:56  留不住的时间  阅读(273)  评论(0编辑  收藏  举报

  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正则表达式

 

pollLinux中的字符设备驱动中的一个函数。Linux 2.5.44版本后,pollepoll取代。

 

./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行,指定缓存目录,缓存大小为100M16个一级目录,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:设置客户端

awindows客户端

 

 

 

blinux客户端的firefox浏览器

打开firefox浏览器

编辑首选项高级网络设置选择手动设置代理

将代理服务器的IP地址都和端口号填写上,并勾选为所有协议使用相同代理,保存即可

 

clinux客户端的命令行工具(elinkswget等命令行工具,)

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

测试:客户端上访问网站,关掉squidnetwork后再访问。

Csquid上查看日志

[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服务器添加一个网卡:设置eth1ip地址为192.168.4.1,并修改客户端的ip地址:192.168.4.110

web服务器和squideth0桥接到vm1,将squideth1和客户端桥接到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客户端为例

验证透明代理,将代理服务器的钩去掉,并保存设置,设置其网关为squideth1ip地址,然后访问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