Squid cache(简称为Squid)是流行最广的,使用最普遍的开源缓存代理服务器。squid的主要作用和应用场景有:
用来做前置的Web缓存,加快用户访问Web的速度
代理内网用户访问互联网资源
正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替请求。我们常说的代理也就是正向代理,正向代理代理的是请求方,也就是客户端。
反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的人是谁,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端。
网络层次:网络层
局域网用户访问外网走snat模式,同一个数据包,改变数据包头部的来源地址,再把数据包发到internet。
作用:内网用户上外网(SNAT)和内网服务发布到公网(DNAT)
网络层次:应用层
不改变数据包头信息,把数据包代理给internet的服务器,基于应用层的过滤。
应用层:
官网地址:http://www.squid-cache.org/
[root@squid-server ~]# rpm -ql squid
/etc/squid/squid.conf //配置文件
/etc/rc.d/init.d/squid //启动脚本
/usr/sbin/squid //二进制命令
/usr/share/doc/squid-3.1.10 //手册
/var/log/squid //日志目录
/var/spool/squid //缓存目录
# cat /etc/squid/squid.conf
//设置监听的IP与端口号
http_port 3128
//额外提供给squid使用的内存大小
cache_mem 默认256 MB
//设置squid磁盘缓存最大文件,超过4M的文件不保存到硬盘
maximum_object_size 4 MB
//设置squid磁盘缓存最小文件
minimum_object_size 0 KB
//设置squid内存缓存最大文件,超过4M的文件不保存到内存
maximum_object_size_in_memory 4096 KB
//定义squid的cache存放路径 、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量
cache_dir ufs /var/spool/squid 100 16 256
//log文件日志格式
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
//log文件存放路径和日志格式
access_log /var/log/squid/access.log combined
//设置缓存日志
cache_log /var/log/squid/cache.log
//log轮转60天
logfile_rotate 60
//cache目录使用量大于95%时,开始清理旧的cache
cache_swap_high 95
//cache目录清理到90%时停止
cache_swap_low 90
//定义本地网段
acl localnet src 192.168.1.0/24
//允许本地网段使用
http_access allow localnet
//拒绝所有
http_access deny all
//主机名
visible_hostname xxx.xxxx.xxxx
//管理员邮箱
cache_mgr 123456@qq.com
client: 192.168.221.129
squid-server: 192.168.221.139和192.168.226.137
web-server:192.168.226.135
squid-server设置:
[root@squid-server ~]# vim /etc/squid/squid.conf
59 #http_access deny all
60 http_access allow all //允许访问
69 cache_dir ufs /var/spool/squid 100 16 256 //打卡缓存
70 visible_hostname min1.yu.net //设置主机名
71 access_log /var/log/squid/access.log //定义访问日志
[root@squid-server ~]# service squid start //启动服务
init_cache_dir /var/spool/squid... Starting squid: . [ OK ]
[root@squid-server ~]# ls /var/spool/squid/
00 02 04 06 08 0A 0C 0E swap.state
01 03 05 07 09 0B 0D 0F
//服务器启动后会再缓存目录里产生以下一级、二级缓存目录文件
[root@squid-server ~]# netstat -ntpl |grep squid //检查端口
tcp 0 0 :::3128 :::* LISTEN 3355/(squid)
注意:
若重启squid会报如下警告:
[root@squid-server ~]# service squid restart
Stopping squid: 2018/06/30 20:55:58| WARNING cache_mem is larger than total disk cache space!
................ [ OK ]
Starting squid: . [ OK ]
原因:
默认情况下,cache_mem为256M,而squid的配置里磁盘缓存默认为100M
解决:
方法1:调小cache_mem的值
在配置文件中增加:cache_mem 100 MB
方法2:调大磁盘缓存
修改配置文件中如下内容:
cache_dir ufs /var/spool/squid 256 16 256 ——>把100换成256
说明:squid缓存从 内存 ————> 磁盘
cache_mem /var/spool/squid
客户端不需要设置网关和DNS:
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.221.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 192.168.221.1 0.0.0.0 UG 0 0 0 eth0
配置代理服务器前:不能够直接访问web服务
[root@client ~]# ping 192.168.226.135
PING 192.168.226.135 (192.168.226.135) 56(84) bytes of data.
^C
--- 192.168.226.135 ping statistics ---
14 packets transmitted, 0 received, 100% packet loss, time 13245ms
[root@client ~]# curl 192.168.226.135
curl: (7) couldn't connect to host
浏览器配置代理服务器:指定代理服务器的IP和端口
Firefox:
Edit————>Preference————>Advanced————>Network————>Settings————>Manual proxy configuration
编辑--首选项--高级--网络--设置-- 手动填写代理服务器的IP和代理端口
Chrome:
设置——>高级——>打开代理设置——>连接——>局域网设置——>为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口
IE:
设置——>Internet选项——>连接——>局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口
若是Linux命令行界面,需要修改环境变量
[root@client ~]# vim /etc/profile
81 http_proxy=192.168.221.139:3128 //http协议访问时使用代理,也可以设置https,ftp等协议
82 export http_proxy
[root@client ~]# source /etc/profile
//测试
[root@client ~]# curl 192.168.226.135 //curl测试
this is squid-server test page ,IP is 192.168.226.135
[root@client ~]# wget 192.168.226.135 //wget测试
--2018-06-30 21:14:23-- http://192.168.226.135/
Connecting to 192.168.221.139:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 55 [text/html]
Saving to: “index.html.2”
100%[==============>] 55 --.-K/s in 0s
2018-06-30 21:14:23 (4.86 MB/s) - “index.html.2” saved [55/55]
实验环境:
client: 192.168.221.129
squid-server: 192.168.221.139和192.168.226.137
web-server:192.168.226.135
client配置:
1、清空刚才的代理设置。
2、指定自己的默认网关为squid-server的私有地址192.168.221.139
[root@client ~]# route add default gw 192.168.221.139
[root@client ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.221.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 192.168.221.139 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.221.1 0.0.0.0 UG 0 0 0 eth0
3、清空squid-server缓存
[root@squid-server ~]# cd /var/spool/squid/
[root@squid-server squid]# ls
00 02 04 06 08 0A 0C 0E swap.state
01 03 05 07 09 0B 0D 0F
[root@squid-server squid]# rm -rf *
//清空之前的缓存
squid-server端配置:
[root@squid-server ~]# vim /etc/squid/squid.conf
63 http_port 3128 transparent //在代理端口后面加上transparent(透明),代表透明代理
[root@squid-server ~]# service squid restart //重启服务
Stopping squid: [FAILED]
init_cache_dir /var/spool/squid... Starting squid: [ OK ]
[root@squid-server ~]# iptables -t nat -I PREROUTING -s 192.168.221.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128 //添加防火墙规则 将访问80端口的报文重定向到3128端口
[root@squid-server ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- 192.168.221.0/24 anywhere tcp dpt:http redir ports 3128
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
//client 访问测试
[root@client ~]# curl 192.168.226.135
this is squid-server test page ,IP is 192.168.226.135
[root@client ~]# wget 192.168.226.135
--2018-06-30 21:49:08-- http://192.168.226.135/
Connecting to 192.168.221.139:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 55 [text/html]
Saving to: “index.html.4”
100%[==============>] 55 --.-K/s in 0s
2018-06-30 21:49:08 (15.4 MB/s) - “index.html.4” saved [55/55]
//访问成功
[root@client ~]# curl -I 192.168.226.135 //查看是否缓存
HTTP/1.0 200 OK
Last-Modified: Sat, 30 Jun 2018 10:38:20 GMT
Accept-Ranges: bytes
Content-Length: 55
Content-Type: text/html; charset=UTF-8
Date: Sat, 30 Jun 2018 11:28:18 GMT
Server: Apache/2.2.15 (CentOS)
ETag: "80c51-37-56fd9902ac503"
Age: 8529
X-Cache: HIT from min1.yu.net //缓存成功代理服务器是min1.yu.net(也就是squid-server)
X-Cache-Lookup: HIT from min1.yu.net:3128
Via: 1.0 min1.yu.net (squid/3.1.10)
Connection: keep-alive
//停止server端httpd服务,依然可以访问web,证明缓存成功!
[root@server html]# service httpd stop
Stopping httpd: [ OK ]
[root@client ~]# wget 192.168.226.135
--2018-06-30 21:53:34-- http://192.168.226.135/
Connecting to 192.168.221.139:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 55 [text/html]
Saving to: “index.html.5”
100%[==============>] 55 --.-K/s in 0s
2018-06-30 21:53:34 (18.0 MB/s) - “index.html.5” saved [55/55]
环境:
client:192.168.221.129
squid-server:192.168.221.139和192.168.226.137
web-server:192.168.226.135
搭建反向代理服务器:
修改squid配置文件:/etc/squid/squid.conf
[root@squid-server ~]# vim /etc/squid/squid.conf
63 http_port 80 vhost
64 cache_peer 192.168.226.135 parent 80 0 originserver
解释说明:
[root@squid-server ~]# less /usr/share/doc/squid-3.1.10/squid.conf.documented
...
cache_peer hostname type http-port icp-port [options]
cache_peer:做反向代理的关键字
hostname:代表后台真正的web服务器
type:代表代理服务器的类型,有PARENT和SIBLING两种;parent代表父亲,sibling代表兄弟伙伴
http-port:后台web服务的端口
icp-port:代表代理服务器之间通讯的端口(用于查询兄弟缓存的端口)
[options]:代表可选项
originserver:代表原始服务器(真正的web服务)
weight:代表权重
可查看 /usr/share/doc/squid-3.1.10/squid.conf.documented找详细信息
//测试
[root@client ~]# curl 192.168.221.139
this is test page
[root@client ~]# wget 192.168.221.139
--2018-07-02 17:10:26-- http://192.168.221.139/
Connecting to 192.168.221.139:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18 [text/html]
Saving to: “index.html.10”
100%[=============>] 18 --.-K/s in 0s
2018-07-02 17:10:26 (5.25 MB/s) - “index.html.10” saved [18/18]
//访问成功
1. 禁止IP地址为192.168.0.100的客户机上网
acl test src 192.168.0.100 //定义来源IP,test可以自己定义,代表定义的IP
http_access deny test //拒绝test后面定义的源IP:192.168.0.100上网
2. 禁止192.168.1.0这个网段里的所有客户机上网
acl test src 192.168.1.0/255.255.255.0
或者
acl test src 192.168.1.0/24
http_access deny test
3. 禁止用户访问IP为210.21.118.68的网站
acl test dst 210.21.118.68
http_access deny test
4. 禁止用户访问域名为www.163.com的网站
acl test dstdomain –i www.163.com //-i: 忽略大小写
http_access deny test
5. 禁止用户访问域名包含有163.com的网站
acl test url_regex –i 163.com //使用正则表达式匹配URL地址
http_access deny test
6. 禁止用户访问包含有itcast关键字的URL
acl test url_regex –i itcast
http_access deny test
7. 禁止用户访问多个网址
acl test dstdom_regex "/etc/squid/baddsturl"
//如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的
http_access deny test
8. vip用户没有任何限制
acl vip arp 00:0C:29:79:0C:1A //绑定mac地址
http_access allow vip
9. 禁止192.168.2.0这个子网里所有客户机在周一至周五的9点到18点上网
acl test1 src 192.168.2.0/255.255.255.0
acl test2 time D 9:00-18:00
http_access deny test1 test2
时间列表:
S Sunday 周日
M Monday 周一
T Tuesday 周二
W Wednesday 周三
H Thursday 周四
F Friday 周五
A Saturday 周六
D All weekdays (M-F) 周一到周五
10. 禁止用户下载*.mp3,*.exe,*.zip,*.rar带有定义后缀名的文件
acl test urlpath_regex –i \.mp3$ \.exe$ \.zip$ \.rar$ \.txt$
//urlpath_regex:正则表达式匹配URI地址
http_access deny test
注意:
http_access deny的行为要写在allow的上方 先拒绝再允许
总结:acl访问控制,从上往下匹配,如果匹配到了规则不会往下走,如果都没有匹配上规则,则看最后面的
http_access allow|deny all