squid是一个基于http1.0(目前几乎可以和1.1兼容)的全功能的代理服务器
功能:1 共享网络
2 加快访问速度,节约通信带宽
3 防止内部主机受到攻击
4 限制用户访问,完善网络管理
主要实现网络访问加速的功能。
1 客户端A向代理服务器提出访问Internet的请求;
2 代理服务器接收到请求后,首先与访问控制列表中的访问规则相对照,如果满足规则,在在缓存中查找是否存在需要的信息。
3 如果缓存中存在客户端A需要的信息,则将信息传送给客户端。如果不存在,代理服务器就代替客户端向Internet上的主机请求指定的信息;
4 Internet上的主机将代理服务器的请求信息发送到代理服务器中,同时代理服务会将信息存入到缓存中;
5 代理服务器将Internet上主机的回应信息传送给客户端A;
6 客户端B向代理服务器提出相同的请求;
7 代理服务器也首先与访问控制列表中的访问规则相对照;
8 如果满足,则将缓存中的信息传送给客户端B。
普通代理服务
即标准的、传统的代理服务
需要客户机在浏览器中指定代理服务器的地址、端口
透明代理服务
适用于企业的网关主机(共享接入Internet)中
客户机不需要指定代理服务器地址、端口等信息
需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理
ICP protocol 因特网缓存协议,用于在代理服务器之间交换缓存,使用UDP协议3130端口。
Proxy:Squid,Varnish,ATS,Nginx
传统代理,即正向代理,类似于SNAT
反向代理 类似于DNAT,实现反向代理加速。
CDN:内容分发网路 Content Delievery Network
反向代理
Squid是开源界比较流行的应用层代理服务器,具有权限管理灵活,性能高和效率快等特点。
squid软件包
软件包名:squid-2.6.STABLE6
服务名:squid
主程序:/usr/sbin/squid
配置目录:/etc/squid/
主配置文件:/etc/squid/squid.conf
默认监听端口:TCP 3128
默认访问日志文件:/var/log/squid/access.log
squid的主配置文件:
[root@station39 ~]# cat /etc/squid/squid.conf | grep -v "^#" | grep -v "^$"
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 # 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
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
几个常用配置项:
# cache_mem 8 MB //**代理进程所使用的内存的大小
# maximum_object_size_in_memory 8 KB //**最大缓存对象
#reply_body_max_size 10240000 allow all //**请求的最大文件大小
#access_log /var/log/squid/access.log squid //**访问日志存放位置
#visible_hostname proxy.test.com //**可见主机名
#cache_dir ufs /var/spool/squid 100 16 256 //**指定缓存目录 ufs:所使用的文件系统,
比较快,适合存放小文件;缓存目录;100:缓存目录可是使用的
缓存空间的大小;16:一级缓存子目录的个数; 256:二级缓存子
目录的个数
下面我们来模拟使用squid代理上网的场景:
代理服务器eth0网卡192.168.0.39使用代理可以上网。所以我们假设这里是公网。目的是局域网内的PC机通过代理服务器来上网。
我们来配置代理服务器:
修改/etc/squid/squid.conf主配置文件
[root@station39 ~]# vim /etc/squid/squid.conf
http_port 192.168.10.11:3128
visible_hostname proxy.a.com
cache_mem 128 MB
cache_dir ufs /var/spool/squid 1024 16 256
error_directory /usr/share/squid/errors/Simplify_Chinese //**将错误日志改为中文
http_access allow all //**修改默认访问策略
检查语法:
[root@station39 ~]# squid -k parse
初始化缓存
[root@station39 ~]# squid -z
2011/03/10 19:13:39| Creating Swap Directories
[root@station39 ~]# service squid start
[root@station39 ~]# netstat -ntlp | grep 3128
tcp 0 0 192.168.10.11:3128 0.0.0.0:* LISTEN 13129/(squid)
添加网关:
[root@station39 ~]# route add default gw 192.168.0.254 //**由于我们这里是内网地址,所
以需要通过指定网关的方式来上网
客户端需要在浏览器中设置使用代理访问:
看!已经可以访问外网了!
当勾选use this proxy server for all protocols 时,我们就可以通过代理服务器来访问所有的服务,包括ftp。
几个常用功能的使用:
reply_body_max_size 10240000 allow all //限制用户所能访问的最大资源 line 780
acl 访问控制列表
基于源地址的访问控制
允许来自192.168.10.0/24网段能够访问外网
先定义acl
acl LAN src 192.168.10.0/24 //** line 628
再使用
http_access allow LAN //** line 635
修改默认策略
http_access deny all //**line 639
基于目标地址的访问控制
禁止所有人访问QQ
acl QQ dstdomain .qq.com
http_access deny QQ
禁止192.168.10.0/24访问QQ
acl LAN src 192.168.10.0/24
acl QQ dstdomain .qq.com
http_access allow LAN !QQ
基于url_regex的访问控制
acl GUGE url_regex -i ^http://www.google.com.hk/index.html
http_access allow LAN !GUGE
通过url拒绝对*.iso的访问
acl NOTISO url_regex -i ^.*tp://.*\.iso$
http_access allow LAN !NOTISO
根据时间来做控制:
定义时间段:
acl WORKTIME time MTWHF 08:00-18:00
http_access allow LAN !NOTISO WORKTIME
PS:当两个列表一样时,将以两个列表的并集作为参数的值。
透明代理
透明代理是NAT和代理的完美结合,在这种工作方式下用户感觉不到代理服务器的存在。当客户访问Internet时,请求数据包经过Linux服务器转发时,linux服务器上的iptables将客户机的HTTP请求重定向到Squid代理服务器,由代理服务器代理客户机访问外部信息资源,再将获取的数据传回客户机。
修改squid的主配置文件
http_port 192.168.10.11:8080 transparent //**实现透明代理
添加一条iptables规则:
iptables -t nat -A PREROUTING -i eth1 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 8080
这样客户端依旧无法上网,因为客户端的DNS请求无法发送出去,怎么办?
我们需要再添加一条规则,使内网的DNS请求能够出去
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 192.168.0.127
打开内核路由功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
也许这里由会有疑问了,使用源地址转换直接就可以上网了,那我们的数据还通过squid服务器不?答案是肯定的,因为SNAT是在POSTROUTING链上做的,而我们做透明代理的话是在PREROUTING链上做的,数据包在进入服务器的时候已经被重定向到squid上去了,所以无论如何基于80端口的访问是绕不开squid的。
客户端指定网关:
route add default gw 192.168.10.11
反向代理 reverse proxy
我们来假设一个反向代理的场景
在虚拟机里构建实验环境:
192.168.10.1 192.168.10.11 仅主机 我们假设这是外网
192.168.0.127 192.168.0.254 桥接 我们假设这是一个网站的内部架构
最终目的是让PC机通过squid代理来访问web 服务。
配置squid服务器:
编辑/etc/squid/squid.conf 主配置文件:
http_port 192.168.10.11:80 vhost //** line 919
cache_peer 192.168.0.254 parent 80 0 originserver weight=1 max-conn=1000
//** line 1449
http_access allow all //** line 637 修改ACL
保存退出。
清除缓存
[root@station39 squid]# rm -rf /var/spool/squid/*
重建缓存
[root@station39 squid]# squid -z
2011/03/11 15:52:38| Creating Swap Directories
语法检查
[root@station39 squid]# squid -k parse
重启服务。
我们在客户端使用firefox访问一下192.168.10.11
看!已经可以访问了。这就是反向代理。