1. 程式人生 > >構建Squid代理服務器-傳統代理、透明代理、反向代理

構建Squid代理服務器-傳統代理、透明代理、反向代理

roc 端口 rep netfilter 存在 安裝squid host The 空間大小

Squid是Linux系統中最常用的一款開源代理服務軟件,主要提供緩存加速和應用層過濾控制的功能,可以很好的實現HTTP、FTP、DNS查詢以及SSL等應用的緩存代理。

正向代理:
根據實現的方式不同,代理服務可分為傳統代理和透明代理。

  • 傳統代理:普通的代理服務,多見於Internet環境,必須在客戶機的瀏覽器、QQ聊天工具、下載軟件等程序中手動設置代理服務器對的地址和端口,才能使用代理服務器來訪問網絡。對於網頁瀏覽器,訪問網站時的域名解析請求會發送給指定的代理服務器
  • 透明代理:提供與傳統代理相同的功能和服務,多見於局域網環境,其區別在於客戶機不需要指定代理服務器的地址和端口,而是通過默認路由、防火墻策略將Web訪問重定向,實際上仍然交給代理服務器處理。網頁瀏覽器訪問網站時的域名解析請求會優先發給DNS服務器

反向代理:將不同的URL請求分發到後臺不同的Web服務器上,通過squid反向代理,可以加速網站的訪問速度,同時互聯網用戶只能看到反向代理服務器的地址,加強網站的訪問安全。

官方地址:http://www.squid-cache.org/

參考文檔:http://www.squid-cache.org/Doc/config/

Squid安裝

1.編譯安裝Squid

將下載的Squid軟件包解壓至/opt目錄下。

[root@localhost abc]# tar zxvf squid-3.5.28.tar.gz -C /opt/

準備編譯環境,配置Squid的編譯選項並進行安裝。

yum install -y gcc gcc-c++ make
cd /opt/squid-3.5.28

./configure --prefix=/usr/local/squid \   //安裝目錄
--sysconfdir=/etc \                       //單獨將配置文件修改到其他目錄
--enable-arp-acl \                       //可以在規則中設置為直接通過客戶端MAC進行管理,防止客戶端使用IP欺騙  
--enable-linux-netfilter \               //使用內核過濾
--enable-linux-tproxy \                  //支持透明模式
--enable-async-io=100 \                  //異步I/O,提升存儲性能
--enable-err-language="Simplify_Chinese" \   //錯誤信息的顯示語言
--enable-underscore \                        //允許URL中有下劃線
--enable-poll \                              //使用Poll()模式,提升性能
--enable-gnuregex                            //提升GNU正則表達式
make && make install

2.安裝完成後,創建鏈接文件、創建用戶和組。

ln -s /usr/local/squid/sbin/* /usr/local/sbin/     //便於使用squid命令

useradd -M -s /sbin/nologin squid                //創建用戶和組

chown -R squid.squid /usr/local/squid/var/  //創建文件的屬性

3.編輯配置文件/etc/squid.conf

vim /etc/squid.conf   

     cache_effective_user squid     //添加 指定squid的程序用戶,用來設置初始化、運行時緩存的賬戶,否則啟動不成功  
     cache_effective_group squid   //添加 指定賬號的基本組     
     coredump_dir /usr/local/squid/var/cache/squid 

4.啟動squid服務,使用squid服務腳本。

(1)檢查配置文件的語法是否正確。

squid -k parse 

(2)先初始化緩存目錄,調用squid程序來啟動服務。

squid -z   //初始化緩存目錄

squid    //啟動服務

確認服務處於監聽狀態。

[root@localhost squid-4.1]# netstat -ntap | grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      86805/(squid-1) 

(3)編寫squid啟動腳本,並使用chkconfig和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..."
       $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..."
         $0 start &> /dev/null
      echo "正在啟動 squid..."
   ;;
   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        //添加為系統服務
chkconfig --level 35 squid on 

構建傳統代理服務器

案例需求描述:

  • 基於Internet環境。
  • 一臺Linux主機作為web服務器,啟用httpd服務。
  • 一臺Linux主機構建Squid服務,允許客戶機使用代理。
  • 一臺Windows7主機,指定所使用的代理服務器地址、端口號信息。
主機 系統 IP
squid 主機 CentOS7 172.16.100.110
web服務器 CentOS7 172.16.100.100
客戶機 windows 7 172.16.100.50

1.squid服務器的配置

(1)修改squid.conf配置文件

vim /etc/squid.conf

http_access allow all  //允許任意客戶機使用代理服務
http_access deny all
http_port 3128
cache_mem 64 MB                   //指定緩存功能所使用的內存空間大小,便於保持訪問較頻繁的WEB對象,容量最好為4的倍數,單位為MB,建議設為物理內存的1/4
reply_body_max_size 10 MB         //允許用戶下載的最大文件大小,以字節為單位。默認設置0表示不進行限制
maximum_object_size 4096 KB  

(2)在防火墻上添加允許策略

iptables -F
setenforce 0
iptables -I INPUT -p tcp --dport 3128 -j ACCEPT

(3)重載squid服務

service squid reload  //生效修改後的配置文件

2.客戶機的代理設置

(1)Windows客戶機的代理配置

打開瀏覽器(以IE為例,其他類似),菜單欄 -> 工具 -> Internet 選項 -> 連接 -> 局域網設置 -> 代理服務器,按照以下格式設置。
技術分享圖片

(2)Linux客戶機的代理配置

在命令行界面中使用代理服務器如elinks網頁瀏覽器、wget下載工具,必須通過環境變量來指定代理服務器的地址、端口等信息。

vim /etc/profile
   HTTP_PROXY=http://192.168.235.206:3128     //使用HTTP協議指定代理
   HTTPS_PROXY=http://192.168.235.206:3128    //使用HTTPS協議指定代理
   FTP_PROXY=http://192.168.235.206:3128     //使用FTP協議指定代理
   NO_PROXY=192.168.10.,192.168.20.          //對兩個局域網段指定代理
   export HTTP_PROXY HTTPS_PROXY FTP_PROXY NO_PROXY

source /etc/profile

3.網站服務器的設置

(1)安裝httpd,關閉防火墻

yum install httpd -y
systemctl stop firewalld.servie 
setenforce 0

(2)啟動httpd服務並加入開機自啟動

systemctl start httpd.service
chkconfig httpd on

(3)創建index.html

echo "<h1>Squid-Web1</h1>" > /var/www/html/index.html

4.代理服務的驗證

在客戶機中通過瀏覽器訪問目標網站http://172.16.100.100/
技術分享圖片
查看Squid訪問日誌的新增記錄
技術分享圖片

查看Web訪問日誌的新增記錄
技術分享圖片
當客戶機使用代理後,web服務器並不知道客戶機的真實ip,實際上是由代理服務器訪問。

構建透明代理服務器

案例需求描述:

  • 基於局域網主機通過Linux網關訪問Internet的環境。
  • 一臺Linux主機作為Internet上的web服務器,啟動httpd服務。
  • 一臺Linux主機作為網關服務器,並構建Squid服務提供代理服務。
  • 一臺windows7主機作為局域網的客戶機,只需正確設置IP地址、默認網關。
主機 系統 IP
squid 網關 CentOS7 ens33:192.168.100.1 ens37:12.0.0.1
web服務器 CentOS7 12.0.0.12
客戶機 windows 7 192.168.100.20

1.配置Squid支持透明代理

vim /etc/squid.conf

http_port 192.168.100.1:3128 transparent    //添加 提供透明服務

service squid reload    //重新加載服務

配置文件其余地方的修改參考前面的傳統代理的配置處。

2.設置iptables的重定向策略

將局域網段192.168.100.0/24且訪問HTTP、HTTPS等協議的數據包轉交給運行在本機3128端口上的Squid服務進行處理。

iptables -F

iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128

iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128

iptables -I INPUT -p tcp --dport 3218 -j ACCEPT

3.開啟路由轉發功能

vim /etc/sysctl.conf 
 net.ipv4.ip_forward = 1

sysctl -p

4.網站服務器配置如上述,操作步驟一樣

5.驗證透明代理的使用

如果客戶機上存在手動指定的代理服務器設置,應將其去除。在Linux客戶機,可以通過unset命令清除。

unset HTTP_PROXY HTTPS_PROXY

在客戶機中通過瀏覽器訪問目標網站http://12.0.0.12/

驗證結果:
技術分享圖片
在Squid代理服務器中,發現客戶機訪問網站服務器的記錄;

技術分享圖片
在被訪問的web服務器中,發現來自代理服務器的訪問記錄。
技術分享圖片

反向代理

客戶端請求訪問 WEB 服務時,DNS 將訪問的域名解析為 Squid 反向代理服務器的 IP 地址,這樣客戶端的 URL 請求將被發送到反向代理服務器。如果 Squid 反向代理服務器中緩存了該請求的資源,則將該請求的資源直接返回給客戶端,否則反向代理服務器將向後臺的 WEB 服務器請求資源,然後將請求的應答返回給客戶端,同時也將該應答緩存在本地,供下一個請求者使用。

案例環境:
主機
系統 IP
squid 網關 CentOS7 ens33:192.168.100.1 ens37:12.0.0.1
web1服務器 CentOS7 192.168.100.100
web2服務器 CentOS7 192.168.100.120
客戶機 windows 7 12.0.0.50

1.配置squid服務器

vim /etc/squid.conf

http_port 192.168.100.1:3128 transparent  //啟動透明代理

http_port 12.0.0.1.1:80 accel vhost vport
cache_peer 192.168.100.100 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
cache_peer 192.168.100.120 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2
cache_peer_domain web1 web2 www.yun.com

service squid restart 

2.配置防火墻策略

iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128

iptables -t nat -I PREROUTING -i ens33 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128

iptables -I INPUT -p tcp --dport 3218 -j ACCEPT

3.配置兩個網站服務器,操作步驟如上述一樣,不同的是修改web主頁。

#web1
echo "<h1>Squid-Web1</h1>" > /var/www/html/index.html

#web2
echo "<h1>Squid-Web2</h1>" > /var/www/html/index.html

4.配置客戶端

這裏可以使用DNS服務來解析,這裏我們為了方便,就在hosts 文件裏直接指定。

修改C:\Windows\System32\drivers\etc\hosts 文件
技術分享圖片

5.測試反向代理

在客戶端訪問目標網站www.yun.com
技術分享圖片
關閉web1的httpd服務,在web1服務器清除緩存,訪問網站,如圖所示:
技術分享圖片
然後在客戶端清除緩存訪問www.yun.com ,如圖所示:
技術分享圖片
刷新一次:
技術分享圖片
可以看到反向代理緩存成功。

構建Squid代理服務器-傳統代理、透明代理、反向代理