2015/05/25   squid

http://symphony.b3log.org/article/1381403388981     #正向、反向代理解釋

一、什麼是squid?

squid可以做代理也可以做緩存。

squid緩存不僅可以節省寶貴的帶寬資源, 也可以大大降低服務器的I/O。

squid不僅可以做正向代理, 又可以做反向代理。

正向代理, squid後面是客戶端, 客戶端上網銅鼓squid去上。

反向代理, squid後面是服務器, 服務器返回給用戶數據需要走squid。

正向代理用在企業的辦公環境中, 客戶端上網通過squid代理來上網,這樣可以節省網絡帶寬資源。

反向代理用來搭建網站靜態項(圖片、html、流媒體、js、css等)的緩存服務器, 它用於網站架構中。

二、搭建squid正向代理

1. 用yum安裝squid;

[root@squid ~]# yum -y install squid

2. 搭建squid正向代理;

[root@squid ~]# squid -v                    #查看squid版本;

[root@squid ~]# cd /etc/squid/

[root@squid squid]# cp squid.conf squid.conf.20150523

[root@squid squid]# vim squid.conf               #編輯squid主配置文件

把默認的squid.conf裏的內容全部刪除, 添加下面的配置..

###### 添加如下 ######

http_port 3128                                             #squid端口號;
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80 8080         # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access allow localhost
http_access allow all
cache_dir aufs /data/cache 1024 16 256               #緩存目錄
cache_mem 128 MB
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern \.(jpg|png|gif|mp3|xml) 1440    50%     2880    ignore-reload          #緩存時間
refresh_pattern .               0       20%     4320

######    結束    ######

[root@squid squid]# mkdir /data/cache               #創建緩存目錄

[root@squid squid]# chown -R squid /data/cache/          #更改權限

[root@squid squid]# squid -z                         #初始化緩存目錄.

[root@squid squid]# squid -kcheck               #檢測配置文件是否有錯

[root@squid squid]# /etc/init.d/squid start    #啓動squid服務
Starting squid: ....................[FAILED]

啓動squid失敗, 能看到squid進程, 不能看見squid的3128端口號. 解決辦法如下

[root@squid ~]# vim /etc/hosts                    #添加本地hosts文件
192.168.15.12   squid.com

[root@squid squid]# vim squid.conf              #編輯squid主配置文件
http_port 192.168.15.12:3128                       #添加本機IP:3128

[root@squid squid]# /etc/init.d/squid start    #啓動squid服務

[root@squid ~]# netstat -anpt |grep 3128     #檢查3128端口是否存在;
tcp        0      0 192.168.15.12:3128          0.0.0.0:*                   LISTEN      3425/(squid)

     用curl驗證正向代理.

[root@LAMP ~]# curl -x192.168.15.12:3128 www.90root.com -I          #驗證正向代理
HTTP/1.0 200 OK
Server: nginx
Date: Fri, 22 May 2015 18:07:49 GMT
Content-Type: text/html
X-Powered-By: PHP/5.4.37
X-Cache: MISS from squid.com
X-Cache-Lookup: MISS from squid.com:3128
Via: 1.0 squid.com (squid/3.1.10)                                                       #squid代理訪問;
Connection: keep-alive

3. 需求: 禁止訪問淘寶、京東網站;

[root@squid squid]# vim squid.conf

#####建議添加acl後面#####

acl http proto HTTP
acl bad_domain dstdomain .taobao.com .jd.com           
http_access deny http bad_domain

#####         結束        #####

在沒重啓squid之前, 使用正常代理能夠訪問淘寶、京東。 只截取幾條重要信息。

[root@LAMP ~]# curl -x192.168.15.12:3128 www.jd.com -I

HTTP/1.0 200 OK
Server: JDWS

X-Cache-Lookup: MISS from squid.com:3128

[root@LAMP ~]# curl -x192.168.15.12:3128 www.taobao.com -I

HTTP/1.0 200 OK
Server: Tengine

X-Cache-Lookup: MISS from squid.com:3128

[root@squid squid]# squid -kcheck                        #檢查squid語法是否有誤;

[root@squid squid]# squid -kreconfig                    #重新加載配置文件;

     用curl驗證正向代理

[root@LAMP ~]# curl -x192.168.15.12:3128 www.taobao.com -I
HTTP/1.0 403 Forbidden
Server: squid/3.1.10

X-Cache-Lookup: NONE from squid.com:3128

[root@LAMP ~]# curl -x192.168.15.12:3128 www.jd.com -I
HTTP/1.0 403 Forbidden
Server: squid/3.1.10

X-Cache-Lookup: NONE from squid.com:3128

     用windows主機驗證正向代理

打開IE瀏覽器, 點擊工具---Internet選項.

spacer.gifwKioL1VihpCD57FmAAFJiWdZgto070.jpg

wKiom1VihRCT25ZDAAMNBMrr8N4897.jpg

用IE訪問www.taobao.com和www.jd.com

wKiom1VihRqhYRmJAAMOeHfpE6o130.jpg


三、搭建squid反向代理

1. 編輯squid主配置文件;

[root@squid squid]# vim squid.conf

###### 添加如下 ######

http_port 192.168.15.12:8081 accel vhost vport                         #將3128端口改爲8081, 並在後面添加ccel vhost vport  
cache_peer 182.254.18.159 parent 80 0 originserver name=a     #代理域名的IP、端口號、a爲域名的別名,可自定義。

cache_peer_domain a www.qq.com 
cache_peer 112.74.113.61   parent 80 0 originserver name=b       
cache_peer_domain b www.90root.com

如果是squid要代理一臺web上的所有域名, 那麼就寫成這樣: cache_pper 192.168.10.11 80 0 originserver

cache_peer_domain 都可以省掉

之前增加的域名白/黑名單相關配置去掉. 在下面2行前面添加註釋;

#acl bad_domain dstdomain .taobao.com .jd.com
#http_access deny http bad_domain

######    結束    ######

[root@squid squid]# squid -kcheck
[root@squid squid]# squid -kreconfig

     用curl驗證反向代理.

[root@LAMP ~]# curl -x192.168.15.12:8081 www.qq.com -I
HTTP/1.0 200 OK
Server: squid/3.4.1

X-Cache-Lookup: MISS from squid.com:8081

[root@LAMP ~]# curl -x192.168.15.12:8081 www.90root.com -I
HTTP/1.0 200 OK
Server: nginx

X-Cache-Lookup: MISS from squid.com:8081

[root@LAMP ~]# curl -x192.168.15.12:8081 www.taobao.com -I
HTTP/1.0 503 Service Unavailable
Server: squid/3.1.10

X-Cache-Lookup: MISS from squid.com:8081

當訪問qq和90root域名時, 能訪問..  訪問其它域名時出現503. 這樣反向代理驗證成功。

四、搭建透明代理

透明代理的意思是客戶端根本不需要知道有代理服務器的存在, 它改變你的request fields(報文), 並會傳送真實IP, 多用於路由器的NAT轉發中.

透明代理的原理是這樣的:

①. 假設A爲內部網絡客戶機

②. B爲外部網絡服務器, B提供的服務爲httpd服務, 監聽端口爲80

③. C爲代理服務器(也就是我們的網關), 架設代理服務器提供服務端口爲3128

過程: 當A向B的80端口請求數據時,TCP連接請求要先經過C,C看到A請求的是B的80端口時,C由於已經設置了轉發規則,所以C會把A的請求80端口轉發到自己的3128端口,也就是說A將要直接訪問C的3128端口,而非B服務器的80端口,此時,C會先去訪問B的80端口,把A要訪問B的請求數據先請求過來,保存到C上,然後C再把請求數據吐給A。而在A看來,它貌似是直接請求的B,而實際並非如此。由於這些連接過程是自動的,不需要客戶端手工配置代理服務器,甚至用戶根本不知道代理服務器的存在,因而對用戶來說是透明的。

需求: 透明代理服務器的eth0網卡地址爲10.2.1.100(可以上公網的IP), eth1網卡地址爲192.168.1.10, 那麼要通過透明代理上網的局域網段應該爲192.168.1.0/24, 並且在該局域的客戶機應該設置的網關地址爲192.168.1.10

通過上面的原理分析,可知,只有您的代理服務器爲網關時,纔可以實現透明代理的功能,否則無效。實際應用中,透明代理服務器應該有至少兩個網卡,第一個網卡連接到外網,或者它可以直接上網,第二個網卡連接的是內部的一個局域網段,也就是想使用代理上網的網段。


1. 編輯squid主配置文件

[root@squid ~]# cd /etc/squid/

[root@squid squid]# cp squid.conf squid.conf.20150524

[root@squid squid]# vim squid.conf

把默認的squid.conf裏的內容全部刪除, 添加下面的配置..

###### 添加如下 ######

http_port 3128 transparent
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80 8080         # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl CONNECT method CONNECT
http_access allow all
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access allow localhost
http_access deny all
cache_dir aufs /data/cache 1024 16 256
cache_mem 128 MB
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern \.(jpg|png|gif|mp3|xml) 1440    50%     2880    ignore-reload
refresh_pattern .               0       20%     4320

######    結束    ######


2. 創建緩存目錄, 並修改權限.

[root@squid squid]# mkdir  /data/cache/

[root@squid squid]# chown -R squid:squid /data/cache/

3. 初始化緩存目錄

[root@squid squid]# squid -z

4. 打開端口轉發

[root@squid squid]# echo "1" > /proc/sys/net/ipv4/ip_forward

5. 設置防火牆規則

[root@squid squid]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
[root@squid squid]# iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-ports 3128

6. 客戶機驗證

spacer.gifwKioL1Vihr2TrCOYAABE0OrRVYQ233.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章