利用反向代理保護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服務設置成不啟用。#p#
三、調整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服務器之間的聯系。
四、安裝透明代理軟件
透明代理服務器安裝分如下幾步:下載、解壓、編譯、安裝、配置幾步。首先需要到 http://www.transproxy.nlc.net.au/transproxy-1.3.tgz下載transproxy軟件包,也放在 /usr/local/src目錄里,然后用gzip解壓該軟件包。具體命令是:
gzip -dc transproxy-1.3.tgz |tar -xvf -
解壓后在/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
設置完畢后重新啟動反向代理服務器,所有新設置的功能即可實現。
五、設置轉發規則
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下面的防火墻方案結合使用會更加完美。
【編輯推薦】