墨魚現形記--Squid安裝實錄

吳志凌

墨魚菜的佐料如何調味?

接著,請使用 cd  /usr/local/squid 命令改變目前工作目錄到剛才Squid安裝的目錄中(本例中是/usr/local/squid ),你可以使用 ls  al 看到其下有著如下所示的幾個子目錄,其中

l         etc子目錄是squid程式的設定檔所在目錄,在這個程式啟動時所有要讀取的設定預設上都是放在這裡。

l         bin子目錄則是存放這個squid軟體相關的所有執行程式。

l         logs子目錄目前是空的,它是預設要給squid程式儲存所有相關紀錄檔的目錄路徑。

而接下來使用 “cd  etc” ls命令可以看到在etc子目錄中有幾個文字設定檔案,其中最重要的是squid.conf,它是squid的重心所在,所有的功能設定幾乎都在這個小小的檔案中描述並設定之,不要小看它喔,其中的設定可不是簡簡單單就可以了解的!不過若是你的網路連線條件不是很複雜,只要設定一些基本的條件就可以了。

接下來你可以選擇任一個文字編輯器來編輯 squid.conf 設定檔,像vi,joe,pico等等,或者你可以用ftp程式將它抓回來,然後使用notepad記事本,write之類的文字編輯器編輯修改,修改結束後再傳回原主機的原目錄中即可,下面我們就先來看看這個設定檔中有哪些基本設定:

#http_port 3128

#icp_port 3130

http_port是設定使用者的瀏覽器與本台proxy主機要使用哪個通訊port溝通,預設是3128,如果要設定必須將#號拿掉,而icp_port則是設定在proxy主機與proxy主機之間的溝通使用哪個通訊port,squid可以讓多台主機結合在一起成為一個階層化的龐大系統,夠厲害吧,而主機之間的設定在後面就會有另外的設定,它們已經是預設值,若不更改則不必更動。

#cache_peer hostname type 3128 3130 [options]

這個項目就是設定proxy主機的階層,其中hostname可以使用主機名稱或ip位址,type則是設定本主機與此項目設定的另一台squid主機hostname之間的關係,可以是以下三種之一:

l         parent:設定這台hostname主機是我的parent(上層主機)。

l         sibling:設定這台hostname主機是我的sibling鄰居(協同主機)。

l         multicast:少用。

所謂parent主機就是若是所要求的資訊不在它的cache裡面則此parent主機會主動幫你去取得,而sibling主機則只檢查自己的cache中是否有你這台主機傳過去的要求網頁資訊,若是沒有則傳回其訊息,然後你自己就必須自行去連線取得。由於若是你的proxy主機被別人設為parentsibling,則主機的負荷勢必會增加,所以通常我們會限定哪些主機才能夠作此設定。

接下來就是設定此hostname主機在前述說明過與我的這台主機溝通的http_port以及ipc_port通訊port,然後就是一些選用的選項,共有proxy-only、weight=n、ttl=n、no-query、default、round-robin、multicast-responder、closest-only、no-digest、no-netdb-exchange、no-delay、login=user:password、connect-timeout=nn、digest-url=url等選項,資就較常用的幾個選項作說明:

l         proxy-only:指定此hostname主機所傳回的cache資料不要儲存在本機的cache硬碟中,若是本機的硬碟cache空間很小,或是與設定的hostname主機網路連線速度很快,就可以使用這個選項。

l         weight=n:設定所有設定進來的hostname主機之間的負荷比重。

l         no-query:設定本主機不透過icp port向這台hostname主機發送icp查詢,而直接由http取回回應的資料,如此可以減少這台hostname主機受到本主機要求的負荷,而這個選項又通常可以跟default或round-robin選項合用。

l         default:若是所有的上層(parent)主機都無法以ICP通訊聯繫上的話,則直接將此hostname主機做最後選擇的出路。

l         round-robin:本主機對多台擁有設定本選項的hostname主機之間作輪流要求傳送的動作。

l         no-netdb-exchange:對此hostname主機不傳送網路相關資訊交換的動作,減少主機之間的負荷。

l         login=user:password:若是設定的hostname主機連線要求帳號及密碼時可以使用本選項作輸入設定。

例如:

#     #                            proxy   icp

#     #       hostname        type     port   port   options

#     #      -----------     -------  ------  -----  ----------

#   cache_peer parent.foo.net  parent    3128   3130  [proxy-only]

#   cache_peer sib1.foo.net    sibling   3128   3130  [proxy-only]

#   cache_peer sib2.foo.net    sibling   3128   3130  [proxy-only]

本例中設定了主機parent.foo.net是本主機的上層主機,而sib1.foo.net與sib2.foo.net兩台主機都是本機的協同主機,所使用的http port以及icp port都是3128及3130。

接下來是設定各上層(parent)或協同(sibling)主機的負責網域:

cache_peer_domain   parent.foo.net        .edu

例如上述這行就定義了上層主機 parent.foo.net 專門負責.edu網域主機的工作,也就是限制住只有在本機要連往.edu網域的要求會被送往上層主機 parent.foo.net 去負責抓取。

cache_peer_domain   sib1.foo.net        !.com !.jp

上面這行則是定義除了.com以及.jp之外的網域都歸它負責,!驚嘆號代表邏輯的的意思,而要注意的是上面這行定義了多個網域,而squid的判斷則是已先後關係判斷,先符合到的網域會被接受。

沒有定義的sib2.foo.net則代表它接受所有的網域。

Hierarchy_stoplist cgi-bin ?

squid 預設值是不讓所連網站執行 cgi程式 (網址中帶有 cgi-bin? 字眼)的 連線要求送到parent proxy,若是你的主機一定要可以透過parent主機,請將此行去掉井字號後改稱 hierarchy_stoplist 即可。

#acl QUERY urlpath_regex cgi-bin \?

#no_cache deny QUERY

這個設定是設定若網址中有 cgi-bin? 字眼的網頁資訊都不存在本機上的cache中,要注意的是這個設定沒有預設值。

cache_mem  8 MB

這個項目設定系統讓squid使用的記憶體大小,通常我們會設定在你這台主機擁有的記憶體總數之三分之一,然後再根據實際執行使用狀況調整之。

maximum_object_size 4096 KB

設定你這台主機儲存cache物件的最大極限是多少,也就是超過此大小的物件將不儲存在本主機的cache空間中。

#cache_dir Type Directory-Name Mbytes Level-1 Level2

cache_dir ufs /cache 100 16 256

設定這台主機cache空間的存取型態(Type)、開始儲存位置、大小(以MB byte為單位)以及二層目錄結構大小,這個項目設定可以多個,完全視你的配備與需求,在型態方面一般是使用ufs即可,若是你使用Linux或Solaris作業系統,則可以考慮使用asyncufs之非同步IO,它可以提昇你的cache硬碟之存取效能,但是記得要在編譯squid時加上--enable-async-io的選項,容量設定是以MB byte為單位,最好是設定你的這個檔案系統可用空間的80%左右,因為它還需要一些空間作swap之用,接下來是設定在開始儲存位置下的第一層目錄數目,然後是第二層,在squid執行儲存時會將cache的物件儲存到這些目錄中。

cache_access_log  /usr/local/squid/logs/access.log

這個項目設定squid儲存使用者存取紀錄的紀錄檔儲存位置。

cache_log  /usr/local/squid/logs/cache.log

這個項目設定儲存squid系統紀錄的紀錄檔儲存位置。

#cache_store_log  none

這個項目設定儲存squid在cache空間儲存物件大小,時間等相關紀錄的紀錄檔儲存位置,除非有必要,否則最好不要儲存它,因為它的檔案大小可是與妳的cache空間成正比的,所以我們可以設定成none來關閉它。

# ACCESS CONTROLS

# -----------------------------------------------------------------------

# TAG: acl

# Defining an Access List

#

#acl aclname acltype string1 ...

#acl aclname acltype "file" ...

接著這裡要設定的項目是squid的重頭戲:存取控制,首先你要建立的就是相當具有彈性(相對的也就較複雜)的存取控制列表(Access Control List,簡稱ACL),將相關的來源、目的或協定等等組織成同一個ACL群組,再控制這些全組可以使用的權限。

Acltype可以是src(來源ip)、dst(目的ip)、srcdomain(來源名稱)、dstdomain(目的名稱)、url_pattern(網址內容)、urlpath_pattern(網址路徑內容)、time(時間)、port(通訊port)、proto(通訊協定)、method(連線方法)、browser(瀏覽器)、user(使用者名稱)等等,而後面的string1,string2就看你的定義中是要填入ip位址或主機、網域名稱等等(可再加上網域遮罩),若是使用第二個的file(也就是將定義字串另存檔案),記得在這個檔案中的每一個項目要各在一行上,詳細的設定可以參考這個設定檔上的詳細說明,現在我們就來看看一些簡單的設定範例:

acl src tku-src-ip 163.13.0.0/16 210.60.221.0/24 210.60.222.0/24 210.60.223.0/24

上面這行就定義了淡江使用者(來源)為163.13.0.0,210.60.221.0,210.60.222.0,210.60.223.0四個網域的ip位址,名稱為tku-src-ip。

acl srcdomain tku-src-dn  .tku.edu.tw

上面這行就定義了淡江使用者(來源)網域名稱為 .tku.edu.tw,其名稱為tku-src-dn。

acl dst tku-dst-ip 163.13.0.0/16 210.60.221.0/24 210.60.222.0/24 210.60.223.0/24

上面這行就定義了被連線的淡江主機(目的)為163.13.0.0,210.60.221.0,210.60.222.0,210.60.223.0四個網域的ip位址,名稱為tku-dst-ip。

acl dstdomain tku-dst-dn  .tku.edu.tw

上面這行就定義了被連線的淡江主機(目的)之網域名稱為 .tku.edu.tw,其名稱為tku-dst-dn。

#http_access allow|deny [!]aclname ...

這個項目定義哪些條件項目(也就是ACL)可以或不可以使用http存取本主機,你可以同時有多行http_access設定,設定出的結果則是由上而下,由左而右由最先吻合的條件先成立,現在我們來看看下面這個例子:

http_access allow tku-src-ip tku-src-dn

http_access deny tku-dst-ip tku-dst-dn

http_access deny all

上面這個設定就定義了只有符合tku-src-ip(163.13.0.0,210.60.221.0,210.60.222.0,210.60.223.0)以及tku-src-dn(*.tku.edu.tw)的來源使用者可以設定以http連結本主機的存取服務(也就是只有這兩個list使用者可以設本機為proxy存取本主機cache),但是不允許任何人,包括tku-src-ip以及tku-src-dn的使用者透過本主機存取tku-dst-ip以及tku-dst-dn的資訊,因為自家人還要透過proxy主機,而不自行存取自己區域內的網頁資訊是不是有點不正常?而且徒增本proxy主機的負荷。

#icp_access allow|deny [!]aclname ...

這個項目定義哪些條件項目(也就是ACL)的proxy主機可以或不可以設定本主機為其階層主機之一(即透過icp存取)。例如:

acl src allow-servers-ip 163.13.1.195/24 163.13.1.194/24 163.13.1.196/24

acl srcdomain allow-servers-dn proxy.tku.edu.tw proxyb.tku.edu.tw

icp_access allow allow-servers-ip allow-servers-dn

icp_access deny all

這個例子設定只有163.13.1.195,163.13.1.194,163.13.1.196以及proxy.tku.edu.tw,proxyb.tku.edu.tw五台proxy主機可以透過icp設定本主機為它的parent,其他的主機icp要求一蓋拒絕。

#miss_access allow|deny [!]aclname

這個設定定義哪些條件項目(也就是ACL)的主機以http存取本主機發生miss時(也就是本主機cache中沒有所要的資料),本主機要幫它出去抓取,存入cache中,並傳回給使用者,所以這裡通常設定的是前面允許http_access以及icp_access的ACL。例如:

miss_access allow tku-src-ip tku-src-dn

miss_access deny tku-dst-ip tku-dst-dn

miss_access allow allow-servers-ip allow-servers-dn

miss_access deny all

#cache_effective_user nobody

#cache_effective_group nogroup

當以root執行squid後,squid會嘗試變成上述使用者id以及group來執行,這是安全上的考量。

#visible_hostname www-cache.foo.org

此項目設定當squid要發生一些錯誤訊息給使用者時,要以什麼樣主機的名稱顯示。

#dns_testnames dns1.foo.net dns2.foo.net dns3.foo.net

這個項目設定squid在作domain name查詢的dns主機,你可以將可以存取的較近dns主機多設幾個進來以加快回應。

#prefer_direct on

預設上,若是本主機的squid一時無法與所設的parent主機連線上的話,本主機馬上自行連出去存取網頁資訊,而不等待所設的parent主機回應,若是你有一定要等待parent主機回應之需求,請將此選項設成off,建議設它。