Squid
是基于应用层的网关防火墙,它的作用是:
####
通过缓存的方式为用户提供
Web
访问加速
####
对用户的
Web
访问进行过滤控制
但是
squid
只支持如:
http
、
ftp
、
https
等少数协议
代理分为:正向代理、反向代理、透明代理
正向代理又分为
:
####
普通代理:即标准的、传统的代理服务,需要客户机在浏览器中指定代理服务器的地址、端口
####
透明代理:适用于企业的网关主机(共享接入
Internet
)中,客户机不需要指定代理服务器地址、端口等信息,需要设置防火墙策略将客户机的
Web
访问数据转交给代理服务程序处理
反向代理:为
Internet
用户访问企业
Web
站点提供缓存加速
squid
软件包名:
squid-2.6.STABLE6
服务名:
squid
主程序:
/usr/sbin/squid
配置目录:
/etc/squid/
主配置文件:
/etc/squid/squid.conf
默认监听端口:
TCP 3128
默认访问日志文件:
/var/log/squid/access.log
squid -z
(初始化缓存目录结构)
squid -D
(也可启动
squid
服务,但不做
dns
解析测试)
常用配置项如:
http_port 3128 (
定义监听端口为
3128)
cache_mem 64 MB
(定义缓存大小为
64MB
)
maximum_object_size 4096 KB
(定义最大的缓存对象为
4096KB
)
reply_body_max_size 10240000 allow all(
定义访问响应对象不能大于
10MB)
access_log /var/log/squid/access.log squid
(定义访问日志位置)
visible_hostname proxy.test.com
(定义可用主机名)
cache_dir ufs /var/spool/squid 100 16 256
(其中
ufs
为缓存数据的存储格式;
100
表示为缓存目录分配的磁盘空间,并以
MB
为单位;
16
表示缓存空间的一级子目录个数;
256
表示缓存空间的二级子目录个数)
###############################################################################
Squid
代理时可以做的一些限制规则这里我们用实验来演示,实验网络环境:
Squid
服务器内网卡
|
192.168.10.10
|
Squid
服务器外网卡
|
192.168.0.103
|
Squid
内网中的客户端
|
192.168.10.11
|
外网地址
|
192.168.0.254
|
Squid
服务器上:
[root@server5 ~]# yum list all |grep squid
(列出
squid
软件包)
[root@server5 ~]# yum install squid
(安装
squid
软件包)
[root@server5 ~]# service squid start
(启动
squid
服务)
[root@server5 ~]# chkconfig squid on
(添加
squid
到开机自启动列表)
[root@server5 ~]# netstat -tunlp |grep :3128
(查看端口是否开放)
tcp 0 0 0.0.0 .0:3128 0.0.0 .0:* LISTEN 9750/(squid)
[root@server5 ~]# cd /etc/squid/
(切换到
squid
配置目录)
[root@server5 squid]# ls
[root@server5 squid]# grep -v "^#" squid.conf | cat �Cs
(显示
squid
已启用的选项,并若有多个空白行则只显示一个空白行)
acl all src 0.0.0 .0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 70
acl Safe_ports port 443
acl Safe_ports port 210
acl Safe_ports port 1025-65535
acl Safe_ports port 280
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 777
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 localhost
http_access deny all
icp_access allow all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /var/log/squid/access.log squid
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
coredump_dir /var/spool/squid
[root@server5 squid]# cp squid.conf squid.conf2
(为了防止出错嘿嘿咱先保存一份)
[root@server5 squid]# squid -k parse
(分析
squid
系统初始化是否有错误)
验证代理服务器功能
在
squid
服务器上:
[root@station5squid]# ls /usr/share/squid/errors/
(查看语言类型)
[root@server5 ~]# vim /etc/squid/squid.conf
reply_body_max_size 10240000 allow all
(访问对象只能小于等于
10M
才可以被访问)
#http_access allow localhost
(默认只允许为本机代理,其它均拒绝)
#http_access deny all
http_access allow all
(把
http_access deny all
修改为所有的都允许)
http_port 192.168.10.10:8080(
指定代理网关和端口
)
visible_hostname proxy.benet.com
(指定代理主机名)
error_directory /usr/share/squid/errors/Simplify_Chinese
(修改访问出错信息为中文显示)
[root@server5 ~]# service squid restart(
重启生效)
在
squid
内网中的客户端上:
[root@station19 ~]# export HTTP_PROXY=192.168.10.10:8080
(指定代理网关、代理端口)
[root@station19 ~]# echo $HTTP_PROXY
192.168.10.10:8080
[root@station19 ~]# elinks 192.168.0.254:80(squid
客户端访问并以图形界面显示
)
在
squid
服务器上验证:
[root@server5~]# tail -f /var/log/squid/access.log
(检查代理服务器的日志文件应发现客户机的
HTTP
访问记录
)
1267970936.677 78 192.168.10.11 TCP_MISS/301 702 GET http://192.168.0.254/course - DIRECT/192.168.0.254 text/html
(表明代理访问已成功)
在
squid
客户端上访问:
http://192.168.0.254/course/
在浏览器中下载看到小于10M
大小的文件时允许保存
在浏览器中下载看到超过10M
大小的文件时则被拒绝
基于
ACL
的访问控制代理:
可以从客户机的
IP
地址、请求访问的
URL/
域名
/
文件类型、访问时间、并发请求数等各方面进行控制
应用访问控制的方式:
定义
acl
列表
acl
列表名称
列表类型
列表内容
…
针对
acl
列表进行限制
http_access allow
或
deny
列表名
……
常用的
ACL
列表类型有:
src
、
dst
、
port
、
srcdomain
、
dstdomain
、
time
、
maxconn
、
url_regex
、
urlpath_regex
例:禁止任何客户机使用代理服务器
acl all src 0.0.0 .0/0.0.0.0
http_access deny all
ACL
列表定义示例
acl LAN1 src 192.168.10.0/24
acl PC1 src 192.168.10.12/32
acl Blk_Domain dstdomain .qq.com
acl Work_Hours time MTWHF 08:30-17:30
acl Max20_Conn maxconn 20
acl Blk_URL url_regex -i ^rtsp:// ^mms://
acl Blk_Words urlpath_regex -i sex adult
acl RealFile urlpath_regex -i \.rmvb$ \.rm$
根据已经定义的部分ACL
列表进行访问控制
http_access deny LAN1 Blk_URL
http_access deny LAN1 Blk_Words
http_access deny PC1 RealFile
http_access deny PC1 Max20_Conn
http_access allow LAN1 Work_Hours
访问控制规则的匹配顺序
没有设置任何规则时,将拒绝所有客户端的访问请求
有规则但找不到相匹配的项时将采用与最后一条规则相反的权限,即如果最后一条规则是allow
,那么就拒绝客户端的请求,否则允许该请求
如何实现透明代理:
前提:
客户机的Web
访问数据要能经过防火墙
代理服务构建在网关(防火墙)主机中
配置要求:
代理服务程序能够支持透明代理
设置防火墙规则,将客户机的Web
访问数据自动重定向给代理服务程序处理
配置简要步骤:
修改squid.conf
配置文件,并重新加载该配置
http_port 192.168.10.1:8080 transparent
添加iptables
规则
iptables -t nat -I PREROUTING -i eth1 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 8080
客户机浏览器
不需要在浏览器中指定代理服务器的地址、端口
验证透明代理的实施效果
反向代理实现步骤:
修改squid.conf
文件,并重新加载该配置
http_port 218.29.30.31:80 vhost
cache_peer 192.168.10.7 parent 80 0 originserver weight=5 max-conn=30
cache_peer 192.168.10.8 parent 80 0 originserver weight=5 max-conn=30
cache_peer 192.168.10.9 parent 80 0 originserver weight=5 max-conn=30
cache_peer 192.168.10.6 parent 80 0 originserver weight=1 max-conn=8
cache_peer Web
服务器地址
服务器类型 http
端口 icp
端口 [
可选项]
验证反向代理的实施效果
在上游Web
服务器(192.168.10.6
~192.168.10.9
)中开启httpd
服务
在Internet
中的客户机(218.29.30.29
)中访问反向代理服务器主机(http://218.29.30.31
),应能够看到实际由上游Web
服务器提供的网页内容
查看反向代理服务器的访问日志信息
[root@localhost ~]# tail -1 /var/log/squid/access.log
1231256531.038 35 218.29.30.29
(客户及地址) TCP_MISS/200 2869 GET http://218.29.30.31/
(反向代理服务器地址)/index.php? - FIRST_UP_PARENT/192.168.10.6
(第一台上有web
服务器地址)image/gif
1)
src
是基于来源的控制
若允许
192.168.10.0/24
网段可以被访问
[root@server5 ~]# vim /etc/squid/squid.conf
http_access allow mynetwork
acl mynetwork src 192.168.10.0/24
[root@server5 ~]# service squid restart
在
squid
客户机上访问
http
:
//192.168.0.254/course
在
squid
代理服务器上查看客户机的
http
访问记录日志信息:
[root@server5 ~]# tail /var/log/squid/access.log
1267975971.422 739 192.168.10.11 TCP_MISS/404 616 GET http://192.168.0.254/favicon.ico - DIRECT/192.168.0.254 text/html
(看到
192.168.10.0/24
网段可以被访问)
2
)
dst
基于目标的访问控制:
假设不允许访问
192.168.0.254
的服务器
[root@server5 ~]# vim /etc/squid/squid.conf
acl mynetwork src 192.168.10.0/24
acl myserver dst 192.168.0.254/32
http_access deny mynetwork !myserver
[root@server5 ~]# service squid restart
在squid
客户端访问http://192.168.0.254/course,
看到访问被拒绝
在squid
服务器上查看日志:
[root@server5 ~]# tail /var/log/squid/access.log
1267977109.278 7 192.168.10.11 TCP_DENIED/403 1520 GET http://192.168.0.254/course/ - NONE/- text/html
3
)
url_regex
针对完整的
URL
做正则表达式匹配的
,
注意必须是完整的
url
若可以下载包含
pdf
格式的文
[root@server5 ~]# vim /etc/squid/squid.conf
acl mynetwork src 192.168.10.0/24
acl notpdf url_regex -i ^http.*\.pdf
(其中
-i
表示忽略大小写)
http_access allow mynetwork .notpdf
[root@server5 ~]# service squid restart
在
squid
上测试:
http://192.168.0.254/yum/books/
看到
pdf
格式的可以被下载
4
)
urlpath_regex
表示忽略了协议、主机、端口,则只对它们后边的路径做匹配的
若
chm
形式的文件不可以被下载
[root@server5 ~]# vim /etc/squid/squid.conf
acl mynetwork src 192.168.10.0/24
acl notchm urlpath_regex -i .chm \.chm$
http_access allow mynetwork !notchm
[root@server5 ~]# service squid restart
在
squid
客户端上测试:
http://192.168.0.254/yum/books/
看到下载被拒绝掉了
5
)
browser
用来定义浏览类型的
若我们定义不用
firefox
浏览起来浏览
[root@server5 ~]# vim /etc/squid/squid.conf
acl mynetwork src 192.168.10.0/24
acl notfirefox browser MOZILLA
http_access allow mynetwork !notfirefox
在
squid
客户端上用
Firefox
浏览器测试结果已经浏览不到页面了
而打开一个终端用
elinks
测试则仍可以浏览到页面
6
)
time
基于时间的控制
若我们打算从早上
8:00
到第二天
6:00
这期间为上班时间,我们不允许上网,其他时间仍可上网,其实这里只是为了演示跨越
00:00
点的效果
[root@server5 ~]# vim /etc/squid/squid.conf
acl worktime time 8:00-23:59
(这样会取时间的并集)
acl worktime time 00:00-5:59
http_access allow mynetwork !worktime
[root@server5 ~]# service squid restart
在squid
客户端上,在这个时间范围内尝试上外网结果被拒绝掉了
7
)
配置透明代理(透明代理表示不用指定代理服务器就可以上外网)
[root@server5 ~]# vim /etc/squid/squid.conf
http_port 192.168.10.10:8080 transparent
[root@server5 ~]# service squid restart
[root@server5 ~]# iptables -t nat -A PREROUTING -i eth1 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 8080
[root@server5 ~]# service iptables save
[root@server5 ~]# iptables -t nat -L -n
[root@server5 ~]# service iptables restart
去掉
Firefox
上的代理端口照样可以访问
[root@station19 ~]# unset HTTP_PROXY
[root@station19 ~]# echo HTTP_PROXY
HTTP_PROXY
去掉
elinks
代理也可以访问了
8
)
maxconn
表示最多允许连接的个数
[root@server5 ~]# vim /etc/squid/squid.conf
acl mynetwork src 192.168.10.0/24
acl twoconn maxconn 2
http_access allow mynetwork !twoconn
[root@server5 ~]# service squid restart
在
squid
客户机上用
Firefox
打开浏览器,再用
elinks
也去连接浏览器,查看日志此时已经不允许再有其他连接了
注意:正向代理、反向代理、透明代理均不可同时
使用任意两者。