反向代理

传统代理,透明代理,plug-gw,Apache反向代理,IP伪装,端口转发

<script type="text/javascript"><!----></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><iframe name="google_ads_frame" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-1253167922227550&amp;dt=1187743519984&amp;lmt=1187743518&amp;alternate_ad_url=http%3A%2F%2Fwww.365tech.net%2Fgoogle_adsense_script.htm&amp;format=336x280_as&amp;output=html&amp;correlator=1187743519968&amp;channel=5362294942&amp;url=http%3A%2F%2Fwww.365tech.net%2Fnix_Solutions%2F10807&amp;color_bg=FFFFFF&amp;color_text=666666&amp;color_link=8A3207&amp;color_url=666666&amp;color_border=FFFFFF&amp;ad_type=text&amp;ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D%25E5%258F%258D%25E5%2590%2591%25E4%25BB%25A3%25E7%2590%2586%2520%25E9%2580%258F%25E6%2598%258E%25E4%25BB%25A3%25E7%2590%2586%2520%26hl%3Dzh-CN%26newwindow%3D1%26client%3Dfirefox%26rls%3Dorg.mozilla%253Azh-CN%253Aofficial%26lr%3Dlang_zh-CN%257Clang_zh-TW%26nxpt%3D10.1191240369142707643512&amp;cc=100&amp;ga_vid=1181734298.1187743520&amp;ga_sid=1187743520&amp;ga_hid=582080230&amp;flash=7&amp;u_h=768&amp;u_w=1024&amp;u_ah=740&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_java=true&amp;u_nplug=18&amp;u_nmime=56" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" frameborder="0" height="280" scrolling="no" width="336"></iframe>
第一部分 各种代理方式的特点和包重写过程


Squid传统代理和透明代理:

在Linux上用得最广泛的传统代理和透明代理是Squid.默认的Squid配置成传统代理的方式。
在这种方式下,windows客户端要在浏览器中设置代理服务器的地址和端口号,客户端所要做的
工作其实很少。只需要指定代理服务器的IP地址和端口号即可,其它剩下的一切都交给代理服务
器去做。在这种方式下的一个明显特点是windows客户机浏览网页,打入一个URL时,DNS也由代理
服务器去做。解析DNS的过程是根据Linux服务器中设置的/etc/host.conf文件中的解析顺序进行的。
一般的顺序是先查找/etc/hosts,然后找DNS数据库bind。在这种情况下的有趣例子是如果你设置了
某一站点的域名为你内部网中的一台服务器,则先去访问内部网服务器了。如你设置
192.168.11.3 www.yahoo.com 则你的浏览器就不可能去访问互联网上的yahoo站点了。
但假若你设置了透明代理的话,则解析的DNS顺序便变为
\windows\hosts然后再Linux的DNS数据库。不再可能检查Linux服务器上的/etc/hosts文件了。
关于透明代理的介绍,见文章荟萃中的另一篇文章《如何在Linux中设置透明代理》

传统代理和透明代理的包重写过程:见下图


[PC] A [Linux squid server] B
__192.168.11.12_|_____192.168.11.5__|___1.2.3.4_________Internet

(图一)

在A机用户的浏览器上设置代理为192.168.11.5,端口号为3128,通过B上网。
假如访问www.linuxforum.net,实际上只要你设定了代理的话,用户端的浏览器只是和Linux Squid
服务器进行通信而决不和互联网上的www.linuxforum.net服务器交谈,首先由squid代理服务器对
www.linuxforum.net进行解析(查找/etc/host.conf中的解析顺序,先是/etc/hosts然后是DNS查找)
进行到IP地址为202.106.124.185,最后由代理服务器代替用户端对该IP地址进行HTTP访问,回复回来
的信息先缓存到squid cache中,同时拷贝一份到用户端。下次若该用户或其它用户访问同样的页面时
则可以从squid cache中调用节省时间。
透明代理的过程和传统代理差不多,区别在
1。DNS解析过程不同,前面已经说过
2。用透明代理网关必须设置为squid代理服务器的IP地址,而传统代理不需要。
3。透明代理需要设置防火链的input规则
其余的和squid传统代理方式相同。

plug-gw:
plug-gw是FWTK中所带的通用代理程序。可用来代理象POP3,HTTP等应用层服务。

[PC] A [Linux POP3] C [Linux plug-gw]B
__192.168.11.12_|______|192.168.11.1____192.168.11.5__|___1.2.3.4__Internet

(图二)

假如内部网段上有一台Linux POP3服务器C(192.168.11.1),希望外部用户能收取邮件
可在机器B上设定plug-gw的POP3代理如下:

放下面的行到/etc/rc.d/rc.local
/usr/local/etc/plug-gw -daemon 1.2.3.4:110 -name plug-gw-pop3 &
文件/usr/local/etc/netperm-table中有下面一行
plug-gw-pop3: port 110 * -plug-to 192.168.11.1 -port 110

则用户设定outlook express中的POP3服务器地址为1.2.3.4.当收邮件时对B机的外部
接口而言,是在1.2.3.4的110端口接受用户请求,随后被plug-gw处理,在内部网段上,
由192.168.11.5对192.168.11.1的110端口发出请求。把所得的数据由1.2.3.4接口拷贝给
外部用户。

Apache反向代理。
包重写过程与plug-gw类似

注意:上面所讲的三种情况下,请求过程被分开两次,中间一般是squid代理服务器或者
plug-gw,Apache服务器,数据在服务器的两块网卡中间做拷贝的动作,但是两次请求过程
的源地址是随机分配的高端地址,是不同的。在1024 和65535之间。但是一般而言,TCP/IP
分配的随机高端地址大多数是在1024--5000之间分配。例如:对于plug-gw来说:
如果某外部拨号用户的IP地址为5.6.7.8。假如地址和端口如下:
源地址和端口号和目标地址端口与为:
5.6.7.8 1038 1.2.3.4 110
被plug-gw改写请求为:
192.168.11.5 1045 192.168.11.1 110

被192.168.11.1回复的数据被拷贝给外部客户。

但是并非所有情况下源高端随机分配的地址都在1024--5000之间。IP伪装就是例外:

IP伪装:

[PC] A [Linux MASQ server] B
__192.168.11.12_|_____192.168.11.5__|___1.2.3.4_________Internet

(图三)

如上图,PC A要通过B伪装上网。如要访问www.linuxforum.net,则伪装时的包重写过程如下:

源地址/端口号和目标地址/端口号为:
192.168.11.12 1047 202.106.124.185 80
被伪装后的
源地址和端口号和目标地址/端口号为:
1.2.3.4 62334 202.106.124.185 80

反回的包为
202.106.124.185 80 -- 1.2.3.4 62334
再被重写给PC A为:
202.106.124.185 80 -- 192.168.11.12 1047

一般来说,IP伪装后的源地址通常>60000,且在61000--64999之间。
在防火墙上维护着一张IP伪装的对照表。用命令/sbin/ipchains -M -L -n可以看到
如:
[root@proxy etc]# /sbin/ipchains -M -L -n
IP masquerading entries
prot expire source destination ports
UDP 02:18.86 192.168.11.12 205.188.179.41 1215 (62615) -> 4000
TCP 17:03.20 192.168.11.12 205.188.248.57 1049 (62584) -> 80

从ports栏你可以对照两次源地址的匹配。

端口转发(port forwarding):
见文章荟萃中另一篇文章《利用端口转发由内部网对外提供网络服务》


第二部分 各种代理方式的适用情况和优缺点

各种代理方式的作用:
1. IP伪装,Squid传统代理和透明代理适合让局域网上无真实IP地址的用户访问Internet.
2. Apache反向代理,plug-gw通用代理,端口转发适合让外部用户访问局域网内无真实IP
地址的服务器。

各种代理方式的优缺点:
1. Squid的优点是对客户端要求很少,只要能连通squid服务器即可。
但是需要每台机器都设置代理服务器IP地址和端口号
2. Squid透明代理的优点是不需要每个客户机都设置代理地址和端口与,简化了用户端
配置。但是需要每台客户机的默认网关都设为squid代理服务器,且需要客户端来做
DNS解析
3. IP伪装可适合大多数应用层服务,不象squid仅支持http和ftp.但也需要客户的默认
网关设为防火墙的地址。且不象squid有cache功能
4. plug-gw可代理各种服务器象HTTP,POP3等。但Apache反向代理则只能代理http反向请求
5. 端口转发适合大多数服务。与具体的应用无关。且速度快,在内核IP层实现,无需要特别的

应用层服务在运行。但可能需要重新编译内核。


代理服务器是使用非常普遍的一种将局域网主机联入互联网的一种方式,使用代理上网可以节约紧缺的IP地址资源,而且可以阻断外部主机对内部主机的访问,使内部网主机免受外部网主机的攻击。但是,如果想让互联网上的主机访问内部网的主机资源(例如:Web站点),又想使内部网主机免受外部网主机攻击,一般的代理服务是不能实现的,需要使用反向代理来实现。<o:p></o:p>

??? 本文将详细介绍反向代理服务的概念以及如何利用反向代理服务器提高WEB服务器的性能和安全性。<o:p></o:p>

<o:p>?</o:p>

一.?????? 反向代理的概念 <o:p></o:p>

<o:p>?</o:p>

什么是反向代理呢?其实,反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载。典型的结构如下图所示:<o:p></o:p>

<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path=" m@4@5 l@4@11@9@11@9@5 xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0 "></v:f><v:f eqn="sum @0 1 0 "></v:f><v:f eqn="sum 0 0 @1 "></v:f><v:f eqn="prod @2 1 2 "></v:f><v:f eqn="prod @3 21600 pixelWidth "></v:f><v:f eqn="prod @3 21600 pixelHeight "></v:f><v:f eqn="sum @0 0 1 "></v:f><v:f eqn="prod @6 1 2 "></v:f><v:f eqn="prod @7 21600 pixelWidth "></v:f><v:f eqn="sum @8 21600 0 "></v:f><v:f eqn="prod @7 21600 pixelHeight "></v:f><v:f eqn="sum @10 21600 0 "></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><o:p></o:p>

?

Web服务器加速(反向代理)是针对Web服务器提供加速功能的。它作为代理Cache,但并不针对浏览器用户,而针对一台或多台特定Web服务器(这也是反向代理名称的由来)。实施反向代理(如上图所示),只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个WEB服务器时,通过DNS服务器解析后的IP地址是Reverse Proxy ServerIP地址,而非原始Web服务器的IP地址,这时Reverse Proxy Server设备充当Web服务器,浏览器可以与它连接,无需再直接与Web服务器相连。因此,大量Web服务工作量被卸载到反向代理服务上。不但能够防止外部网主机直接和web服务器直接通信带来的安全隐患,而且能够很大程度上减轻web服务器的负担,提高访问速度。<o:p></o:p>

<o:p>?</o:p>

二.?????? 反向代理和其它代理的比较<o:p></o:p>

<o:p>?</o:p>

??? 下面将对几种典型的代理服务作一个简单的比较。在网络上常见的代理服务器有三种:<o:p></o:p>

1.? 标准的代理缓冲服务器<o:p></o:p>

??? 一个标准的代理缓冲服务被用于缓存静态的网页(例如:html文件和图片文件等)到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号。客户端上网时,每次都把请求送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发给客户端浏览器。<o:p></o:p>

2.? 透明代理缓冲服务器<o:p></o:p>

??? 透明代理缓冲服务和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于Linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因为不需要对浏览器作任何设置,所以,透明代理对于ISPInternet服务器提供商)特别有用。<o:p></o:p>

3.? 反向代理缓冲服务器<o:p></o:p>

??? 反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于本地WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。<o:p></o:p>

<o:p>?</o:p>

三.反向代理工作原理<o:p></o:p>

??? 反向代理服务器位于本地WEB服务器和Internet之间,如下图所示:

<o:p></o:p>

当用户浏览器发出一个HTTP请求时,通过域名解析将请求定向到反向代理服务器(如果要实现多个WEB服务器的反向代理,需要将多个WEB服务器的域名都指向反向代理服务器)。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据(比如html网页和图片等),而一些CGI脚本程序或者ASP之类的程序不缓存。它根据从WEB服务器返回的HTTP头标记来缓冲静态页面。有四个最重要HTTP头标记:<o:p></o:p>

  • Last-Modified: 告诉反向代理页面什么时间被修改<o:p></o:p>
  • Expires: 告诉反向代理页面什么时间应该从缓冲区中删除<o:p></o:p>
  • Cache-Control: 告诉反向代理页面是否应该被缓冲<o:p></o:p>
  • Pragma: 告诉反向代理页面是否应该被缓冲.<o:p></o:p>

例如:在默认情况下,ASP页面返回” Cache-control: private.” ,所以ASP页面时不会在反向代理服务器缓存的<o:p></o:p>

四.代理服务器软件squid简介<o:p></o:p>

Squid Internet Object Cache (Harvest Project的后续版本) 是美国政府大力助的一项研究计划,其目的为解决网络带宽不足的问题,是现在Unix系统上使用者最多功能也最完整的一套软体。ApacheNetscape虽附有相关的Proxy模块,但因其功能简单而不够普及。有关squid的详细说明可到squid网站(http://www.squid-cache.org)查询。<o:p></o:p>

Squid最典型的应用是代理局域网的机器联入互联网,它支持现在流行的网络协议。Squid的另一项非常出色的功能就是实现反向代理功能。<o:p></o:p>

<o:p>?</o:p>

五.使用Squid配置反向代理(HTTP 加速器)<o:p></o:p>

??? 通过squid配置反向代理主要就是配置“squid.conf”这个配置文件。下面以Linux操作系统为例进行介绍,其它版本的在UNIX也同样适用。在Linuxsquid如果是以源代码方式安装的话,这个文件一般在“/usr/local/squid/etc/”目录下。如果是系统自带的squid,一般配置文件在“/etc/squid/”目录下。<o:p></o:p>

1.? Squid反向代理单个后台WEB服务器<o:p></o:p>

如果WEB服务器和反向代理服务器是两台单独的机器(一般的反向代理应该有两块网卡分别连接了内外部网络)。那么,应该修改下面的内容来设置反向代理服务。<o:p></o:p>

http_port 80 # squid监听的端口
httpd_accel_host 172.16.250.250 #
内部WEB服务器的IP地址
httpd_accel_port 80 # WEB
服务器的IP地址
httpd_accel_single_host on #
转发为缓冲的请求到一台单独的机器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off
<o:p></o:p>

??? 如果WEB服务器和反向代理服务器是同一台机器。那么,应该设置WEB服务器的监听端口为非80端口(比如:81端口)。要修改的内容如下: <o:p></o:p>

http_port 80 # squid监听的端口
httpd_accel_host localhost #
内部WEB服务器的IP地址
httpd_accel_port 81 # WEB
服务器的IP地址
httpd_accel_single_host on #
转发为缓冲的请求到一台单独的机器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off
<o:p></o:p>

下面解释一下配置指令。 <o:p></o:p>

http_port 80 <o:p></o:p>

选项 http_port 指定squid监听HTTP请求的端口,一般都设置成80端口,这样使用户感觉不到反向代理的存在,就像访问真正的WEB服务器一样。<o:p></o:p>

httpd_accel_host 172.16.250.250 httpd_accel_port 80 <o:p></o:p>

选项httpd_accel_host httpd_accel_port 指定WEB服务器的IP地址和端口号,可以根据自己的WEB服务器的实际情况而定。 <o:p></o:p>

httpd_accel_single_host on <o:p></o:p>

选项httpd_accel_single_host on 时,squid被设置成仅对单一的web服务器作反向代理。不考虑HTTP头信息,Squid转发所有的未被缓冲的页面请求到这个web服务器。如果squid需要做多个web服务器反向代理,必须将此选项设置为off,并且使用转向器或者DNS去映射请求到合适的后台WEB服务器。<o:p></o:p>

httpd_accel_with_proxy on <o:p></o:p>

如果希望squid既作反向代理服务器又作本地机器的上网代理,需要将httpd_accel_with_proxy 改为 on,默认情况下是off<o:p></o:p>

httpd_accel_uses_host_header off <o:p></o:p>

HTTP协议1.1中,HTTP请求包括一个主机头信息,指定URL的主机名或者主机的IP地址。这个选项可以用来完成多个后台WEB服务器的反向代理功能。 <o:p></o:p>

2Squid反向代理多个后台WEB服务器<o:p></o:p>

我们可以用Squid反向代理多个后台WEB服务器。例如:我们可以配置squid同时反向代理www.abc.com, www.xyz.com, www.lmn.com三个后台WEB服务器,示意图如下:<o:p></o:p>

??? <o:p></o:p>

Squid的配置如下:<o:p></o:p>

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_uses_host_header on
<o:p></o:p>

(注意:编译Squid时需激活Internal DNS选项)<o:p></o:p>

然后设置设置反响代理需要的域名解析(Internet用户通过这里解析三个网站的域名)如下:<o:p></o:p>

www.abc.com 202.102.240.74
www.xyz.com 202.102.240.74
www.lmn.com 202.102.240.74
<o:p></o:p>

使三个域名都指向反向代理服务器的IP地址202.102.240.74<o:p></o:p>

下面设置反向代理所需要的DNS入口信息(即设置内部DNS,仅仅是squid在内部使用,Internet用户不可见)。有两种方法可以设置内部DNS,使用内部DNS服务器来解析或者使用/etc/hosts文件来实现。<o:p></o:p>

使用内部DNS服务器的资源记录如下:
www.abc.com IN A 172.16.1.2
www.xyz.com IN A 172.16.1.3
www.lmn.com IN A 172.16.1.4
<o:p></o:p>

如果使用/etc/hosts文件来实现内部DNS(编译时应使用disable internal dns选项),编辑/etc/hosts文件添加如下条目:
172.16.1.2 www.abc.com
172.16.1.3 www.xyz.com
172.16.1.4 www.lmn.com
<o:p></o:p>

<o:p>?</o:p>

结论<o:p></o:p>

??? 通过本文中的论述和相关实例,可以看出,反向代理方式不单是一种WEB服务器加速器,而且使也一种对外提供Web发布时使用的有效的防火墙技术,使用它不但能节约紧缺的IP地址资源,加速WEB服务器的访问速度,而且能够保护WEB主机,因此能够适应多种应用场合。


你可能感兴趣的:(Web,linux,应用服务器,浏览器,互联网)