Total Pageviews

Saturday, 14 April 2012

利用反向代理保护WEB服务器

一、安装反向代理服务器

1.下载反向代理服务器软件采用squid,下载地址:

http://www.squid-cache.org/Versions/v2/2.2/squid-2.2.STABLE5-src.tar.gz

下载后存放在/usr/local/squid/src目录里,文件名是

squid-2.2.STABLE5-src.tar.gz ;

2.解压代理服务器软件包:

进入/usr/local/squid/src目录,键入如下命令:

gzip -dc squid-2.2.STABLE5-src.tar.gz | tar -xvf -

这个命令将代理服务器软件包解开,建立一个目录叫作squid-2.2.STABLE5,并且把所有的文件放在这个目录里面。

3. 编译源程序

首先运行配置脚本,以便生成适合您的机器的编译脚本。命令格式是:

./configure

这种方式产生的编译脚本编译后默认安装路径是/usr/local/squid。

如果想改变安装路径,需要用以下格式:

./configure -prefix=/some/other/directory

这种方法编译后安装到/some/other/directory里面。

生成编译脚本后,可以正式开始编译了。命令为:

make

4、 安装Squid代理服务器

编译通过后,用以下命令安装:

make install

安装完成后,会在您指定的安装路径里产生一个squid目录,squid目录下有三个目录:etc、bin、logs。其中etc里面是配置文件,bin里面是执行文件,logs里面是日志文件。

二、调试反向代理服务器

安装结束后就是调试服务器,使其按照您的要求工作。Squid的配置文件只有一个,在etc目录里,名字是squid.conf,所有的配置选项都在这个文件里面。而且每个配置项目都有注释说明。我们只介绍与反向代理有关的几个项目。

首先,在squid文件里面找到下列配置项:

cache_mem

这里可以添上您准备给squid作为高速缓存使用的内存大小。注意,如果您的机器有N兆内存,那么,推荐您在这里添的数字是N/3。

cache_dir /usr/local/squid/cache 100 16 256

这里的第一个数字100是您准备给squid作为cache使用的硬盘空间大小,单位是兆。如果您想划100M空间当作cache,那么这里就写100。

acl, http_access, icp_access

填写”allowedip”和”allowedip1″ACL访问控制列表。这里应该填写你对外公开的服务器的IP,比如此例的两个WEB服务器对应的外部地址为202.99.157.10 和 202.99.157.18,

acl manager proto cache_object

acl localhost src 127.0.0.1/255.255.255.255

acl all src 0.0.0.0/0.0.0.0

acl allowedip src 202.99.157.10/255.255.255.255

acl allowedip1 src 202.99.157.18/255.255.255.255

http_access deny manager all

http_access allow allowedip

http_access allow allowedip1

http_access deny all

icp_access allow allowedip

icp_access allow allowedip1

icp_access deny all

cache_mgr webmaster@test.com.cn

这里填写cache管理员的Email地址,系统出错会自动提醒cache管理员。

******以上部分均为squid的通用设置以下为关于反向代理部分的设置******

httpd_accel_host test.com.cn

httpd_accel_host test1.com.cn

此处设置反向代理的主机名

httpd_accel_port 80

此处设置反向代理的WEB服务端口号

#httpd_accel_with_proxy off

此处设置开反向代理的同时,是否开普通代理服务

修改完配置文件,在正式运行squid代理服务器之前,先进行初始化。命令如下:

% /usr/local/squid/bin/squid -z

% /usr/local/squid/bin/squid

检查cache.log文件确保所有部分运行正常。如果有出错信息或系统不能正常启动,一般情况是由于目录和文件的存取权限导致的,请仔细检查各目录和 文件的权限设置。 其中特别需要注意的是初始化之前应该将squid目录设置成可写,然后将创建的cache目录和logs目录设置成可写。如果一切正常,那么就可以投入使 用了。系统默认的服务端口是3128。

反向代理服务器软件安装完毕后,将该服务器在80端口的http服务设置成不启用。


三、调整DNS服务器设置

假设DNS服务器(以下称标准DNS服务器)将test.com.cn解析为202.99.157.10,将test1.com.cn解析为 202.99.157.18,那么我们在配置反向代理服务器这台机器的DNS服务时(我们以下称为内部DNS服务器),可以针对内部地址的WEB做如下变 换:

主机名 标准DNS解析为 内部

DNS解析为

www.test.com.cn 202.99.157.10 192.168.1.10

www.test1.com.cn 202.99.157.18 192.168.1.18

然后把202.99.157.10和202.99.157.18这两个IP绑定到反向代理服务器上,这样,外界对www.test.com.cn和 www.test1.com.cn 的访问就会由标准DNS解析到反向代理服务器上,默认WEB服务器的服务端口是80,但是由于反向代理服务器的80端口的http服务已经终止,此时的访 问会没有结果。为了能使该访问请求能够成功完成,需要在反向代理服务器和真实的www.test.com.cn 和www.test1.com.cn 的WEB服务器之间建立联系。要和有内部地址的真实WEB服务器建立联系,首先反向代理服务器上需要再绑定一个内部IP,比如192.168.1.2,其 余部分由transproxy这个透明代理软件来完成。Transproxy服务软件通过设置,启用端口81和squid建立联系,把内部DNS对 www.test.com.cn和www.test1.com.cn的解析地址传给squid服务器,然后通过squid.conf里面关于服务器端口的 设置,将服务端口设置为80,这样,squid就访问内部真实WEB服务器192.168.1.10和192.168.1.18的80端口,把需要访问的 WEB内容取回来,放在squid的cache里供外界访问。透明代理软件transproxy设置完成后,需要通过设置ipchains规则,将外界发 往反向代理服务器的80端口的http请求转发到transproxy 的81端口,这样就建立了外界通过反向代理间接和真实WEB服务器之间的联系。

四、安装透明代理软件transproxy

透明代理服务器安装分如下几步:下载、解压、编译、安装、配置几步。首先需要到http://sourceforge.net/projects/transproxy/下载transproxy软件包: 
http://downloads.sourceforge.net/project/transproxy/transproxy/1.6/transproxy-1.6.tgz,也放在/usr/local/src目录里,然后用tar zxvf 解压该软件包。

解压后在/usr/local/src目录下面生成tproxy目录,里面是transproxy的源程序。

进入该目录,用make命令编译该软件,用make install命令安装transproxy。Transproxy的编译和安装都很简单,下面就需要配置transproxy。根据系统负荷的轻重不 同,transproxy可以配置为两种运行方式:负荷轻时,用inetd方式,负荷重时,用standalone server方式。具体配置方法如下:

1. inetd方式:

在/etc/services文件中添加下面一行:

tproxy 81/tcp #transproxy

在/etc/inetd.conf文件中添加下面一行:

tproxy stream tcp nowait nobody /usr/sbin/tcpd tproxy 202.99.157.10 3128


tproxy stream tcp nowait nobody /usr/sbin/tcpd tproxy 202.99.157.18 3128

2. standalone server方式:

在/etc/rc.d/rc.local文件中加入下面一行:

/usr/local/sbin/tproxy -s 81 -r nobody 202.99.157.10 3128


/usr/local/sbin/tproxy -s 81 -r nobody 202.99.157.18
3128

设置完毕后重新启动反向代理服务器,所有新设置的功能即可实现。

(transproxy - transparently proxy HTTP requests. This program is used with ipfw's fwd rules or Darren Reed's IPFILTER package, and is used to intercept HTTP requests and divert them to a HTTP proxy server (eg: squid), without requiring user intervention or configuration. It accepts connections on the redirected port, connects to the real proxy server, and transports data between the two sockets. The original HTTP request is modified to allow the HTTP proxy server to fetch the correct document. In most cases this doesn't cause any DNS activity. Unlike some other transparent proxy solutions, this does not require the HTTP proxy server to run on the machine itself. See /usr/local/sbin/tproxyrun for an example of how to add filter rules and start tproxy. Also see /usr/local/sbin/tproxywatch for an example of how to ensure that tproxy keeps running regardless of faults. WWW: http://transproxy.sourceforge.net/

from http://www.freshports.org/www/transproxy/)

(TransProxy: Android Proxy App

Alright people. There's this app called Transproxy which seems to be a viable solution to the proxy problem. Now, I am not sure if it will work with all your android phones out there. But from what I've tested, it works just fine. I do my testing on an HTC Desire btw. Like always, I tested it in a network where internet access is through a proxy server, but without authentication. So if someone could check this out on an authentication based proxy network, it would be real helpful!

There's not much to making this work. You just install it and when you run the app, you'll see the above screen. Just enter the details and let it run. It's as simple as that. Even n00bs will find this one easy to work with.:D
Please comment and let me know if this app works for you. If not, well I'll give you some other suggestions.

from http://android-proxy.blogspot.co.uk/2011/03/android-proxy-app-transproxy.html)

五、设置转发规则

ipchains -A input -p tcp -d 202.99.157.10/255.255.255.255 80 -j REDIRECT 81

ipchains -A input -p tcp -d 202.99.157.18/255.255.255.255 80 -j REDIRECT 81

这里将送往202.99.157.10和202.99.157.18的80端口的所有http请求转发给由transproxy管理的端口81。

到此为止,透明反向代理配置完成了。

让我们模拟一下一位因特网用户访问www.test.com.cn这台拥有内部IP(192.168.1.10)的WEB服务器的过程。首先,该用户的 请求由标准DNS服务器解析为202.99.157.10,则用户的机器向202.99.157.10的80端口发出请求,要求浏览 www.test.com.cn这台WEB服务器的页面,而202.99.157.10这台机器正是我们的反向代理服务器,按照反向代理服务器的 ipchains规则发往该服务器80端口的请求被转发到81端口,而81端口由transproxy 控制,transproxy把请求发给squid,让squid去取www.test.com.cn这个页面。而反向代理服务器上的内部DNS服务器把 www.test.com.cn解析为192.168.1.10,默认的反向代理端口是80,这样,squid就到192.168.1.10的端口80上 请求WEB服务。而192.168.1.10正是我们的www.test.com.cn的真实WEB服务器,它的80端口开放着http服务。这 样,squid从192.168.1.10服务器上取回页面传回给202.99.157.10 然后再传回给因特网上的对www.test.com.cn有访问请求的用户,并把该页面放在squid的cache中。这样就完成了一次因特网用户到拥有 内部IP的WEB服务器的访问过程。以后再有因特网用户再访问www.test.com.cn这个页面时,squid就直接从cache里提取缓存的页 面,这样可以提高WEB服务器的访问效率。

因特网用户对www.test1.com.cn的访问也和对www.test.com.cn的访问一样,原理是相同的,只不过访问的真实服务器不同而已。

从上面的访问例子我们可以看出,因特网上的用户在访问www.test.com.cn这个WEB 服务器时,根本不和真正提供www.test.com.cn页面的服务器打交道,只和反向代理服务器打交道,这样,在破坏互联网主机的黑客行为日益猖獗的 情况下,只要正确设置反向代理服务器,确保反向代理服务器不被攻破,就会很大程度上杜绝因特网上的黑客对内部服务器的攻击。万一代理服务器被攻破,也不会 对您的WEB服务器造成什么损害,您只要恢复反向代理服务器就行了。因此,本方法对您的WEB服务器起到一定程度的保护作用。而且在WEB浏览量较多的情 况下,由于squid的反向代理有加速功能,可以加快页面的浏览速度。

六、其他

反向代理应用过程中,要注意访问 控制功能,应该只允许访问你开放的内部服务器,而不允许访问其他服务器,否则,你的反向代理服务器就会成为互联网上一台公开的不用验证的代理服务器,那就 危险啦。另外,如果您有多台WEB服务器,可以选一台性能较好的作为反向代理服务器,内部的若干WEB服务器可以用PC或低档服务器代替,因为外部的访问 压力主要集中在反向代理服务器上。

另外此方案如果和linux下面的防火墙方案结合使用会更加完美。

No comments:

Post a Comment