Squid 是一个万维网客户的高性能代理缓存服务器。它支持 FTP、gopher 以及 HTTP 数据对象。与传统的缓存软件不同,Squid 只用一个非堵塞的 I/O 驱动的进程来处理所有请求。Squid 保存元数据,把特别热门的对象缓存在内存中;它还缓存 DNS 查寻,支持非堵塞 DNS 查寻,并对失败的请求实现负缓存。
Squid 由一个主服务器程序 squid,一个域名系统查寻程序 (dnsserver),一个用来检索 FTP 数据的程序 (ftpget),以及一些管理和客户工具组成。
squid之透明代理服务器
原理:在正向代理服务器中客户端不用指明网关,只要客户端在每次上网时指明代理服务的IP地址和端口号,当客户端把数据包发送到服务器上,服务器就会查找缓存,缓存中如果存在客户端需要的,就直接回复给客户端,可以提高速度,如果缓存中没有,服务器就自己去找,请求完之后放入缓存,然后再给客户端,但是每次上网都要指明代理服务器是很麻烦的,所以在这里我们就用透明代理服务器来解决上面的问题,客户端不用指明代理服务器的IP和端口号,对于代理服务器客户端是看不到的,但是代理服务器仍然是存在的,假如客户端访问www.baidu.com,在这里需要明DNS指向,DNS的IP是外网,而且代理服务器又不支持DNS代理,所以DNS不能被解析,我们可以使用SNAT转换,打开代理服务器的数据包转发功能,这样就可以把DNS给解析,然后目标主机的IP地址就有(在这里我们只给DNS做NAT,如果要是都做SNAT,那客户端发的数据包就不会经过代理服务了),当客户端把数据包发送到代理服务器,数据包中有目标IP,源IP,TCP协议,端口号,代理服务器就会把协议的端口号改为3128进行重定向,实现上网功能,
透明代理的配置步骤
1.客户端 配置网关 dns指向
2.服务器上 重定向 80---3128{squid}
3.服务器上 SNAT (DNS}
4.服务器 数据包转发 /etc/sysctl.conf systcl -p
5.服务器 支持透明代理 transparent
案例:完成PC1能过通过透明代理服务器上网,如下拓扑
常见的代理服务器有Squid、Varnish(只做反向代理)、ATS、Nginx(既是可以做web服务器又可以做反向代理,但通常做反向代理)
按照上面的原理我们来画拓扑图
配置步骤:
(1)挂载光盘到指定目录中,并安装squid软件包(服务器需要2块网卡,1块是(图中eth1)桥接用来连接外网,一块是(图中eth0)host-only链接方式,用于和内网主机链接)
通过rpm来安装squid软件包
[root@localhost ~]# mkdir /mnt/cdrom #新建光盘挂载点
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom #把光盘挂载到挂载点
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@localhost ~]# cd /mnt/cdrom/Server #切换到服务软件包上
[root@localhost Server]# rpm -ivh squid-2.6.STABLE21-3.el5.i386.rpm #安装squid软件包
warning: squid-2.6.STABLE21-3.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:squid ########################################### [100%]
[root@localhost Server]# rpm -ql squid |less #安装好后我们来查看文件存放路径
/etc/httpd/conf.d/squid.conf #和apache可以一起使用
/etc/logrotate.d/squid
/etc/pam.d/squid
/etc/rc.d/init.d/squid #控制脚本
/etc/squid/squid.conf #服务器的主要配置文件
/etc/squid/squid.conf.default #如果配置文件不小心被删除,这个文件是配置文件模板
/usr/lib/squid #服务器的安装位置
/var/log/squid #日志存放位置
/var/spool/squid #缓存存放
[root@localhost Server]# service squid start #启动服务
init_cache_dir /var/spool/squid... 启动 squid:. [确定]
#Squid的监听端口是tcp/3128 udp/3130
[root@localhost ~]# netstat -tupln |grep squid
tcp 0 0 0.0.0 .0:3128 0.0.0 .0:* LISTEN 4508/(squid)
udp 0 0 0.0.0 .0:44439 0.0.0 .0:* 4508/(squid)
udp 0 0 0.0.0 .0:3130 0.0.0 .0:* 4508/(squid)
[root@localhost ~]#
(2)代理服务器的IP地址配置,要添加一块网卡
(3)PC1我用的是windows server 2003虚拟机,此虚拟机用host-only连接在客户端上配置IP地址,网关,DNS指向
(4)关于DNS的SNAT转换
在服务器上我们使用下面命令
[root@localhost ~]# iptables -t nat –L #打开iptables表格
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
在上面的表中有两个链是我们经常要用到的,PREROUTING和POSTROUTING链,PREROUTING是在路由判断之前,POSTROUTING是在路由判断之后,路由判断就是指当路由收到一个数据包后,会查看目标IP与路由表进行比对,最终找到出口,把数据包放到输出队列,所以SNAT是在路由判断之后,DNAT是在路由判断之前,DNS是UDP,53端口进行追加
[root@localhost ~]# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eth1 -j MASQUERADE
我们可以进行验证,只要能把域名解析为IP地址就可以了
(5)在代理服务器上进行重定向,因为数据包是在网络层传输,数据包中有目标IP,源IP,协议,端口号等,假如客户端访问www.baidu.com,当客户端把数据包发送到服务器后,服务器会把数据包中的端口进行重定向到代理服务器的3128上,就是不需要客户端每次上网都要指明代理服务器IP和端口,由代理服务器自己完成,改变端口重定向还是在iptables表中完成,
[root@localhost ~]# iptables -t nat –R PREROUTING 1 -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
(6)在服务器上打开数据包的转发功能
[root@localhost ~]# vim /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1 #IP地址转发功能打开
[root@localhost ~]# sysctl –p #让修改生效
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
(6)上面的基本做完后我们在配置控制策略
http_port 3128 transparent #在大约920行添加transparent支持透明模式
http_access allow localhost 在637行
http_access allow all #修改http_access deny all为http_access allow all 允许用户访问
[root@localhost]#squid –k parse #查看语法错误
[root@localhost ~]# service squid restart
停止 squid: [确定]
启动 squid:. [确定]
(7)你就测试一下吧