一.反向代理詳解
- squid作爲代理服務軟件,其主要功能是使用代理上網可以節約緊缺的IP地址資源,而且可以阻斷外部主機對內部主機的訪問,有一定的安全性,但是如果想讓互聯上的主機訪問內部網的主機資源(例如:web站點),又想使內部主機免受外部網主機攻擊,一般的代理服務是不能實現的這就需要反向代理來實現
- 什麼是反向代理呢?其實,反向代理也就是通常所說的web服務器加速,它是一種通過在繁忙的WEB服務器和internet之間增加一個高速的web緩衝服務器(即:web反向代理服務器)來降低實際的web服務器的負載
- Web服務器加速(反向代理)是針對Web服務器提供加速功能的。它作爲代理Cache,但並不針對瀏覽器用戶,而針對一臺或多臺特定Web服務器(這也是反向代理名稱的由來)。實施反向代理(如上圖所示),只要將Reverse Proxy Cache設備放置在一臺或多臺Web服務器前端即可。當互聯網用戶訪問某個WEB服務器時,通過DNS服務器解析後的IP地址是Reverse Proxy Server的IP地址,而非原始Web服務器的IP地址,這時Reverse Proxy Server設備充當Web服務器,瀏覽器可以與它連接,無需再直接與Web服務器相連。因此,大量Web服務工作量被卸載到反向代理服務上。不但能夠防止外部網主機直接和web服務器直接通信帶來的安全隱患,而且能夠很大程度上減輕web服務器的負擔,提高訪問速度。
- 下面將對幾種典型的代理服務作一個簡單的比較。在網絡上常見的代理服務器有三種:
1. 標準的代理緩衝服務器(傳統代理)
一個標準的代理緩衝服務被用於緩存靜態的網頁(例如:html文件和圖片文件等)到本地網絡上的一臺主機上(即代理服務器)。當被緩存的頁面被第二次訪問的時候,瀏覽器將直接從本地代理服務器那裏獲取請求數據而不再向原web站點請求數據。這樣就節省了寶貴的網絡帶寬,而且提高了訪問速度。但是,要想實現這種方式,必須在每一個內部主機的瀏覽器上明確指明代理服務器的IP地址和端口號。客戶端上網時,每次都把請求送給代理服務器處理,代理服務器根據請求確定是否連接到遠程web服務器獲取數據。如果在本地緩衝區有目標文件,則直接將文件傳給用戶即可。如果沒有的話則先取回文件,先在本地保存一份緩衝,然後將文件發給客戶端瀏覽器。
2. 透明代理緩衝服務器
透明代理緩衝服務和標準代理服務器的功能完全相同。但是,代理操作對客戶端的瀏覽器是透明的(即不需指明代理服務器的IP和端口)。透明代理服務器阻斷網絡通信,並且過濾出訪問外部的HTTP(80端口)流量。如果客戶端的請求在本地有緩衝則將緩衝的數據直接發給用戶,如果在本地沒有緩衝則向遠程web服務器發出請求,其餘操作和標準的代理服務器完全相同。對於Linux操作系統來說,透明代理使用Iptables或者Ipchains實現。因爲不需要對瀏覽器作任何設置,所以,透明代理對於ISP(Internet服務器提供商)特別有用。
3. 反向代理緩衝服務器
反向代理是和前兩種代理完全不同的一種代理服務。使用它可以降低原始WEB服務器的負載。反向代理服務器承擔了對原始WEB服務器的靜態頁面的請求,防止原始服務器過載。它位於本地WEB服務器和Internet之間,處理所有對WEB服務器的請求,阻止了WEB服務器和Internet的直接通信。如果互聯網用戶請求的頁面在代理服務器上有緩衝的話,代理服務器直接將緩衝內容發送給用戶。如果沒有緩衝則先向WEB服務器發出請求,取回數據,本地緩存後再發送給用戶。這種方式通過降低了向WEB服務器的請求數從而降低了WEB服務器的負載。
- 反向代理工作原理
- 當用戶瀏覽器發出一個HTTP請求時,通過域名解析將請求定向到反向代理服務器(如果要實現多個WEB服務器的反向代理,需要將多個WEB服務器的域名都指向反向代理服務器)。由反向代理服務器處理器請求。反向代理一般只緩存可緩衝的數據(比如html網頁和圖片等),而一些CGI腳本程序或者ASP之類的程序不緩存。它根據從WEB服務器返回的HTTP頭標記來緩衝靜態頁面。有四個最重要HTTP頭標記:
Last-Modified: 告訴反向代理頁面什麼時間被修改
Expires: 告訴反向代理頁面什麼時間應該從緩衝區中刪除
Cache-Control: 告訴反向代理頁面是否應該被緩衝
Pragma: 告訴反向代理頁面是否應該被緩衝.
例如:在默認情況下,ASP頁面返回” Cache-control: private.” ,所以ASP頁面時不會在反向代理服務器緩存的
二.實驗分析以及結構圖
- 客戶機處於僅主機模式,web服務器處於NAT模式下
- 由於代理服務器和web服務器之間沒有網關關係,所有必須在web服務器添加一條靜態路由方便返回
- 此外也可以客戶機使用NAT模式,但是要在瀏覽器上設置,虛擬IP地址和虛擬IP地址,如下
三.實驗環境
類型 | IP地址 | 系統 | 軟件包 |
squid代理服務器 |
ens33:192.168.43.101/24 ens37:192.168.10.1/24 |
centos7 | squid-3.4.6.tar.gz |
web服務器1 | 192.168.43.102/24 | centos7 | |
web服務器2 | 192.168.43.103/24 | centos7 | |
客戶機 | 192.168.10.10/24 | centos7 |
四.具體操作分析
- 配置squid代理服務器
1.解壓squid軟件包
tar xzvf squid-3.4.6.tar.gz -C /opt
2.安裝相關軟件包
yum install gcc gcc-c++ make -y
3.配置服務模塊,編譯安裝
cd /opt/suqid-3.4.6/
./configure \
--prefix=/usr/local/squid \
--sysconfdir=/etc --enable-arp-acl \
--enable-linux-netfilter \
--enable-linux-tproxy \ //添加透明代理功能
--enable-async-io=100 \
--enable-err-language="Simplify_Chinese" \
--enable-underscore \
--enable-poll \
--enable-gnuregex
make && make install
4.創建軟鏈接,優化服務控制方式
ln -s /usr/local/squid/sbin/squid /usr/local/sbin/
5.創建squid用戶
useradd -M -s /sbin/nologin squid
6.修改squid文件中的var目錄的屬性
chowm -R squid.squid /usr/local/squid/var/
7.編輯squid的配置文件
vim /etc/squid.conf
55 # And finally deny all other access to this proxy
56 http_access allow all
57 http_access deny all //允許所有用戶訪問
58
59 # Squid normally listens to port 3128
60 http_port 192.168.43.101:80 accel vhost vport //定義虛擬主機和虛擬端口
cache_peer 192.168.43.102 parent 80 no_query originserver round-robin max_conn=30 weight=1 name=web1 //編輯節點服務器
cache_peer 192.168.43.103 parent 80 no_query originserver round-robin max_conn=30 weight=1 name=web2
cache_peer_domain web1 web2 www.yun.com //用域名調用節點服務器別名
61 cache_mem 64 MB //指定緩存功能所使用的內存空間大小
62 reply_body_max_size 10 MB //允許用戶下載的最大文件大小
63 maximum_object_size 4096 KB //允許保存到緩存空間的最大對象大小
64 cache_effective_user squid //添加指定程序用戶
65 cache_effective_group squid //添加指定賬戶基本組
66
67 # Uncomment and adjust the following to add a disk cache directory.
68 #cache_dir ufs /usr/local/squid/var/cache/squid 100 16 256
8.編輯防火牆規則
iptables -F //清除所有規則
iptables -t nat -F //清除所有NAT規則
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT //允許目標端口3128做轉發
9.檢查語法並且開啓服務
squid -k parse //檢查配置文件語法
squid -z //初始化緩存目錄
squid //啓動服務
[root@localhost ~]# netstat -natp | grep squid
tcp6 0 0 :::3128 :::* LISTEN 36414/(squid-1)
[root@localhost ~]#
10.編輯腳本,優化服務控制方式(service 工具)
vim /etc/init.d/squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -natp | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在啓動 squid...."
echo "成功啓動"
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/null
rm -rf $PID &> /dev/null
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -natp | grep squid
else
echo "squid is not running"
fi
;;
restart)
$0 stop &> /dev/null
echo "正在關閉 squid..."
echo "關閉成功"
$0 start &> /dev/null
echo "正在啓動 squid..."
echo "啓動成功"
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo "用法:$0{start|stop|status|reload|check|restart}"
;;
esac
chmod +x /etc/init.d/squid //添加服務執行權限
chkconfig --add squid //添加到service的服務列表
chkconfig --level 35 squid on //開機自啓
[root@localhost ~]# service squid restart
正在關閉 squid...
關閉成功
正在啓動 squid...
啓動成功
[root@localhost ~]#
11.修改網卡信息
[root@suqid ~]# cd /etc/sysconfig/network-scripts/
[root@suqid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens37
[root@suqid network-scripts]# vim ifcfg-ens37
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens37"
DEVICE="ens37"
ONBOOT="yes"
IPADDR="192.168.10.1"
PREFIX="24"
IPV6_PRIVACY="no"
~
[root@suqid network-scripts]# service network restart
Restarting network (via systemctl): [ 確定 ]
[root@suqid network-scripts]#
- 配置web服務器
1.配置web服務器1
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# cd /var/www/html
[root@localhost html]# echo "<h1>this is yun</h1>" > index.html
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# netstat -natp | grep 80
tcp 0 0 192.168.43.102:22 192.168.43.1:58000 ESTABLISHED 1372/sshd: root@pts
tcp6 0 0 :::80 :::* LISTEN 1633/httpd
[root@localhost ~]# route add -net 192.168.10.0/24 gw 192.168.43.101 //添加路由表
2.配置web服務器2
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# cd /var/www/html
[root@localhost html]# echo "<h1>this is data</h1>" > index.html
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# netstat -natp | grep 80
tcp 0 0 192.168.43.103:22 192.168.43.1:58000 ESTABLISHED 1372/sshd: root@pts
tcp6 0 0 :::80 :::* LISTEN 1633/httpd
[root@localhost ~]# route add -net 192.168.10.0/24 gw 192.168.43.101
- 第一種模式:僅主機模式下配置客戶機,訪問web服務器
- 第二種模式:在客戶機上配置代理,設置虛擬IP和虛擬端口
五.驗證結果
- 由於使用輪詢算法,權重唯一,所以當訪問代理服務器時,刷新一次就會調轉頁面