代理服务器 iptables    router   三种上网的比较

proxy     可以把访问过的web页,图片等缓存缓存到本地,一般不用设置网关
iptables    router   都要设置网关,DNS等参数


代理服务器的作用

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

 


三种代理类型

正向代理 客户端需要设置代理服务器的IP和代理端口 
  --代理内部主机上网(共享上网,并可以进行用户限制等功能)

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


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


--关于它们的应用:
正向和透明用于控制上网行为,共享上网等网络管理功能

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

 

实验环境

  
 内网用户VM1          squid 服务器 (eth0实际情况下就是外网IP)
 eth0   vmnet1  eth1  
172.16.57.131 -->    172.16.57.1      172.19.1.17
 

第一步:安装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


第三步:
初始化缓存目录

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)

 

第四步:
客户端的测试   --

 

主要是修改浏览器

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

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


测试:
 访问已经访问过的页面是否能感觉到页面加快
 再次查看 du -s /var/spool/squid 发现增大,因为缓存了对象
 查看相关日志 /var/log/squid/squid/*.log

 


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

 


透明代理:


第一步:
打开路由转发功能


# 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 eth1 -j SNAT --to-source 172.19.1.17

 

# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eth1 -j SNAT --to-source 172.19.1.17
# iptables -t nat -A POSTROUTING -p tcp --dport 53 -o eth1 -j SNAT --to-source 172.19.1.17

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

 


第四步:
客户端的设置:
首先,选择不使用代理


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


测试:   OK

 

 

client          squid     尚观路由器
      vmnet1      eth1    
172.16.57.131  172.16.57.1  172.19.1.17   172.19.1.1
     |    | 
     |    |
     |    |
clinet网关指向172.16.57.1--     |
clinetDNS指向172.19.1.1----------------------------------|

 


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

 

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
http_access deny baddsturl


acl  baddsturl  dstdom_regex -i  baidu.com --这是把baidu.com以下的所有域名都禁止 
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
 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 badfiletype
http_access deny badwebsite
http_access deny 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 
172.16.57.131-->172.16.57.1    172.19.1.17 <-- 172.19.1.103
网关指向172.16.57.1     网关指向172.19.1.17


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


--注意:
VM1为内部web服务器,绑定主机名为web.cluster.com
squid服务器主机名为li.cluster.com

172.16.57.1为squid的一个内网IP
172.19.1.17为squid的外网IP

172.19.1.103 为外网客户端


过程:
客户端 通过http://web.cluster.com   --> 172.19.1.17:80 -->squid 监听80--> 内部web服务器 172.16.57.131:80

 


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

vim /etc/squid/squid.conf

http_port 80 accel vhost vport
   --accel 反向代理加速模式
   --vhost 支持域名
   --vport 支持端口

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

  --172.16.57.131  内网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这台服务器(也就是上面定义的172.16.57.131);如果有多台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   --重新初始化

 

--测试:

172.19.1.103这台客户端,使用http://172.19.1.17访问不了


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


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


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

172.19.1.17  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做在同一台
 

 

 


===========================================================
附:
编译版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 --disable-carp --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

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 & --启动,并打开调试信息