HTTP(S)正向代理及squid簡介
目錄
正向代理的工作流程如下:

在客戶端看來,正向代理(也就是常說的代理)是它的“代言人”。在使用代理的時候,需要客戶端進行配置。
反向代理的工作流程如下:

在客戶端看來,反向代理就是它要訪問的目標服務,但是本質上,反向代理會將請求轉發給內部的服務來處理。
HTTP協議中,常用的請求方法有GET、POST、PUT、DELETE、HEAD等。還有一些不常用的請求方法,比如:CONNECT。
CONNECT的作用就是把伺服器作為代理,幫助客戶端去訪問目標服務。其工作流程如下:

- 客戶端與代理服務之間建立一條TCP連線
- 客戶端向代理服務傳送一個CONNECT請求,這一步可能涉及到使用者認證,如果認證不通過,代理服務會返回407 Unauthorized;如果認證通過,代理服務會與目標服務之間建立一條TCP連線,並返回200 Connection Established
- 此時,TCP通道就已經建立好了
- 代理服務把從客戶端收到的任意資料包原封不動的轉發到上一步建立好的TCP通道,包括TLS握手相關的資料包(TLS協議是TCP協議的上層協議);同時,也會將從TCP通道收到的任意資料包原封不動的轉發給客戶端
最常用的反向代理軟體是Nginx,並且Nginx也能正向代理HTTP請求,然而,原生Nginx不支援正向代理HTTPS請求。GitHub上有一個Nginx模組: ngx_http_proxy_connect_module ,使得Nginx支援CONNECT代理,但是博主在使用的時候,在錯誤日誌中,發現大量與建立TCP通道相關的超時,並且Nginx的DNS解析貌似不支援CNAME。下面將介紹如何使用squid做正向代理(當然squid也支援反向代理、透明代理)。
多個squid服務可以通過icp協議相互溝通,形成樹形層次關係(父代理、兄弟代理、子代理),構建代理服務叢集。但是,下面只會介紹普通的配置方式。
squid的配置選項很多,分為13類:
- NETWORK OPTIONS(有關的網路選項)
- OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM(作用於鄰居選擇演算法的有關選項)
- OPTIONS WHICH AFFECT THE CACHE SIZE(定義cache大小的有關選項)
- LOGFILE PATHNAMES AND CACHE DIRECTORIES(定義日誌檔案的路徑及cache的目錄)
- OPTIONS FOR EXTERNAL SUPPORT PROGRAMS(外部支援程式選項)
- OPTIONS FOR TUNING THE CACHE(調整cache的選項)
- TIMEOUTS(超時)
- ACCESS CONTROLS(訪問控制)
- ADMINISTRATIVE PARAMETERS(管理引數)
- OPTIONS FOR THE CACHE REGISTRATION SERVICE(cache註冊服務選項)
- HTTPD-ACCELERATOR OPTIONS(HTTPD加速選項)
- MISCELLANEOUS(雜項)
- DELAY POOL PARAMETERS(延時池引數)
下面介紹比較常用的選項:
1,http_port
squid監聽http請求的地址,預設是3128
2,cache_mem
這部分記憶體用來儲存以下物件:
- In-Transit Objects(正在傳輸的物件)
- Hot Objects(熱物件,即使用者經常訪問的物件)
- Negative-Cached Objects(消極儲存物件,即連結錯誤、404 Not Found之類的錯誤資訊)
3,cache_dir <scheme> <directory-name> <size> <level-1> <level-2>
用於指定用來快取物件的 交換空間 的目錄結構及大小。其中:
- scheme用於指定儲存機制,可以是:ufs、aufs、coss、diskd、null
- directory-name用於指定交換空間的頂級目錄
- size用於指定交換空間的大小,單位是MBytes
- level-1用於指定一級子目錄的數量
- level-2用於指定二級子目錄的數量
將物件儲存到多個目錄是為了避免單個目錄下檔案過多,導致系統性能下降。
可以通過多個cacache_dir指令,定義多個交換空間。
4,cache_swap_low [percent 0-100]、cache_swap_hight [percent 0-100]
當交換空間的使用率達到cache_swap_hight設定的閾值時,squid會按照設定的演算法(預設是LRU)清理物件,直到使用率降到cache_swap_low所設定的閾值。
5,maximum_object_size
大小超過該閾值的物件不會被快取
6,minimum_object_size
大小小於該閾值的物件不會被快取
7,maximum_object_size_in_memory
當物件的大小超過該閾值時,不會被放到記憶體快取(cache_mem)中
8,reply_body_max_size
當物件的大小達到該閾值,將不允許繼續下載,會被立即刪除,防止耗光交換空間
9,cache_access_log
用來記錄來自客戶端或鄰居的請求日誌
10,cache_store_log
用來記錄哪些物件被寫到了交換空間,以及哪些物件被從交換空間中清除了
11,cache_log
用來記錄一般的日誌資訊
12,cache_swap_log
該日誌中包含儲存在交換空間中的物件的元資料(MetaData)。每個交換空間都會對應一個日誌檔案
13,pid_filename
用來指定儲存squid的程序號的檔案
14,debug_options
用來指定記錄哪幾個方面的日誌,以及日誌的詳細程度。預設是:debug_options ALL,1,也就是對每個方面都做記錄,詳細程度為1(最低)
關於squid的日誌格式,可以移步參考文件
15,request_body_max_size
用來指定HTTP請求體的最大大小
16,quick_abort_min(KB)、quick_abort_max(KB)、quick_abort_pct(percent)
當客戶端中斷請求時,squid會檢查quick_abort的值,如果剩餘的部分小於quick_abort_min所設定的閾值,那麼squid會繼續傳輸;如果剩餘部分大於quick_abort_max所設定的閾值,那麼squid會終止傳輸;如果已傳輸的比例大於quick_abort_pct所設定的閾值,那麼squid會繼續傳輸
16,negative_ttl
設定消極儲存物件的生存時間。預設是0 seconds
17,positive_dns_ttl
設定成功的DNS查詢結果的生存時間。預設是6 hours
18,negative_dns_ttl
設定失敗的DNS查詢結果的生存時間。預設是1 minutes
19,connect_timeout
squid等待 到被代理伺服器的連線 完成的超時時間
20,read_timeout
如果在read_timeout所指定的時間內,squid沒有從被代理服務收到任何資料,那麼則終止客戶端的請求
21,write_timeout
squid向被代理服務寫資料的超時時間
22,request_timeout
用來設定 squid在與客戶端建立完連線之後,花多長時間等待HTTP請求頭完成傳輸
23,server_idle_pconn_timeout
用來設定squid與被代理伺服器之間的持久連線的最大空閒時間
24,client_idle_pconn_timeout
用來設定客戶端與squid之間的持久連線的最大空閒時間
25, client_persistent_connections
用於開啟客戶端與squid之間的長連線支援
26,server_persistent_connections
用於開啟squid與被代理服務之間的長連線支援
27,shutdown_lifetime
squid在收到SIGTERM或SIGHUP訊號後,會進入到shutdow pending模式,等待所有的活躍連線關閉。在過了shutdown_lifetime所指定的時間之後,仍然活躍的連線會收到“超時”。預設是:30 seconds
28,dns_timeout
DNS查詢的超時時間
29,dns_nameservers
用來指定一個DNS伺服器的列表,強制squid使用列表中的DNS伺服器,而不使用/etc/resolv.conf中配置的DNS伺服器
30,cache_mgr
用來設定管理員郵箱地址
31,cache_effective_user、cache_effective_group
設定以哪個使用者和組的身份執行squid
32,visible_hostname
設定返回給使用者的出錯資訊中的主機名
33,unique_hostname
如果代理伺服器是一個陣列,並且每臺代理服務都指定了相同的visible_hostname,那麼必須為它們指定不同的unique_hostname,以防“forwarding loops”(傳輸迴圈)
34,logfile_rotate
在使用 squid -k rotate
截斷squid的日誌的時候,squid會對老日誌進行備份,logfile_rotate用於指定保留的備份日誌檔案的個數,預設是0
35,acl
用來定義訪問控制列表。
語法是:acl <ACL-NAME> <ACL-TYPE> <VALUE> ...
其中ACL-TYPE可以是:
- src:用來指定源地址。比如,acl aclname addr1-addr2/netmask
- dst:用來指定目的地址。比如,acl aclname addr/netmask
- srcdomain:用來指定客戶端所屬的域。比如,acl aclname srcdomain foo.com...squid會根據客戶端ip反向查詢DNS
- dstdomain:用來指定被代理伺服器所屬的域。比如,acl aclname dstdomain foo.com...由請求的URL決定
- time:用來指定訪問時間
- port:用來指定埠
- protocol:用來指定協議
- method:用來指定請求方法
- proxy_auth:通過外部程式進行使用者認證
...
36,http_access
根據訪問控制列表決定允許或禁止某類使用者的訪問。
當某次訪問不匹配任何條目時,則應用最後一個條目的“非”。
37,half_closed_clients
該值為on的時候,squid會維護處於半關閉狀態的連線,直到連線上出現讀寫錯誤;否則,一旦連線上返回“no more data to read”,squid就會關閉連線
squid本身不帶任何認證程式。但是,它支援通過外部程式實現使用者認證。下面將介紹ncsa使用者認證的實現。ncsa是squid原始碼包自帶的認證程式之一。
1,下載和安裝
從官網下載squid的原始碼包,並解壓
cd src/auth/basic/NCSA make && sudo make install
basic_ncsa_auth
預設被安裝到了 /usr/local/squid/libexec/
目錄
2,用htpasswd生成密碼檔案
htpasswd -c -d -b /data1/squid/squid_passwd user password
(注意:squid要有密碼檔案的讀許可權)
3,配置只允許認證通過的使用者訪問
auth_param basic program /usr/local/squid/libexec/basic_ncsa_auth /data1/squid/squid_passwd acl authed_user proxy_auth REQUIRED http_access allow authed_user
4,其他需要注意的配置
- 設定用於使用者認證的子程序的數量。比如,auth_param basic children 5 startup=5 idle=1。在比較繁忙的網路中應該適當調大該值
- 設定一次認證的有效期。比如,auth_param basic credentialsttl 2 hours
- 設定使用者登陸時,向用戶顯示的域。比如,auth_param basic realm Squid proxy-caching web server
# 網路相關的配置 http_port 3333 # 快取相關的配置 cache_mem 4 GB cache_dir aufs /data1/squid/cache 20480 256 256 cache_swap_high 95 cache_swap_low 85 maximum_object_size 128 MB minimum_object_size 256 bytes maximum_object_size_in_memory 16 MB reply_body_max_size 256 MB # 日誌相關的配置 cache_access_log /data1/squid/logs/cache.access.log cache_store_log /data1/squid/logs/cache.store.log cache_log /data1/squid/logs/cache.log cache_swap_log /data1/squid/logs/cache.swap.log pid_filename /data1/squid/logs/squid.pid debug_options ALL,1 logfile_rotate 5 # + log_fqdn已經被廢棄了 # 使用者訪問控制相關的配置 request_body_max_size 100 MB quick_abort_min 8 KB quick_abort_max 16 KB quick_abort_pct 95 # !!!各種超時相關的配置!!! negative_ttl 1 seconds positive_dns_ttl 30 seconds negative_dns_ttl 1 seconds dns_timeout 5 seconds connect_timeout 15 seconds read_timeout 30 seconds write_timeout 30 seconds request_timeout 10 seconds server_persistent_connections off # server_idle_pconn_timeout 60 seconds client_persistent_connections on client_idle_pconn_timeout 15 seconds shutdown_lifetime 30 seconds half_closed_clients off # !!!與外部支援程式相關的配置!!! # + dns_children已經廢棄了 # + dns_nameservers none auth_param basic program /usr/local/squid/libexec/basic_ncsa_auth /data1/squid/squid_passwd auth_param basic children 15 startup=15 idle=5 auth_param basic credentialsttl 1 hours auth_param basic realm Used For FileService To Download Documents # 與管理相關的配置 # cache_mgr squid@domain # + cache_effective_user squid # + cache_effective_group squid visible_hostname squid-proxy unique_hostname squid-105 acl authed_user proxy_auth REQUIRED http_access allow all
注意事項
squid -z squid -k rotate