简介:

Squid 是 Linux/Unix 平台下最为流行的高性能免费应用层代理服务器,它具有权限管理灵活、性能高和效率快的特点。

代理服务器可以提供文件缓存、复制和地址过滤等服务,充分利用有限的出口带宽,加快内部主机的访问速度。

同时可以作为一个防火墙,隔离内外网,并且能够提供监控网络和记录传输信息的功能,加强局域网的安全性。

代理服务器工作原理:

1、客户端 A 向代理服务器发出访问 Internet 的请求 。
2、代理服务器接受请求后,首先与访问控制列表中的访问规则相匹配,如果满足规则,则在缓存中查找是否有需要的资源信息。
3、如果缓存中存在客户端 A 的请求信息,那么将此信息返回给客户端 A ; 如果没有代理服务器将代替客户端去向 Internet 请求指定的信息。
4、Internet 上的主机将请求的信息发送到代理服务器,代理服务器会将信息存入缓存中。
5、代理服务器将 Internet 上主机的返回信息传给客户端 A 。
6、当客户端 B 也请求相同的信息时。
7、代理服务器也会接受请求后,与访问控制列表中的规则相匹配。、
8、如果满足规则,代理服务器将会把缓存中的信息直接传给客户端 B 。

Squid 对硬件的要求:

1、内存短缺会严重影响性能。
2、硬盘空间也是一个重要因素,更多的磁盘空间意味着更多的缓存目录和更高的命中率。
3、Squid 需要使用硬盘作为缓存 Cache ,所以对硬盘的存取速度要求较高,最好配置万转高速 SCSI 硬盘和磁盘阵列。
#安装
yum -y install squid

#配置
cd /etc/squid/ && cp squid.conf squid.conf.bak

grep -P -v '#|^$' squid.conf

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

#以上是默认的有效配置

#这里手动编写一个

> squid.conf      # 清空默认配置文件

vim squid.conf 

http_port 192.168.1.88:3128
## 指定在哪个 IP 跟 端口监听客户机请求,默认为所有 IP 的 3128 端口,即 http_port 3128

cache_mem 64 MB
## 内存缓存大小,指定可以使用多少物理内存作为高速缓存。如果此服务器就是专门的缓存服务器,可以指定为物理内存的一半。否则不应大于三分之一

cache_dir ufs /opt/squid_cache 4096 16 256
## 磁盘缓存区大小,ufs                为缓存的存储类型,一般为 ufs
                   /opt/squid_cache   指定缓存存放目录
                   4096               缓存空间最大为 4096 MB
                   16                 硬盘缓存目录下可以创建 16 个一级子目录,默认为 16 个
                   256                每个一级子目录下可以创建 256 个二级目录,默认为 256 个

## 之所以创建这么多子目录是因为:

   如果子目录太少,则存储在一个子目录下的文件数目会很多很多,会导致系统寻找某一个文件的时间增加,从而影响整体性能

cache_effective_user squid
## 使用缓存的有效用户,如果系统没有此用户需手动添加

cache_effective_group squid
## 使用缓存的有效组,如果系统没有此组需手动添加

dns_nameservers 8.8.8.8
## 为了使 Squid 能解析域名需定义真实 DNS 地址

cache_access_log /var/log/squid/access.log
## 访问日志文件路径,记录了用户访问 Internet 的详细信息,可以查看每用户的上网记录

cache_log /var/log/squid/cache.log
## 缓存日志文件路径,记录了缓存相关的日志信息

cache_store_log /var/log/squid/store.log
## 网页缓存日志文件路径,记录了网页在缓存中调用情况

visible_hostname 192.168.1.88
## 定义运行 Squid 的主机名称,当访问发生错误时,该选项会显示在错误提示网页中

cache_mgr wangxiaoqiang888@163.com
## 设置 Squid 代理服务器管理员 E-mail 地址,访问发生错误时会提示在错误页面中

acl all src 0.0.0.0/0.0.0.0
## 访问控制列表,默认拒绝所有访问客户机的请求

   acl 格式:acl 列表名 列表类型 [-i] 列表值

## 列表名    区分各个访问控制列表,不能相同,尽量使用有意义的名称,如:badurl、badip、clientip、work time 等

## 列表类型  src                     源 IP 地址( 客户机 IP 地址 )
             dst                     目标 IP 地址 ( 服务器 IP 地址 )
             srcdomain               源名称( 客户机所属的域 )
             dstdomain               目标名称( 服务器所属的域 )
             time                    一天中的时间和一周内的一天   
             url_regex               URL 规则表达式匹配
             urlpath_regex:URL-path  略去协议和主机名的 URL 规则表达式匹配
             proxy_auth              通过外部程序进行用户认证
             maxcocnn                单一 IP 最大连接数
             time                    时间段:[星期][时间段]
                                     [星期]:M( Monday    ,星期一 )
                                             T( Tuesday   , 星期二 )
                                             W( Wednesday , 星期三 )
                                             H( Thursday  , 星期四 )
                                             F( Friday    ,星期五 )
                                             A( Saturday  , 星期六 )
                                             S( Sunday    , 星期日 )
                                     [时间段]:可以表示为 10:00-21:00

## -i        选项,加 -i 表示列表值的不区分大小写

## 列表值    对应列表类型,值也不同,可以是 IP 、时间、域名等

http_access allow all
## 允许或拒绝某个访问控制列表的 HTTP 请求,格式为:http_access [allow|deny] 列表名
#建立缓存目录
mkdir /opt/squid_cache

chown -R squid.squid /opt/squid_cache/

#检查配置是否有误
squid -k check

## squid -k check 检查 squid.conf 是否配置有误,最后一行是因为没有启动 squid 服务
## 前面五行是因为 3.0 版本后不让使用 all 这个列表名,默认就有一个 all 为所有
## 允许所有主机能够使用代理就变成了 http_access allow all ( 不需要 acl 申明了 ,即删除 acl all src 0.0.0.0/0.0.0.0 )

#初始化服务
squid -z

#查看下二级目录

ls /opt/squid_cache/00/

#启动服务
systemctl start squid 

#测试
curl -x 192.168.1.88:3128 www.sina.com

#查看下请求后生成的文件
find /opt/squid_cache/ -type f

#防火墙打开端口 使用客户端浏览器访问
#iptables -I INPUT 4 -i eth0 -p tcp --dport 3128 -j ACCEPT
firewall-cmd --zone=public --add-port=3128/tcp --permanent
firewall-cmd --reload

#浏览器代理设置
 搜狗浏览器 -- 工具 -- 选项 -- 高级 -- 代理设置 -- 编辑 -- 连接 -- 局域网设置 -- 填写代理服务器 IP 端口 -- 确定

#多次访问后查看目录
find /opt/squid_cache/ -type f


#访问控制列表
禁止 192.168.1.110 使用代理上网

acl badclientip src 192.168.1.110
http_access deny badclientip

## 顺序很重要,把想拒绝的放前面,然后重新加载配置文件,当 1.110 访问网页时则提示拒绝访问

#禁止一个网段上网
acl badclientnet src 192.168.1.0/24
http_access deny badclientnet

## /24 也可以写成 /255.255.255.0 的形式

禁止访问 IP 为 61.135.169.121 的网站

acl badwebserver dst 61.135.169.121
http_access deny badwebserver

## 这里其实直接写成 baidu.com www.baidu.com 也是可以的

禁止访问域名为 www.163.com 的网站,用户可以访问 163.com mail.163.com
acl badwebserver dstdomain www.163.com
http_access deny badwebserver


禁止用户访问域名中包含 163.com 的网站

acl badwebserver url_regex 163.com
http_access deny badwebserver

## 这样就可以全面禁止所有包含 163.com 的网站

禁止用户访问域名包含 sex 的网站

acl badwebserver url_regex sex
http_access deny badwebserver

## 用户无法访问 www.sex.com www.abc.com/sex/index.html 等站点

限制 IP 为 192.168.1.110 的并发最大连接数为 10

acl clientip src 192.168.1.110
acl conn10 maxconn 10
http_access deny clientip conn10

## 通过两条 acl 来限制最大并发连接数,注意 有时候做完就直接不能访问网站了,是因为连接上限了,可以打开一个网页的连接数已经超过了 10

禁止 1.0 网段的 IP 在 9:00-18:00 上网

acl clientnet src 192.168.1.0/24
acl worktime time MTWHF 9:00-18:00
http_access deny clientnet worktime


禁止下载 *.mp3 *.mp4 *.exe *.zip *.rar 类型的文件

acl badfile urlpath_regex -i .mp3 .mp4 .exe .zip .rar
http_access deny badfile
## urlpath_regex 略去协议和主机名的 URL 规则表达式匹配方式,-i 忽略列表值的大小写,此规则可以禁止下载这些后缀的文件