安装squid
有的发行版本会预装squid服务,有的则没有。
# yum install squid
代理服务器概述
squid提供缓存加速,应用层过滤控制的功能。当客户机通过代理请求web页面时,指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要的页面,则直接将缓存的页面内容返回给客户机;如果缓存中没有客户机要访问的页面,则由代理服务器向internet中发送访问请求,当获得返回的web页面以后,将网页数据保存到缓存中并发送给客户机。
http代理的缓存加速对象主要是文字,图像等静态web元素。使用缓存后减少了向internet提交重复的web请求的过程,提高了客户机的web访问相应速度。
由于客户机的web访问请求实际上是由代理服务器代替完成的,从而可以隐藏用户的真是IP地址,起到一定的保护作用。代理服务器也可以起到过滤作用。
代理服务器的基本类型
1)。传统代理
就是普通代理服务,在客户机的浏览器,QQ聊天工具等软件中,必须手动设置代理服务器的地址和端口,然后才能使用代理来访问网络。对于也米娜浏览器来说,访问网站是的域名解析请求也要发给指定的代理服务器。
2)。透明代理
提供的功能与传统代理相同,区别在于透明代理不用指定代理服务器的地址和端口。而是通过默认路由,防火墙策略将WEB访问重定向,这个过程对于客户机来说是透明的,客户机不知道自己使用了代理,所以叫透明代理。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先发给DNS服务器。
实际应用中传统代理多用于internet中,例如:电脑程序使用代理可以隐藏本机真实的IP地址,为下载工具使用多个代理可以规避服务器的并发连接限制。透明代理多用于局域网环境。
Squid的配置文件
squid 的配置文件位于 /etc/squid/squid.conf
http_port 3128 //代理服务监听的地址和端口(默认端口为3128);如果服务器有多个网络接口,但只希望给一个IP 提供服务,还可以指定IP地址和接口,例: http_port 192.168.1.33:3128
cache_mem 64 MB //指定缓存功能所使用的内存大小,单位为MB,容量应为4的倍数,建议设为实际内存的1/4到1/3,具体根据服务器的性能和负载而定。
maximum_object_size 4096 KB //允许保存到缓存空间的最大对象(文件)大小,单位KB,超过限制大小的文件将不会被缓存,而是直接发给用户,默认的4096KB基本可以满足一般页面,但是希望代理音频,视频等缓存文件时,则应适当增加参数。
reply_body_max_size 10240000 allow all //允许用户下载的最大文件大小,以字节(byte)为单位,默认设置为0字节,表示不限制。其中 all 指任意用户。
cache_dir ufs /var/spool/squid 100 16 256 //指缓存数据所使用的目录,容量,子目录个数等相关参数。ufs(UNIX file system,squid最早使用的缓存文件的格式)/var/spool/squid 缓存数据的默认存放目录;后面的数字依次表示为缓存目录分配的磁盘空间大小(MB),以及子目录个数,二级子目录个数。当代理的用户数量较多时,可以适当增大缓存目录大小。
access_log /var/log/squid/access.log squid //指定代理服务器的日志位置及记录格式(squid)
visible_hostname proxy.dyq.com // 代理服务器本机的可见主机名
dns_testnames www.google.com www.sina.com.cn www.162.com //用来指定DNS解析,为了确保解析正常,最好设置多个DNS。
传统代理构建
传统代理的特点在于,客户机的相关程序必须指定代理服务器的地址,端口等基本信息。下面举例说明。
例子说明:
服务器A →→ 服务器B(squid代理) →→ 客户机c
192.168.1.12 192.168.1.13 192.168.1.14
配置Squid 实现传统代理服务时,需要注意两个地方:
1. 配置好可见的主机名
2. 添加 http_access allow all 访问策略,以允许任何客户机都可以使用代理服务。
修改squid.conf 配置文件
# vim /etc/squid/squid.conf
http_port 3128
visible_hostname localhost.localdomain
reply_body_max_size 10240000 allow all #允许下载的最大文件大小
http_access allow all #放在http_access deny all 之前
初始化并启动 squid 服务
第一次启动squid服务时,会启动并初始化缓存目录,在没有可用的squid服务脚本的情况下,也可以直接滴啊用squid程序来启动服务,这时需要先进程初始化。
squid -z //-z选项用来初始化缓存目录
squid -D //启动squid服务;-D 表示不DNS测试
修改完squid.conf 配置文件以后,需要重新加载才能生效。
service squid reload
squid -k reconfigure //这两个命令都可以重新加载配置。
确认squid 服务运行正常
# netstat -anpt | grep "squid"
tcp 0 0 :::3128 :::* LISTEN 8556/(squid)
设置客户端配置
一般的浏览器,程序都有配置代理的选项,这个百度就好,不多说了
验证代理服务器
使用代理后的浏览器访问网站,然后再查看服务器的日子文件,查看访问日志,看同一时间的IP 有没有变化。
透明代理
透明代理与传统代理提供的服务是一致的,但是其 透明 的实现依赖与默认路由和防火墙的重定向策略,因此更适合于为互联网主机服务,而不适合为internet中的客户机提供服务。
基于局域网主机通过linux网关访问internet的环境,描述如下:
(1)在linux网关上,构建squid为客户机访问internet提供代理服务。
(2)在所有的局域网客户机上,只需正确设置IP地址,默认网关,不需要手动指定代理服务器的地址,端口等信息
透明代理的关键在于linux网关服务器,而对于客户机仅需正确设置网络地址,默认网关,而并不需要指定代理服务器。
至于客户机的DNS解析功能,最好是通过正常DNS解析,不推荐交给代理服务器处理。下面主要介绍squid服务的透明代理设置,防火墙策略设置,其他操作参考前面的传统代理配置过程。
配置Squid支持透明代理
squid默认不支持透明代理,如果要设置的话,要在 http_port 配置后面加上 transparent(透明)选项,就可以支持了。
# vim /etc/squid/squid.conf
http_port 192.168.1.33:3128 transparent
:wq
# service squid reload
设置iptables的重定向策略
squid服务是构建在linux网关之上的,因此只需正确设置防火墙策略,就可以将局域网主机访问internet的数据包转交给squid进行处理。这需要用到iptables的REDIRECT(重定向)策略,其作用是实现本机端口的重新定向,将访问网站协议http https的外发数据包转交给本机的squid服务(3128端口)
REDIRECT 也是一种数据包控制类型,只能在nat表的PREROUTING或 OUTPUT 链以及被其调用的链中使用,通过 --to-port 端口号 的形式来指定映射的目标端口。
例:192.168.4.0/24 访问的http https 等协议的数据包,转交给运行在本机3128 端口上的squid服务处理
# iptables -t nat -A PREROUTING -i eth1 -s 192.168.4.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128
# iptabbles -t nat -A PREROUTING -i eth1 -s 192.168.4.0/24 -p tcp --dport 443 -j REDIRECT --to-ports 3128
FTP协议因为涉及多个端口,多个连接,使用透明代理不太好实现,所以推荐用传统代理,手动指定代理IP,端口。
验证透明代理的使用
有些软件可以设置代理服务器的地址,在linux中也可以用unset命令清楚 HTTP_PROXY , HTTPS_PROXY 等变量
# unset HTTP_PROXY HTTPS_PROXY
###
ACL访问控制
squid服务器通过合理设置ACL(Access Control List 访问控制列表)并进行限制,可以针对源地址,目标地址,访问的URL路径,访问的时间等各种条件进行过滤。
在配置文件squid.conf中,ACL访问控制通过以下两个步骤来实现:
(1)使用acl配置项定义需要控制的条件
(2)通过http_access配置项对已定义的列表做”允许“或”拒绝“访问的控制。
定义ACL列表
格式:
acl 列表名称 列表类型 列表内容 ...
其中,”列表名称“可以随便起;”列表类型“必须使用squid预定义的值,对应不同类别的控制条件;”列表内容“是控制的具体对象,不同类型的列表所对应的内容也不一样。可以有多个值(以空格分隔,为”或“的关系)
访问控制的关键在于,选择的列表类型,具体条件对象。
设置 acl 访问权限
定义好访问控制列表以后,需要使用 httpd_access 配置项来进行控制。注意:http_access 配置行必须放在对应的acl配置行之后,每一行http_access配置确定一条访问控制规则。
格式:
http_access allow或deny 列表名...
每一条 http_access 规则中可以包含多个列表名,每个列表名之间用空格分开(与 的关系),表示必须满足所有acl列表对应的条件才会进行限制。使用取反条件时,可以在acl 列表前添加 ”!“感叹号。
# vim /etc/squid/squid.conf
http_access den MYLAN MEDIAFLE //禁止客户机下载mp3,mp4等文件
http_access allow MYLAN WORKTIME //允许客户机在工作时间上网
http_access deny all //默认禁止所有客户机使用代理
执行访问控制时,squid将按照各条规则的顺序依次进行检查,如果找到一条相匹配的规则就不再向后搜索(这点与iptables的规则匹配类似)。因此,规则的顺序安排是非常重要的,一下两种默认情况需要我们注意:
(1)没有设置任何规则时:squid服务将拒绝客户端的请求。
(2)有规则但找不到相匹配的项:squid将采用与最后一条规则相反的权限,即如果最后一条规则时allow ,就拒绝客户端的请求,否则允许该请求。
通常情况 下,把最常用到的控制规则放在最前面,以减少squid的负载。在访问控制的总体策略上,建议采用"先拒绝后允许"或“先允许后拒绝”的方式,最后一条规则设为默认策略,设为“http_access allow all”或者“http_access deny all”