基於 Squid 實現爬蟲代理服務

代理

代理服務器工作原理

代理服務器工作原理:

1、客戶端 A 向代理服務器發出訪問 Internet 的請求 。
2、代理服務器接受請求後,首先與訪問控制列表中的訪問規則相匹配,如果滿足規則,則在緩存中查找是否有需要的資源信息。
3、如果緩存中存在客戶端 A 的請求信息,那麼將此信息返回給客戶端 A ; 如果沒有代理服務器將代替客戶端去向 Internet 請求指定的信息。
4、Internet 上的主機將請求的信息發送到代理服務器,代理服務器會將信息存入緩存中。
5、代理服務器將 Internet 上主機的返回信息傳給客戶端 A 。
6、當客戶端 B 也請求相同的信息時。
7、代理服務器也會接受請求後,與訪問控制列表中的規則相匹配。
8、如果滿足規則,代理服務器將會把緩存中的信息直接傳給客戶端 B 。

代理分類

  • 正向代理(控制內網訪問互聯網)

  • 反向代理(控制外網訪問內網)

  • 透明代理(不加密的正向代理)

正向代理

代理內部主機上網,共享上網,緩存,控制內網用戶上網行爲等功能(客戶端需要設置代理服務器的IP和代理端口)

正向代理分析圖:
		外網
		 |
		modem
		 |
		路由器(dhcp,snat共享上網,上網行爲控制,限速等)
		 |
		 |
	 squid正向代理(共享上網,靜態頁面緩存加速,內網用戶四七層上網行爲控制,限速等)
		 |
		 |	
	|----------------------|
 上網用戶一		    上網用戶二
            公網
			 |
			 |	
			br0	172.16.13.250
			squid 服務器 
			virbr1	192.168.100.1		   
			 |
			 |
			 |	
			內網用戶VM1          	   	
			eth0(virbr1)			
			192.168.100.128

反向代理

從外部網絡訪問內部服務器,與正向方向相反,主要用於網站架構的緩存加速或CDN

            client
			  |
			  |
			反向代理 (緩存加速,七層切分,負載均衡,會話保持等)
			  |
			  |	
			  web

透明代理

和正向代理的功能完全一致(客戶端不需要設置代理服務器的IP和代理端口,對用戶是透明的)

參考資料

https://www.cnblogs.com/yanjieli/p/7507456.html

Squid

概念

Squid 是一款緩存代理服務器軟件,廣泛用於網站的負載均衡架構中,常見的緩存服務器還有varnish、ATS等。

正向代理服務器可滿足內網僅有一臺服務器可以上網,而要供內網所有機器上網的需求,也可以用於爬蟲的代理訪問。在實踐中我將Squid作爲爬蟲代理服務器,實現了多 IP 切換的功能。

安裝

yum install -y squid

配置說明

配置鑑權

yum install httpd

# 然後執行如下命令進行生成 用戶名和密碼,這裏的示例爲生成一個賬號:hello
# 執行該命令之後,根據提示輸入設置密碼
htpasswd -c /etc/squid/passwd hello

配置文件

(/etd/squid/squid.conf)

acl all src 0.0.0.0/0.0.0.0     #允許所有IP訪問
acl manager proto http        #manager url協議爲http
acl localhost src 127.0.0.1/255.255.255.255 #允午本機IP
acl to_localhost dst 127.0.0.1         #允午目的地址爲本機IP
acl CONNECT method CONNECT     #請求方法以CONNECT

#http_access allow all         #允許所有人使用該代理.

#http_reply_access allow all         #允許所有客戶端使用該代理

acl Safe_ports port 80     # 允許安全更新的端口爲80
acl Safe_ports port 443    #允許安全更新的端口爲443
acl localnet src 10.195.249.225   #
acl localnet src 10.195.236.141   #


http_access allow localnet      #
http_access deny !Safe_ports      #

acl OverConnLimit maxconn 16    #限制每個IP最大允許16個連接,防止攻擊

http_access deny OverConnLimit

 
icp_access deny all             #禁止從鄰居服務器緩衝內發送和接收ICP請求.
miss_access allow all         #允許直接更新請求
ident_lookup_access deny all                 #禁止lookup檢查DNS
http_port 8080 transparent                 #指定Squid監聽瀏覽器客戶請求的端口號。

hierarchy_stoplist cgi-bin ?         #用來強制某些特定的對象不被緩存,主要是處於安全的目的。

acl QUERY urlpath_regex cgi-bin \?

cache deny QUERY

cache_mem 1 GB     #這是一個優化選項,增加該內存值有利於緩存。應該注意的是:

​           \#一般來說如果系統有內存,設置該值爲(n/)3M。現在是3G 所以這裏1G

fqdncache_size 1024    #FQDN 高速緩存大小

maximum_object_size_in_memory 2 MB     #允許最大的文件載入內存


memory_replacement_policy heap LFUDA  #動態使用最小的,移出內存cache

cache_replacement_policy heap LFUDA     #動態使用最小的,移出硬盤cache


cache_dir ufs /home/cache 5000 32 512 #高速緩存目錄 ufs 類型 使用的緩衝值最大允午1000MB空間,

\#32個一級目錄,512個二級目錄


max_open_disk_fds 0                 #允許最大打開文件數量,0 無限制

minimum_object_size 1 KB             #允午最小文件請求體大小

maximum_object_size 20 MB         #允午最大文件請求體大小

cache_swap_low 90              #最小允許使用swap 90%

cache_swap_high 95              #最多允許使用swap 95%

 
ipcache_size 2048                # IP 地址高速緩存大小 2M
ipcache_low 90                #最小允許ipcache使用swap 90%
ipcache_high 95                 #最大允許ipcache使用swap 90%


access_log /var/log/squid/access.log squid     #定義日誌存放記錄
cache_log /var/log/squid/cache.log squid
cache_store_log none             #禁止store日誌


emulate_httpd_log on     #將使Squid仿照Web服務器的格式創建訪問記錄。如果希望使用

​                \#Web訪問記錄分析程序,就需要設置這個參數。


refresh_pattern . 0 20% 4320 override-expire override-lastmod reload-into-ims ignore-reload  #更新cache規則


acl buggy_server url_regex ^http://.... http://      #只允許http的請求broken_posts allow buggy_server

acl apache rep_header Server ^Apache         #允許apache的編碼

broken_vary_encoding allow apache


request_entities off                     #禁止非http的標分準請求,防止攻擊
header_access header allow all             #允許所有的http報頭
relaxed_header_parser on                 #不嚴格分析http報頭.
client_lifetime 120 minute                 #最大客戶連接時間 120分鐘
cache_mgr [email protected]             #指定當緩衝出現問題時向緩衝管理者發送告警信息的地址信息。
cache_effective_user squid             #這裏以用戶squid的身份Squid服務器
cache_effective_group squid

icp_port 0            #指定Squid從鄰居服務器緩衝內發送和接收ICP請求的端口號。
​           \#這裏設置爲0是因爲這裏配置Squid爲內部Web服務器的加速器,
​           \#所以不需要使用鄰居服務器的緩衝。0是禁用

\# cache_peer 設置允許更新緩存的主機,因是本機所以127.0.0.1

cache_peer 127.0.0.1 parent 80 0 no-query default multicast-responder no-netdb-exchange
cache_peer_domain 127.0.0.1                 
hostname_aliases 127.0.0.1

error_directory /usr/share/squid/errors/Simplify_Chinese     #定義錯誤路徑

always_direct allow all         # cache丟失或不存在是允許所有請求直接轉發到原始服務器
ignore_unknown_nameservers on     #開反DNS查詢,當域名地址不相同時候,禁止訪問
coredump_dir  /var/log/squid         #定義dump的目錄
max_filedesc 2048        #最大打開的文件描述

half_closed_clients off     #使Squid在當read不再返回數據時立即關閉客戶端的連接。

​                \#有時read不再返回數據是由於某些客戶關閉TCP的發送數據
​                \#而仍然保持接收數據。而Squid分辨不出TCP半關閉和完全關閉。

squid在做爬蟲代理時候,我們只需要做到一個squid代理,然後對其他代理做轉發輪詢,如何使用squid做代理並

自動轉發輪詢?

加上這行代碼:

cache_peer 120.xx.xx.32 parent 80 0 no-query weighted-round-robin weight=2 connect-fail-limit=2 allow-miss max-conn=5 name=proxy-90

注意,當120.xx.xx.32 是相同 但是端口不同的時候,必須設置不同的name,否則會報錯cache_peer 120.xx.xx.32 specified twice 這時候及得設置不同的name。

配置關鍵字含義

語法是這樣的 cache_peer Web服務器地址 服務器類型 http端口 icp端口 [可選項], 可選項包括:

  • proxy-only:指明從peer得到的數據在本地不進行緩存,缺省地,squid是要緩存這部分數據的;
  • weight=n:用於你有多個peer的情況,這時如果多於一個以上的peer擁有你請求的數據時,squid通過計算每個peer的ICP響應時間來 決定其weight的值,然後squid向其中擁有最大weight的peer發出ICP請求。也即weight值越大,其優先級越高。當然你也可以手工 指定其weight值;
  • no-query:不向該peer發送ICP請求。如果該peer不可用時,可以使用該選項;
  • Default:有點象路由表中的缺省路由,該peer將被用作最後的嘗試手段。當你只有一個父代理服務器並且其不支持ICP協議時,可以使用default和no-query選項讓所有請求都發送到該父代理服務器;
  • login=user:password:當你的父代理服務器要求用戶認證時可以使用該選項來進行認證。
    更新完成後保存重啓squid,就會發現 squid 已經正常可用了。

訪問控制

squid的acl(access control list)訪問控制(下面列舉一些常見的控制)

acl denyip src  192.168.100.128/32 	--拒絕內網的192.168.100.128/32上網
http_access deny denyip

acl denyip src 192.168.100.128-192.168.100.132/255.255.255.255
http_access deny denyip

acl vip  arp  00:0C:29:79:0C:1A 
http_access allow  vip 

acl  baddsturl2  dst   220.11.22.33  --不能訪問這個外網IP的網站
http_access deny baddsturl2

acl  baddsturl  dstdomain -i  www.163.com  --不能訪問www.163.com和WWW.163.COM;-i參數定義大小寫都匹配;  但是可以訪問war.163.com或sports.163.com
http_access deny baddsturl

acl  baddsturl  dstdom_regex -i  163	--這是把163以下的所有域名都禁止  ,但直接使用IP仍然是可以訪問的
http_access deny   baddsturl

acl  baddsturl  dstdom_regex "/etc/squid/baddsturl"  --如果網址太多,可以寫成一個文件,然後在這個文件裏一行一個網站寫上你要禁止的
http_access deny baddsturl

acl baddsturl3  url_regex  -i  baidu   --拒絕訪問url裏有baidu這個關鍵字的網站
http_access deny baddsturl3

acl badfile  urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$  \.rar$
http_access deny badfile	--禁止下載帶有定義後綴名的文件

acl badipclient2  src 192.168.100.0/255.255.255.0
acl worktime time  MTWHF 9:00-17:00
http_access deny badipclient2 worktime  --拒絕192.168.100.0網段工作時間不能上網

acl badipclient3  src 192.168.100.128
acl conn5  maxconn  5
http_access deny badipclient3 conn5	--最大連接數爲5

https://www.cnblogs.com/wangxiaoqiangs/p/5796597.html

初始化

修改完配置文件之後保存,然後輸入以下命令進行初始化 squid

squid -z

問題

TCP_MISS/503

發現日誌中有如下的內容

1587003941.248      0 172.25.0.1 TCP_MISS/503 4362 GET http://gtj.hangzhou.gov.cn/col/col1363087/index.html - HIER_NONE/- text/html
1587003942.505      0 172.25.0.1 TCP_MISS/503 4362 GET http://gtj.hangzhou.gov.cn/col/col1363087/index.html - HIER_NONE/- text/html
1587003943.779    301 172.25.0.1 TCP_MISS/200 388 GET http://httpbin.org/ip - HIER_DIRECT/34.230.193.231 application/json
1587003943.899      0 172.25.0.1 TCP_MISS/503 4357 GET http://gtj.hangzhou.gov.cn/col/col1363087/index.html - HIER_NONE/- text/html
1587003945.333      0 172.25.0.1 TCP_MISS/503 4362 GET http://gtj.hangzhou.gov.cn/col/col1363087/index.html - HIER_NONE/- text/html

查看到一個關鍵字TCP_MISS/503

谷歌之,找到這篇文章:https://forums.freebsd.org/threads/34184/

解決:

原來是IPv6不支持,按照裏面的提示,在/etc/squid/squid.conf裏面配置一個dns_v4_first on

再次嘗試的時候可以了!

如果還是不行的話,直接修改系統的配置

修改 /etc/sysconfig/network:
設置 NETWORKING_IPV6=no

(最好reboot重啓一次)

參考資料

http://cn.linux.vbird.org/linux_server/0420squid.php#server_default

代理池

https://github.com/AaronJny/open_proxy_pool

配置文件更新程序

https://github.com/xNathan/squid_proxy_pool

上述項目的文檔說明

https://xnathan.com/2017/03/01/squid-anony-proxy/

https://xnathan.com/2017/02/28/squid-proxy/

https://xnathan.com/2017/03/02/squid-proxy-pool/

squid 官方手冊

img

​ http://zyan.cc/book/squid/index.html

參考示例

https://rookiefly.cn/detail/192

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