您的位置:首页 > 运维架构 > 反向代理

代理服务器squid配置

2012-09-12 23:06 351 查看
代理服务器 iptables router 三种上网的比较

proxy 可以把访问过的web页,图片等缓存缓存到本地,一般不用设置网关

iptables router 都要设置网关,DNS等参数

代理服务器的作用

共享网络,加快网络访问速度,防止内部主机受攻击,限制用户访问等

三种代理类型

正向代理 客户端需要设置代理服务器的IP和代理端口

--代理内部主机上网(共享上网,并可以进行用户限制等功能)

透明代理 客户端不需要设置代理服务器的IP和代理端口,对用户是透明的

反向代理 从网络访问内部服务器,与正向相反

--关于它们的应用:

正向和透明用于控制上网行为,共享上网等网络管理功能

反向代理主要应用于架构。 有四层和七层等之分,可用于动静分离等架构。

客户端 缓存(正向代理) --- 缓存(反向代理) apache+php(缓存) memcache(缓存) mysql(query-cache 缓存)

实验环境

内网用户VM1 squid 服务器 (eth0实际情况下就是外网IP)

eth0 vmnet1 eth0

192.168.212.128 --> 192.168.212.1 192.168.20.35

第一步:安装squid

生产环境尽量使用源码版,优势就是功能自定义,编译时还会检测内核相关参数,定做出适合操作系统运行的软件,唯一缺点就是安装比较麻烦

这里使用的rpm版就可以做今天的所有实验

[root@dns ~]# yum install squid* -y

Summary : The Squid proxy caching server.

Description :

Squid is a high-performance proxy caching server for Web clients,

supporting FTP, gopher, and HTTP data objects. Unlike traditional

caching software, Squid handles all requests in a single,

non-blocking, I/O-driven process. Squid keeps meta data and especially

hot objects cached in RAM, caches DNS lookups, supports non-blocking

DNS lookups, and implements negative caching of failed requests.

Squid consists of a main server program squid, a Domain Name System

lookup program (dnsserver), a program for retrieving FTP data

(ftpget), and some management and client tools.

# rpm -ql squid-2.6.STABLE21-3.el5 |grep conf

/etc/httpd/conf.d/squid.conf

/etc/squid/cachemgr.conf

/etc/squid/mime.conf

/etc/squid/mime.conf.default

/etc/squid/msntauth.conf

/etc/squid/msntauth.conf.default

/etc/squid/squid.conf --主配置文件

/etc/squid/squid.conf.default

/etc/sysconfig/squid

第二步:修改主配置文件

vim /etc/squid/squid.conf

919 http_port 3128 --默认代理端口

1576 cache_mem 100 MB --高速缓存,保存在内存上,一般设置为1/3左右

1784 cache_dir ufs /var/spool/squid 1024 16 256 --缓存目录

1838 cache_swap_low 90

1839 cache_swap_high 95 --缓存空间达到95%时,新的缓存对象进来是替代而不是增加;当空间回到90%时,新的缓存对象进来是增加而不是替代

1946 access_log /var/log/squid/access.log squid --包含了访问日志,客户端请求信息

1963 cache_log /var/log/squid/cache.log --缓存的状态性和调试性信息

1970 cache_store_log /var/log/squid/store.log --包含进入和离开缓存的每个目标的记录

2973 cache_effective_user squid

2986 cache_effective_group squid

3006 visible_hostname li.cluster.com --自己的主机名

637 http_access allow all --默认策略是都拒绝,要改为allow

--上面这些参数大部分都是默认的,我这里就改了三个参数

1576 cache_mem 100 MB

3006 visible_hostname li.cluster.com

637 http_access allow all

第三步:

初始化缓存目录

ls /var/spool/squid --初始化之前为空

squid -zX --z参数创建缓存目录,X参数是打开调试功能,在这里就是可以看到创建过程

ls /var/spool/squid --初始化之后再查看,就创建了16个目录,每个目录里256个子目录

du -sh /var/spool/squid/ --查看一下大小,目前为17M

[root@dns ~]# du -sh /var/spool/squid/

17M /var/spool/squid/

[root@dns ~]# du -s /var/spool/squid/

16452 /var/spool/squid/

第三步:

启动服务

/etc/init.d/squid start

重新装载的话可以使用

/etc/init.d/squid reload

或者使用

squid -k reconfig

停服务可以使用

/etc/init.d/squid stop

或者使用

squid -k shutdown

[root@li ~]# lsof -i:3128 --查看3128端口

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

squid 4937 squid 12u IPv4 36871 TCP *:squid (LISTEN)

第四步:

客户端的测试 --

不用设置网关和DNS指向

主要是修改浏览器

--filefox配置

编辑--性能--高级--网络--设置-- 手动填写代理服务器的IP和代理端口

--IE配置

右键IE图标--连接--局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口

测试:

访问已经访问过的页面是否能感觉到页面加快

再次查看 du -s /var/spool/squid 发现增大,因为缓存了对象

查看相关日志 /var/log/squid/squid/*.log

----------------------------------------------------------

透明代理:

第一步:

在squid服务器上打开路由转发功能

# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

# sysctl -p

transparent Support for transparent interception of

outgoing requests without browser settings.

# vim /etc/squid/squid.conf

http_port 3128 transparent

[root@dns ~]# /etc/init.d/squid restart

第三步:

加上两条iptables规则,做一个NAT地址转换,和一个80端口到3128端口的重定向

[root@dns ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -i vmnet1 -j REDIRECT --to-port 3128

[root@dns ~]# iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth0 -j SNAT --to-source 192.168.20.35

# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eth0 -j SNAT --to-source 192.168.20.35

# iptables -t nat -A POSTROUTING -p tcp --dport 53 -o eth0 -j SNAT --to-source 192.168.20.35

--上面目标端口为80和53的从eth0出去的包都SNAT给代理服务器的出去的地址(192.168.20.35),上面的tcp的53端口那条可以不写,因为dns请求主要是udp,tcp的53用于主从同步等方面

第四步:

客户端的设置:

首先,选择不使用代理

修改网关指向代理服务器的内网地址(我这里为192.168.212.1),DNS指向尚观的192.168.20.1这个路由器IP

测试: OK

client squid 尚观路由器

vmnet1 eth0

192.168.212.128 192.168.212.1 192.168.20.35 192.168.20.1

| |

| |

| |

clinet网关指向192.168.212.1-- |

clinetDNS指向192.168.20.1----------------------------------|

--如果你现在要把client的DNS指向192.168.212.1

--那么你需要在squid服务器上原来的三条规则基础上再加上下面的一个DNAT转换

--把目标53端口访问192.168.212.1转给192.168.20.1

# iptables -t nat -A PREROUTING -p udp --dport 53 -i vmnet1 -j DNAT --to 192.168.20.1

--上面所做的透明代理其实和昨天iptables所讲的几乎一样,唯一多的就是做了一个端口的转换,把它交给3128的squid来上网

--但就上面这样做,并没有看出比昨天使用iptables上网有什么优势

--squid共享上网的优势就在于使用acl访问控制,缓存,资源控制等

==============================================

附:

编译版squid的安装

/share/soft/squid/squid-3.0.STABLE25.tar.gz

[root@squid /]# tar xf squid-3.0.STABLE25.tar.gz -C /usr/src/

[root@squid /]# cd /usr/src/squid-3.0.STABLE25/

--上次的编译参数

[root@squid squid-3.0.STABLE25]# ./configure --enable-async-io=160 --enable-gnuregex --enable-storeio=ufs,aufs,diskd --enable-icmp --enable-delay-pools --enable-useragent-log --enable-referer-log --enable-arp-acl --enable-ssl --enable-ipfw-transparent --enable-ipf-transparent --enable-pf-transparent --enable-linux-netfilter --enable-linux-tproxy --enable-leakfinder --enable-x-accelerator-vary --with-pthreads --with-large-files

--今天的编译参数

[root@li squid-3.0.STABLE25]# ./configure --enable-gnuregex --enable-async-io=160 --enable-storeio=aufs,diskd,ufs --enable-removal-policies=heap,lru --enable-icmp --enable-delay-pools --enable-esi --enable-icap-client --enable-useragent-log --enable-useragent-log --enable-referer-log --enable-kill-parent-hack --enable-arp-acl --enable-ipfw-transparent --enable-ipf-transparent --enable-pf-transparent --enable-linux-netfilter --enable-linux-tproxy --enable-leakfinder --enable-x-accelerator-vary --with-pthreads

make ; make install

[root@squid ~]# ls /usr/local/squid/

bin etc libexec sbin share var

修改配置文件 --步骤省略

建立相关用户和目录

# useradd -d /dev/null -s /sbin/nologin squid

# mkdir /usr/local/squid/var/cache -p

# chown squid.squid /usr/local/squid/var/cache/

# chown squid.squid /usr/local/squid/var/logs/

初始化squid缓存目录,并启动

# /usr/local/squid/sbin/squid -zX

# /usr/local/squid/sbin/squid -D -N -d1 & --启动,并打开调试信息

=====================================================

squid 里的 ACL 访问控制列表

关于acl的一些实例:

acl badipclient src 192.168.66.132 --拒绝内网的192.168.66.132上网

http_access deny badipclient

acl denyip src 172.16.57.131-172.16.57.132/255.255.255.255

http_access deny denyip

acl baddsturl2 dst 220.11.22.33 --不能访问这个外网IP的网站

http_access deny baddsturl2

acl baddsturl dstdomain -i www.baidu.com --不能访问www.baidu.comWWW.BAIDU.COM;-i参数定义大小写都匹配; 但是可以访问zhidao.baidu.com或tieba.baidu.com,并且可以使用www.baidu.com的IP也可以访问

http_access deny baddsturl

acl baddsturl dstdom_regex -i baidu.com --这是把baidu.com以下的所有域名都禁止 ,但直接使用IP仍然是可以访问的

http_access deny baddsturl

acl baddsturl dstdom_regex "/etc/squid/baddsturl" --如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的

http_access deny baddsturl

acl baddsturl3 url_regex -i baidu --拒绝访问url里有baidu这个关键字的网站

http_access deny baddsturl3

acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$ \.rar$

http_access deny badfile --禁止下载带有定义后缀名的文件

acl vip arp 00:0C:29:79:0C:1A --rpm版不支持,需要编译版squid加上此功能

http_access allow vip

acl badipclient2 src 10.1.1.0/255.255.255.0

acl worktime time MTWHF 9:00-17:00

http_access deny badipclient2 worktime --拒绝10.1.1.0网段工作时间不能上网

acl badipclient3 src 10.1.1.35

acl conn5 maxconn 5

http_access deny badipclient3 conn5 --最大连接数为5

实现如下要求:

1,允许周一到周五12:00-13:30和17:00-20:30和双休能上网,别的时间不能上网

2,禁止下载.exe .rar .zip .mp3 .avi .rmvb .mp4后缀的文件

3,禁止访问qq.com,mop.com,sina.com,163.com,youku.com

4,禁止访问网址中包含某些关键字的网站:比如 sex news movie sport game stock

4, vip没有任何限制

acl lunchtime time MTWHF 12:00-13:30

acl dinnertime time MTWHF 17:00-20:30

acl weekendtime time AS 00:00-24:00

acl badfiletype urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$ \.rar$

acl badwebsite dstdom_regex -i "/etc/squid/badwebsitelist"

acl badkeyword url_regex -i sex news movie game sport love

acl vip src 192.168.66.131 --因为rpm版不支持mac地址的控制,所以我这里使用ip来控制

http_access allow vip

http_access deny all badfiletype

http_access deny all badwebsite

http_access deny all badkeyword

http_access allow all lunchtime

http_access allow all dinnertime

http_access allow all weekendtime

http_access deny all

vim /etc/squid/badwebsitelist

qq.com

mop.com

sina.com

163.com

youku.com

------------------------------

实验环境

内网用户VM1 squid VM2

eth0 vmnet1 eth1 eth0

192.168.212.128-->192.168.212.1 192.168.20.35 <--192.168.20.36

网关指向192.168.212.1 网关指向192.168.20.35

主机名web.cluster.com 主机名li.cluster.com

--注意:

VM1为内部web服务器,绑定主机名为web.cluster.com

squid服务器主机名为li.cluster.com

192.168.212.1为squid的一个内网IP

192.168.20.35为squid的外网IP

192.168.20.36 为外网客户端

1,用一个新的配置文件;如果是在上面的透明代理基础上再做反向代理,先注释掉前面所有的配置

vim /etc/squid/squid.conf

http_port 80 accel vhost vport

--accel 反向代理加速模式

--vhost 支持域名

--vport 支持IP

cache_peer 192.168.212.128 parent 80 0 no-query originserver name=web

--192.168.212.128 内网web服务器的IP

--parent 上下关系,非平级关系

--80 代理内部web服务器的80端口

--0 没有使用icp,表示就一台squid服务器

--no-query 不去查询邻居,与上面的0结合使用

--originserver 表示源实际服务器

--name=web 定义一个名字,让后面的参数引用

cache_peer_domain web web.cluster.com --对web.cluster.com的请求会给web这台服务器(也就是上面定义的192.168.212.128);如果有多台web的话,可以多台web绑定同一个域名,还可以实现RR轮循调度

cache_peer_access web allow all --对web的所有访问都允许

visible_hostname li.cluster.com

http_access allow all

保存后,先不要重启squid;因为我这是在透明代理的基础上再做的,所以要把前面做的缓存和日志给删除,清除iptables规则

# rm /var/spool/squid/* -rf

# rm /var/log/squid/*.log -rf

# iptables -t nat -F

# squid -zX --重新初始化

重启服务,注意不要与apache的80端口冲突

--测试:

192.168.20.36这台客户端,使用http://192.168.20.35访问不了

因为web.cluster.com和外网IP192.168.20.35绑定了,但是web.cluster.com确是内部web服务器192.168.212.128的主机名

所以这里客户端的DNS解析web.cluster.com应该得到192.168.20.35的结果

所以这里不做DNS的话,就直接在/etc/hosts里写上

192.168.20.35 web.cluster.com

再使用http://web.cluster.com 就可以访问到内部的web服务器了

====================================

多台squid反向代理

参考

http://www.ibm.com/developerworks/cn/linux/l-cn-squid/

参考它实现

client

|

|

|-----------|

squid 1 squid 2

| |

|-----------|

|

|

|-----------|

lamp1 lamp 2

|-----------|

|

|

mysql + nfs

两台squid1使用icp协议共同工作

两台lamp可以安装一个phpwind或discuz论坛

lamp里mysql独立出来,lamp的网站家目录也独立出来,使用nfs共享(--注意其权限)

把mysql和nfs做在同一台

--在这里我实现下面的架构

client

li.cluster.com | squid2.cluster.com

外网 192.168.20.35 | 192.168.20.130

|-----------|

squid 1 squid 2

| |

|-----------|

内网 192.168.212.1 | 192.168.212.149

|

|-----------|

web1 web 2

|-----------|

web内网 192.168.212.128 192.168.212.129

第一步:

主机名绑定

时间同步

防火墙关闭

yum配置

第二步:

squid1 上的配置

yum install squid* -y

# vim /etc/squid/squid.conf --下面只列出需要修改的参数

http_port 80 accel vhost vport

cache_mem 100 MB

icp_port 3130

cache_peer 192.168.212.149 sibling 80 3130

cache_peer 192.168.212.128 parent 80 0 no-query originserver round-robin name=web1

cache_peer 192.168.212.129 parent 80 0 no-query originserver round-robin name=web2

cache_peer_domain web1 web2 web.cluster.com

visible_hostname li.cluster.com

http_access allow all

保存配置文件后

squid -zX --初始化缓存目录

/etc/init.d/squid start --启动

第三步

squid2上的配置

yum install squid -y

# vim /etc/squid/squid.conf

修改配置文件,和squid1的配置几乎一样,把squid1的配置文件拷过来,再修改两个参数

cache_peer 192.168.212.1 sibling 80 3130 --IP改为squid1的内网IP

visible_hostname squid2.cluster.com

保存配置文件后

squid -zX --初始化缓存目录

/etc/init.d/squid start --启动

第四步:

配置两个内网web服务器

yum install httpd* -y

--因为我这里没有做共享存储,所以这里估计分别做两个不同的主页,来测试

在web1 128上

echo 128 > /var/www/html/index.html

在web1 129上

echo 129 > /var/www/html/index.html

/etc/init.d/httpd start --再把两个web启起来

第五步:

我现在使用192.168.20.108做外网的一个客户端来验证

--因为我的架构是做了DNS的轮叫,也就是网站域名为web.cluster.com,但轮叫两个IP192.168.20.35和192.168.20.130

vim /etc/hosts --为了方便,我这里没有做DNS,使用hosts文件来模拟DNS轮叫

192.168.20.35 web.cluster.com

192.168.20.130 web.cluster.com

[root@108 ~]# elinks web.cluster.com --得到的结果怎么样都是128的主页

[root@108 ~]# curl -I http://web.cluster.com

HTTP/1.0 200 OK

Date: Tue, 10 Apr 2012 09:01:42 GMT

Server: Apache/2.2.3 (Red Hat)

Last-Modified: Tue, 10 Apr 2012 09:01:35 GMT

ETag: "1546ce-c-5ea859c0"

Accept-Ranges: bytes

Content-Length: 12

Content-Type: text/html; charset=UTF-8

Age: 1

X-Cache: HIT from li.cluster.com

X-Cache-Lookup: HIT from li.cluster.com:80 --HIT表示命中缓存

Via: 1.0 li.cluster.com:80 (squid/2.6.STABLE21)

Connection: close

--结果多次删除两台squid的/var/spool/squid/*缓存信息,多台客户端的测试,有时是128的主页,有时是129的主页,说明是正常的轮叫成功

--或者清空两个缓存,重启,只启动一个httpd,那客户端就只能访问这个启动的httpd

--但实际应用时,128和129应该是经过同步或共享存储的同一网站,内容是一致的

--上面的架构,坏掉任意一台内网web或squid,不影响网站的运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: