一、什么是代理服务器?下面通过这个例子来认识:
(1)ClientA发出资源请求,根据客户端上的代理服务配置设置,将请求发送到代理服务器。
(2)然后由代理服务器代表客户端发出请求,假如代理服务器将请求发给了一个web主机
(3)Web主机将资源返还给代理服务器
(4)代理服务器将资源返还给客户端,并将内容存储在缓存中
(5)ClientB请求与ClientA相同的资源,和ClientA一样,也会将请求发送到代理服务器
(6)代理服务器已有该资源内容,所以代理服务器直接将资源内容发送给客户端ClientB。
由此可以看出,代理服务器是介于浏览器和Web服务器之间的一台服务器,当你通过代理服务器上网浏览时,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。 而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。
二、代理服务器的功能
代理服务器的功能不止是可以进行缓存,还有很多其他的功能:
(1)连接Internet与Intranet 充当firewall(防火墙):因为所有内部网的用户通过代理服务器访问外界时,只映射为一个IP地址,所以外界不能直接访问到内部网;同时可以设置 IP地址过滤,限制内部网对外部的访问权限;另外,两个没有互联的内部网,也可以通过第三方的代理服务器进行互联来交换信息。
(2)设置用户验证和记账功能,可按用户进行记账,没有登记的用户无权通过代理服务器访问internet,并对用户的访问时间、访问地点、信息流量进行统计。
(3)对用户进行分级管理,设置不同用户的访问权限,对外界或内部的ip地址进行过滤,设置不同的访问权限。
(4)节省ip开销,代理服务器允许使用大量的伪ip地址,如果使用局域网就介入internet,要位局域网内的每台主机都申请一个ip,其费用可想而知,但是使用代理服务器后,只需代理服务器有一个合法的ip地址,LAN内其他用户可以使用私有的ip地址,这样可以节约大量的ip,降低成本。
三、代理服务器的分类
(1)标准代理服务器
这种方式必须在每一个客户端明确指定代理服务器的ip地址、端口号。
(2)透明代理服务器
代理操作对客户端来说是透明的,即不必指明代理服务器的ip和端口
(1)(2)这两种服务器的区分很让人头疼,下面就通过两个小例子,来看这两种代理服务器的区分:
标准代理服务器
当我们在客户端浏览器中打开一个web请求,比如:“http://www.linuxaid.com.cn”,这时将陆续发生以下事件:
<1>.客户端使用某一端口(比如1025)连接代理服务器8080端口,请求web页面“http://www.linuxaid.com.cn”
<2>.代理服务器向DNS请求“www.linuxaid.com.cn”,得到相应的IP地址202.99.11.120。然后,代理服务器使用某一端口(比如1037)向该IP地址的80端口发起web连接请求,请求web页面。
<3>.收到响应的web页面后,代理服务器把该数据传送给客户端。
<4>.客户端浏览器显示该页面。
从www.linuxaid.com.cn的角度看来,连接是在代理服务器1037端口和202.99.11.120的80端口之间建立的。从client的角度看来,连接是在192.168.1.100的1025端口和代理服务器的8080端口之间建立的。
‚透明代理服务器
当我们在客户端浏览器中打开一个web请求,比如“http://www.linuxaid.com.cn”,这时将陆续发生以下事件:
<1>.客户端向DNS请求“www.linuxaid.com.cn”,得到相应的IP地址202.99.11.120。然后,客户端使用某一端口(比如1066)向该IP地址的80端口发起web连接请求,请求web页面。
<2>.当该请求包通过透明代理服务器时,被重定向到代理服务器的绑定端口8080。于是,透明代理服务器用某一端口(比如1088)向202.99.11.120的80端口发起web连接请求,请求web页面。
<3>.收到响应的web页面后,代理服务器把该数据传送给客户端。
<4>.客户端浏览器显示该页面。
从www.linuxaid.com.cn的角度看来,连接是在代理服务器1088端口和202.99.11.120的80端口之间建立的。从client的角度看来,连接是在192.168.1.100的1066端口和202.99.11.120的80端口之间建立的。
(3)反向代理服务器
反向代理服务器时和前两种完全不同的一种代理服务,反向代理服务器位于internet和本地服务器之间,如果internet上的用户想要访问本地服务器,则先要通过这个反向代理服务器,如果用户请求的数据在代理服务器上有缓存,代理服务器直接将缓存发送给用户,如果没有缓存,要现象本地的服务器发出请求,取回数据,进行缓存后再发送给用户。反向代理服务器对外表现为一个web服务器,外部网络简直就可以将它当做一个web服务器而不需要特定的配置,不同之处在于这个web服务器没有保存任何的真实数据,所有的真实的数据都保存在内部的web服务器上。因此对反向代理服务器的***不会使网页的信心遭到破坏,这就增强了web服务器的安全性。反向代理方式和包过滤方式或标准代理方式并没有冲突,因此可以在防火墙设备中同时使用这几种方式,其中反向代理用于外部网路访问内部网络时使用,正向代理或包过滤用于拒绝外部访问方式并提供内部网路对外部网络的访问的能力,因此可以结合这些方式提供最佳的安全的访问方式。
四、实验
1、实验设备:虚拟机里面的两台主机,linux主机充当代理服务器,windows server 2003充当客户机。
实验准备:linux有两块网卡,eth1连接外网,选择网桥连接方式(我主机的ip:192.168.0.102 子网掩码:255.255.255.0 网关:192.168.0.1,DNS是192.168.0.1)设置ip地址192.168.0.104,必须指定网关192.168.0.1,子网掩码255.255.255.0,DNS192.168.0.1,如此就可以和主机一样连接外网;eth0网卡连接内网,ip地址是192.168.93.186,子网掩码255.255.255.0,windows 2003的ip地址是192.168.93.195,子网掩码255.255.255.0(不必配置dns,因为是交给代理服务器来处理),都选择host-only连接方式。
2、安装squid
yum -y install squid.i*
3、安装好之后就可以进行启动了:
[root@localhost ~]# service squid start
init_cache_dir /var/spool/squid... 启动 squid:. [确定]
4、"init_cache_dir /var/spool/squid... 启动 squid:"在刚一开始启动的时候会看到这样的一句话,这是初始化缓存目录,在硬盘上面会有这样的一个目录:
/var/spool/squid,专门用来存放那些缓存。进入到这个目录里面去:cd /var/spool/squid;[root@localhost squid]# ll,会看到以下内容:
drwxr-x--- 258 squid squid 4096 10-31 04:26 00
drwxr-x--- 258 squid squid 4096 10-31 04:26 01
drwxr-x--- 258 squid squid 4096 10-31 04:26 02
drwxr-x--- 258 squid squid 4096 10-31 04:26 03
drwxr-x--- 258 squid squid 4096 10-31 04:26 04
drwxr-x--- 258 squid squid 4096 10-31 04:26 05
drwxr-x--- 258 squid squid 4096 10-31 04:26 06
drwxr-x--- 258 squid squid 4096 10-31 04:26 07
drwxr-x--- 258 squid squid 4096 10-31 04:26 08
drwxr-x--- 258 squid squid 4096 10-31 04:26 09
drwxr-x--- 258 squid squid 4096 10-31 04:26 0A
drwxr-x--- 258 squid squid 4096 10-31 04:26 0B
drwxr-x--- 258 squid squid 4096 10-31 04:26 0C
drwxr-x--- 258 squid squid 4096 10-31 04:26 0D
drwxr-x--- 258 squid squid 4096 10-31 04:26 0E
drwxr-x--- 258 squid squid 4096 10-31 04:26 0F
-rw-r----- 1 squid squid 48 10-31 04:26 swap.state
这一共是十六个目录,每个目录又分为256个小目录,分别放置不同的文件类型。
5、查看squid的端口:
[root@localhost squid]# netstat -tupln |grep squid
tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN 20
说明安装成功,这时候是按照默认的配置来工作的,要让squid按照我们意愿来工作,还要对squid进行相应的配置才可以。
6、查看squid的配置文件:
rpm -ql squid |less //可以看到生成了很多的文件
7、编辑squid的主配置文件:
vim /etc/squid/squid.conf
进入这个文件后会发现这个文件很大,有四千多行,其实有用的需要我们进行配置的也就几十行,其他的都是注释,为了方便,我使用下面的过滤的命令将这些注释行去掉:
grep -v "^#" /etc/squid/squid.conf |grep -v "^$"
执行这个命令后,可以看到主要有下面的内容:
acl all src 0.0.0.0/0.0.0.0 //这里表示是任意ip任意掩码,就是any,all元素就是表示所有的主机。
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 # 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
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT //上面的acl是定义元素,赋予值比如端口号ip地址等,然后下面根 据这个元素来操作这些值,一个元素可以赋多个值。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 //通过http_access来写策略以达到控制的目的,要用到上面的元素,这句中的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
8、现在我先对配置文件不做任何改动,打开一台客户机进行测试
这里是标准的代理服务器,所以要在windows server 2003中进行设置,指定对应的代理服务器和端口,打开IE:
工具->internet选项->连接->局域网设置->代理服务器,如图
9、在浏览器中输入:
会看到被拒绝访问,并且返回这样的语句:
原来squid的默认值是拒绝所有,所以才被拒绝访问,编辑配置文件:
vim /etc/squid/squid.conf,找到下面一行:
637 http_access deny all
只需在这一行前面加上一行:
http_access allow all
重启squid,再次访问百度,就可以访问了!
10、可以通过查看日志来看这次访问的详细:cd /var/log/squid/
[root@localhost squid]# ls
access.log cache.log squid.out store.log
其中的access.log就是访问通过的日志:
[root@localhost squid]# tail -f access.log
可以看到记录的一些关于这次访问的信息,这是第一次访问,仔细看日志记录的内容只是有一些tcp、http的连接,找不到HIT标示。
我们再次访问百度,查看日志会发现很多HIT标示,这是访问命中的标示,为什么会这样呢?很简单,就是因为我们刚才已经访问过百度了,代理服务器已经做过缓存,所以当再次访问的时候代理服务器直接从缓存中拿出来给我们,也就出现访问命中的标示,这正是代理服务器功能的体现。
11、上面我们虽然访问成功了,但只是进行了极小的配置,下面就看一下还需要进行的配置:
http_port 8080 //使用8080作为代理服务器端口,squid默认是使用3128,只是目前比较流行使用8080,可以通过多个http_pot参数来指定多个端口,可以在端口前面加上ip地址,做的这个实例:http_port 192.168.93.186:3128
dns_nameserver //指定dns服务器
visible_hostname //指定主机名,当访问出错时返回给客户端页面包含的名字
cache_dir ufs /var/spool/squid 8000 16 256 //定义缓存机制,缓存目录
cache_mem 1000MB //定义高速缓存,是指使用多收内存来充当缓存
acl lanclient src 192.168.93.0/24
http_access allow lanclient //以上这两项定义可提供代理服务功能的网络,squid默认只为localhost提供代理服务
通过这些参数的设置,重新启动squid,一个最基本的标准代理服务器就配置完成了!
五、访问控制列表
1、访问控制元素
ACL元素是Squid的访问控制基础,ACL指定包括ip地址、端口号、主机名和URL匹配等变量,ACL的语法如下:acl name type value1 value2 ...,可以对一个acl列举多个值。
ACL可用元素有很多,常用的有:
src:通过匹配源ip地址限制访问;
dst:通过匹配目的ip进行访问
time:通过时间限制访问,分别用SMTWHFA表示周一到周六,D表示周一到周五;
maxconn:通过来自客户ip地址的最大同时连接数来限制访问;url_regex:通过匹配url正则表达式来限制访问;
urlpath_regex:和url_regex类似,可以检测某些文件类型
2、访问控制规则
ACL元素是建立访问控制的第一步,第二部是访问控制规则,用来允许和拒绝某些动作,如果有多个动作需注意先后顺序,因为squid总是找到第一个来执行:规则动作 allow|deny ACLname ...
常用的访问控制规则有一下几种:
http_access:决定哪些用户的访问被允许和拒绝
no_cach:被拒绝的内容将不被缓存
reply_body_ max_size:限制http相应主题的最大接受size
Squid默认情况下会通过以下的配置拒绝所有客户端(除localhost)的访问,因此在使用的时候最好将访问控制列表放在以下的控制之前而不是删掉:http_access allow localhost http_access deny all
3、访问控制列表实例
#禁止Squid相应ip地址为192.168.93.100客户端的请求#
acl badclientip1 src 192.168.93.100
http_access deny badclienttip1
#禁止Squid相应192.168.93.0/24子网所有客户端周一到周五的9:00到18:00的请求#
acl clientnet1 src 192.168.93.0/24
acl worktime WTWHF 9:00-18:00
http_access deny clientnet1 worktime
#限制ip地址为192.168.93.200的客户端的并发最大连接数是5#
acl clientip1 src 192.168.93.200
acl conn5 macconn 5
http_access deny clientlip1 conn5
#限制Squid响应客户端下载*.mp3、*.exe、*.zip的文件#
acl badfiles urlpath_regex -i \.mp3$ \.exe$ \.zip$
http_access deny badfiles
#禁止客户端通过Squid访问210.21.118.1#
acl badsrvipl dst 210.21.118.1
http_access deny badsrvipl
以上这些实验都可以做通,这里就不再赘述。
六、多种用户认证方式
在管理方面可能不仅只是限于某些网站不能访问,还有一个常用的方法是必须有合法的用户名和密码,squid才相应客户端的请求。
使用本机文件的用户及密码验证方式:
使用htpasswd命令(要安装了apapche才可以用该命令)生成一个新的用户名及密码文件,过程如下:
1、安装apache(为了使用htpasswd)
Yum -y install httpd.i*
2、使用httd命令生成一个用户及密码文件,在本章中该文件位于/etc/squid/中目录名为.puser,并且建立一个用户user1,密码123:
[root@localhost squid]# htpasswd -cm /etc/squid/.puser user1
New password:
Re-type new password:
Adding password for user user1
3、切换到squid主目录中vim /etc/squid/squid.conf,添加如下的内容:
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/.puser //使用ncsa_auth读取.puser内容
auth_param basic children 10 //使用十辅助进程用于身份验证,默认是5,如果指定过少的进程,squid会在/var/log/squid/cache.log中报警
auth_param basic realm "input username&passwd" //提示
auth_param basic credentialsttl 1 hour//身份验证结果缓存时间
acl authuser proxy_auth REQUIREO //定义一个acl
http_access allow authuser //访问策略,注意这个语句的位置
4、检查语法squid -k parse
5、重新启动
[root@localhost squid]# service squid restart
停止 squid:. [确定] 启动 squid:. [确定]
6、在windows 2003 进行访问,输入http://www.baidu.com得到结果如下
输入用户名user1和密码123,就可以访问到了!