代理服务器的功能是可以代理局域网内 的个人计算机来向因特网取得网页或其他数据的一种服务,由于代理取的数据可以保存一份在服务器的缓存上,因此往往有类似“加速假象”的功能。还有一种更广泛的功能是局域网**“高级防火墙”**的角色。这里的“高级”指的是OSI七层里边的高层,应用在应用层上的一种防火墙方式,不像iptables是用在网络层、传输层。
代理服务器的原理很简单,就是以类似代理人的身份去取得用户所需要的数据。但是由于它的“代理”能力,使得我们可以通过代理服务器实现防火墙功能与用户浏览数据的分析,也可以节省带宽,以及加快内部网络对因特网WWW的访问速度。
一般来说,代理服务器会搭建在整个局域网的单点对外防火墙上,而在局域网内部的计算机就是通过Proxy来向因特网要求数据,这就是所谓的“代理服务器”。客户端向外部要求的数据事实上都是Proxy帮用户获得的。因此,因特网上看到的要求数据者,将会是Proxy服务器的IP而不是客户端的IP。
- Client向Server发送一个数据需求数据报;
- Server接收之后,先比对这个数据包的来源于预计要前往的目标网站是否可接受?如果来源于目标都合法,那么Server就替Client取得数据;
- Server首先会检查自己的缓存。如果有Client所需的数据,就将数据取出,而不经过Internet要求数据;
- 最后将数据发送给Client。
- Client向Server发送一个需求数据包;
- Server接收之后,开始数据比对;
- Server发现没有Client需要的数据缓存时,准备向因特网获取数据;
- Server开始向Internet发送要求与取得相关数据;
- 最后将数据发送给Client。
Cache的好坏,是影响Proxy效能的关键。
上层代理服务器就是代理服务器的代理服务器,作为上层代理的服务器都具有较高的带宽,而上层代理服务器最大的好处是分流。
代理服务器与NAT服务器的差异 | 说明 |
---|---|
NAT服务器功能 | 主要通过数据包过滤的方式,并使用iptables的nat表格进行IP伪装(SNAT),让客户端自行前往因特网的任何地方的一种方式。主要的运作行为是OSI的二、三、四层。由于是通过数据包过滤与伪装,因此客户端可以使用的端口号弹性较大 |
Proxy服务器功能 | 主要通过Proxy的服务程序提供网络代理的服务,因此Proxy能不能进行某些工作,与该服务的程序功能有关。举例来说,你的Proxy并没有提供邮件或FTP代理,那么你的Client就无法取得这些网络资源。主要工作行为在OSI的应用层。 |
主要的功能:
常被用于大型的企业内部,因为可以实现杜绝内部人员上班时使用非WWW以外的网络服务,而且还可以监测用户的资料要求流向与流量。
优点:
缺点:
什么时候需要架设代理服务器:
[root@server ~]# yum install squid -y
主要的配置文件:
主要的配置文件 | 说明 |
---|---|
/etc/squid/squid.conf | 主要配置文件 |
/etc/squid/mime.conf | 设置squid所支持的Internet上面的文件格式,就是所谓的mime格式 |
其他重要目录与文件:
其他重要目录与文件 | 说明 |
---|---|
/usr/sbin/squid | 提供squid主程序 |
/var/spool/squid | 默认的squid缓存存储的目录 |
/usr/lib64/suqid/ | 提供squid额外的控制模块,尤其是影响认证密码方面的程序 |
在默认情况下,Centos的squid具有以下几个特色:
可以看到squid的默认值都是针对小型网络提供的。
[root@server ~]# vim /etc/squid/squid.conf
#1、信任用户与目标控制,通过acl定义出localhost/localnet等相关用户
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
#2、定义可取的数据端口所在
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
#3、定义这些名称时都可放行的标准依据(有顺序)
http_access deny !Safe_ports #拒绝非正规的端口连接要求
http_access deny CONNECT !SSL_ports #拒绝非正规的加密端口连接要求
http_access allow localhost manager #放行本机的管理功能
http_access deny manager #其他管理来源都拒绝
http_access allow localnet #放行内部网络的用户来源
http_access allow localhost #放行本机的使用
http_access deny all #全部都给予拒绝
#4、网络相关参数
http_port 3128 #默认监听客户端要求的端口,是可以改的,如果加密连接,可使用port 923
#5、缓存与内存相关参数设置
hierarchy_stoplist cgi-bin ?
cache_mem 8 MB #额外内存,用来处理最热门的缓存数据(需自己加)
#6、磁盘高速缓存目录所在
cache_dir ufs /var/spool/squid 100 16 256 #默认使用100MB的缓存容量
coredump_dir /var/spool/squid
[root@server ~]# systemctl start squid
[root@server ~]# netstat -tulnp | grep squid
tcp6 0 0 :::3128 :::* LISTEN 29456/(squid-1)
udp 0 0 0.0.0.0:41190 0.0.0.0:* 29456/(squid-1)
udp6 0 0 :::46867 :::* 29456/(squid-1) [root@server ~]# systemctl enable squid
磁盘高速缓存是影响Proxy性能的一个重要因素,那么squid是如何将缓存存进磁盘呢?squid是将数据分成一小块一小块,然后分别放置到个别的目录中。由于较多的目录可以节省在同一个目录内找好多文件的时间,因此,在默认的/var/spool/squid/目录下,squid又将它分成两层子目录来存放现相关的缓存数据。
[root@server squid]# ls /var/spool/squid/
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F swap.state
#16个子目录
[root@server squid]# ls /var/spool/squid/00
00 0B 16 21 2C 37 42 4D 58 63 6E 79 84 8F 9A A5 B0 BB C6 D1 DC E7 F2 FD
01 0C 17 22 2D 38 43 4E 59 64 6F 7A 85 90 9B A6 B1 BC C7 D2 DD E8 F3 FE
02 0D 18 23 2E 39 44 4F 5A 65 70 7B 86 91 9C A7 B2 BD C8 D3 DE E9 F4 FF
03 0E 19 24 2F 3A 45 50 5B 66 71 7C 87 92 9D A8 B3 BE C9 D4 DF EA F5
04 0F 1A 25 30 3B 46 51 5C 67 72 7D 88 93 9E A9 B4 BF CA D5 E0 EB F6
05 10 1B 26 31 3C 47 52 5D 68 73 7E 89 94 9F AA B5 C0 CB D6 E1 EC F7
06 11 1C 27 32 3D 48 53 5E 69 74 7F 8A 95 A0 AB B6 C1 CC D7 E2 ED F8
07 12 1D 28 33 3E 49 54 5F 6A 75 80 8B 96 A1 AC B7 C2 CD D8 E3 EE F9
08 13 1E 29 34 3F 4A 55 60 6B 76 81 8C 97 A2 AD B8 C3 CE D9 E4 EF FA
09 14 1F 2A 35 40 4B 56 61 6C 77 82 8D 98 A3 AE B9 C4 CF DA E5 F0 FB
0A 15 20 2B 36 41 4C 57 62 6D 78 83 8E 99 A4 AF BA C5 D0 DB E6 F1 FC
#256个子目录
第一层的16个子目录和第二层的256个子目录是怎么出来的呢?我们来看看cache_dir这个重要的参数设置
cache_dir ufs /var/spool/squid 100 16 256 #默认使用100MB的缓存容量
第一个100:代表缓存容量是100MB
第二个16:代表第一层子目录16个
第三个256:没层次的子目录256个
为了解决缓存数据填满整个缓存区域的问题,squid还有两个重要设置:
cache_swap_low 90 #缓存区域容量90%以下不会删除
cache_swap_high 95 #缓存区域容量95%以上时,删除旧数据
cache_mem并不是指“我要使用多少内存给squid使用”,而是指“我还要额外提供多少内存给squid使用”。
修改信任用户的管理参数,acl的基本语法如下:
acl <自定义的acl名称> <要控制的acl类型> <设置的内容>
src ip-address/netmask
主要控制来源的IP地址。
acl Li src 172.16.0.50/16
src addr1-addr2/netmask
主要控制一段范围的IP地址
acl Li src 172.16.0.0-172.16.0.255/16
srcdomain .domain.name
如果来源主机的IP一直变,我们可以使用主机名来开放
acl Li srcdomian .client.lan
dst ip-addr/netmask
控制不能去的目标网站IP
acl dropip dst 192.168.0.1/24
dstdomain .domain.name
控制不能去的目标网站的主机名
acl dropfb dstdomain .baidu.com
url_regex [-i] ^http://url
使用正则表达式来处理网站的一种方式
acl ksuurl url_regex ^http://www.baidu.com/.*
urlpath_regex [-i] .gif$
上一个需要填写完整的网址数据,这里是根据网址列的部分比对来处置,比如,只要是网址列出的gif的就符合
acl sexurl urlpath_regex /sexy.*\.jpg$
还可以使用外部的文件来提供相对应的acl内容设置值。举例来说,如果我想抵挡的主机名经常变动,那么我可以使用/etc/squid/dropdomain.txt来设置主机名:
acl dropdomian dstdomian "/etc/squid/dropdomain.txt"
然后在dropdomain.txt文件中,一行一个主机名。
设置好acl之后,接下来就是看到底能不能放行。放行与否跟http_access这个项目有关。基本上http_access就是拒绝(deny)和允许(allow)两个控件目,然后加上acl名称就可以了。但特别注意的是:http_access后面接的数据,是有顺序的。
[root@server squid]# vim /etc/squid/squid.conf
acl Li src 172.16.0.50/16 10.0.0.155/8
acl dropdomain dstdomain .baidu.com
acl dropsex urlpath_regex /sexy.*jpg$
http_access deny dropdomain #这三行顺序很重要
http_access deny dropsex
http_access allow Li
通常的做法是,先将要拒绝的写上去,然后才写要放行的数据。
acl QUERY urlpath_regex cgi-bin ?
cache deny QUERY
# Add any of your own refresh_pattern entries above these.
#refresh_pattern <最小时间> <百分比> <最大时间>
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
# Add any of your own refresh_pattern entries above these.
#
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
refresh_pattern \.li\. 120 50% 1440 #当网址出现.li.字样时,该数据暂为暂时使用的,2小时就算旧数据,最长时间为1天,且经过50%的时间后,也算是旧数据
这样,Firefox的Proxy就配置好了!
当我们连接被拒绝的网站时,会出现什么呢?(测试拒绝访问百度)
acl dropdomain dstdomain .baidu.com
http_access deny dropdomain #这三行顺序很重要