架設 Squid 代理服務器(訪問控制)

Squid 已經安裝了嗎?

Squid 的 rpm 文件已經和 RedHat 7.1 捆綁發行了,在安裝系統的時候,如果在 Networks 選項中選中的
話,它會自動安裝在系統上。您可以用下面的命令檢查您的系統中是否已經安裝了 Squid:
rpm -q squid
   
Squid 的最新版本可以在 Squid 主頁 或它的鏡像站點得到。 Squid 可以用下述命令安裝在系統上:
rpm -ivh squid-2.3.STABLE4-10.i386.rpm
   
 

配置 Squid

Squid 的定製是通過編輯它的配置文件 squid.conf 來實現的,squid.conf 文件通常在 /etc/squid 目錄
下。這個配置文件內容很多,但好在它的每個選項都有詳盡的說明。

首先要修改的是 http_port,這個選項指定了 Squid 監聽客戶請求的端口,默認值是 3128。要使用代理
功能,這個端口值要和運行 Squid 的機器的 IP 地址一起使用,可以修改成下面這樣:

http_port 192.168.0.1:8080

上述聲明表示 Squid 綁定在 IP 地址 192.168.0.1 上,端口爲 8080。端口可以設置爲任意值,但要確認
沒有其他程序會使用同樣的端口。其他的服務請求的端口設置也可以設爲類似的配置。  

訪問控制

使用訪問控制特性,可以控制在訪問時根據特定的時間間隔進行緩存、訪問特定站點或一組站點等等。 Squid 訪問控制有兩個要素:ACL 元素和 訪問列表。訪問列表可以允許或拒絕某些用戶對此服務的訪問。

下面列出一些重要的 ACL 元素類型
  • src : 源地址 (即客戶機IP地址)
  • dst : 目標地址 (即服務器IP地址)
  • srcdomain : 源名稱 (即客戶機名稱)
  • dstdomain : 目標名稱 (即服務器名稱)
  • time : 一天中的時刻和一週內的一天
  • url_regex : URL 規則表達式匹配
  • urlpath_regex: URL-path 規則表達式匹配,略去協議和主機名
  • proxy_auth : 通過外部程序進行用戶驗證
  • maxconn : 單一 IP 的最大連接數
爲了使用控制功能,必須先設置 ACL 規則並應用。ACL 聲明的格式如下:

acl   acl_element_name   type_of_acl_element values_to_acl

注:
  1. acl_element_name 可以是任一個在 ACL 中定義的名稱。
  2. 任何兩個 ACL 元素不能用相同的名字。
  3. 每個 ACL 由列表值組成。當進行匹配檢測的時候,多個值由邏輯或運算連接;換言之,即任一 ACL
    元素的值被匹配,則這個 ACL 元素即被匹配。
  4. 並不是所有的 ACL 元素都能使用訪問列表中的全部類型。
  5. 不同的 ACL 元素寫在不同行中,Squid 將把它們組合在一個列表中。
我們可以使用許多不同的訪問條目。下面列出我們將要用到的幾個:
  • http_access: 允許 HTTP 訪問。這個是主要的訪問控制條目。
  • no_cache: 定義對緩存請求的響應。
訪問列表的規則由一些類似 'allow' 或 'deny' 的關鍵字構成,用以允許或拒絕向特定或一組 ACL 元素提供服務。
注:
  1. 這些規則按照它們的排列順序進行匹配檢測,一旦檢測到匹配的規則,匹配檢測就立即結束。
  2. 一個訪問列表可以又多條規則組成。
  3. 如果沒有任何規則與訪問請求匹配,默認動作將與列表中最後一條規則對應。
  4. 一個訪問條目中的所有元素將用邏輯與運算連接:
    http_access Action 聲明1 AND 聲明2 AND 聲明 OR.
    http_access Action 聲明3
    多個 http_access 聲明間用或運算連接,但每個訪問條目的元素間用與運算連接。
  5. 請記住列表中的規則總是遵循由上而下的順序。
 

回到配置 Squid

Squid 默認不做任何用戶訪問控制。若要允許某個訪問,必須進行定製規則。在 squid.conf 中 http_access deny 行前輸入下述文字:

acl mynetwork 192.168.0.1/255.255.255.0
http_access allow mynetwork

mynetwork 是 acl 名稱,下一行則是適用於特定 acl (即 mynetwork ) 的規則。192.168.0.1 指明是網絡中掩碼爲 255.255.255.0 的子網。mynetwork 主要是爲了給出網絡上一組機器,下一條規則則允許這些
機器訪問 http 服務。上述修改配合 http_port 就可以讓 Squid 很好的工作起來了。 修改完成後,Squid
可以用下述命令啓動:

service squid start

注:
Squid 也可以在系統啓動的時候自動運行,方法是在 ntsysv 或 setup(系統服務菜單)中打開 Squid。在
對配置文件做了任何更改之後,當前正運行的 Squid 進程必須重新啓動。可以用下面的命令來完成:
  1. service squid restart 或
  2. /etc/rc.d/init.d/squid restart
 

配置客戶端

由於客戶端的請求是送到代理服務器的特定端口的,因此,客戶端也要做相應配置。在繼續下一步之前,請
確認要訪問代理服務器的客戶端已經連接在局域網中並已分配了有效的 IP 地址,請確認它們都能 ping 通
運行了 Squid 的 Linux 服務器。
在 Internet Explorer 下的配置:
  1. 點擊菜單上的 工具 -> Internet 選項
  2. 選擇 連接 並單擊 局域網設置
  3. 選中 使用代理服務器 輸入上述代理服務器的 IP 地址和端口。

在 Netscape Navigator 下的配置:
  1. 點擊菜單上的編輯(Edit)->首選項(Preference)->高級(Advanced)->代理服務器(Proxies)。
  2. 選中手動配置代理服務器(Manual Proxy Configuration)。
  3. 點擊查看(View) 並
  4. 輸入上述代理服務器的 IP 地址和端口。
 

使用訪問控制

多個訪問控制及其規則爲客戶端訪問控制提供了一種靈活的機制。下面給出通常所用到的例子:
  1. 允許列表中的機器訪問 Internet。

    acl allowed_clients src 192.168.0.10 192.168.0.20 192.168.0.30
    http_access allow allowed_clients
    http_access deny !allowed_clients

    這個規則只允許 IP 地址爲 192.168.0.10、192.168.0.20 及 192.168.0.30 的機器
    訪問 Internet,其他 IP 地址的機器則都被拒絕訪問。

  2. 限制訪問時段。

    acl allowed_clients src 192.168.0.1/255.255.255.0
    acl regular_days time MTWHF 10:00-16:00
    http_access allow allowed_clients regular_days
    http_access deny !allowed_clients

    這個規則允許子網192.168.0.1中的所有客戶機在週一到週五的上午10:00到下午4:00
    訪問 Internet。

  3. 爲不同的客戶機分配不同的訪問時段。

    acl hosts1 src192.168.0.10
    acl hosts2 src 192.168.0.20
    acl hosts3 src 192.168.0.30
    acl morning time 10:00-13:00
    acl lunch time 13:30-14:30
    acl evening time 15:00-18:00
    http_access allow host1 morning
    http_access allow host1 evening
    http_access allow host2 lunch
    http_access allow host3 evening
    http_access deny all

    在這個規則中,主機 host1 可以在 morning 和 evening 時段訪問 Internet,主機
    host2 和 host3 分別只能在 lunch 和 evening 時段訪問 Internet。

    注:
    一個訪問條目中所有的元素之間用與運算按下述方式連接 :

    http_access Action statement1 AND staement2 AND statement OR.

    多個 http_access 聲明之間用或運算連接而每個訪問條目中的元素用與運算連接,見
    下:

    http_access allow host1 morning evening

    無法在時段 morning 和時段 evening 同時進行(morning AND evening ),這個表達
    式將不會返回真值(TRUE),從而這個條目將不會引發任何動作。

  4. 站點屏蔽
    Squid 可以屏蔽某些特定站點或含有某些特定字詞的站點。可以用下面的規則實現:

    acl allowed_clients src 192.168.0.1/255.255.255.0
    acl banned_sites url_regex abc.com *()(*.com
    http_access deny banned_sites
    http_access allow allowed_clients

    也可以用以屏蔽含有某些特定字詞(比如說 dummy、fake)的站點

    acl allowed_clients src 192.168.0.1/255.255.255.0
    acl banned_sites url_regex dummy fake
    http_access deny banned_sites
    http_access allow allowed_machibes

    在實際應用中,不需要把需屏蔽的所有站點或字詞都列在上面,可以先保存在一個文件
    中(請查看 /etc 目錄中的 banned.list文件)ACL 將從這個文件中讀出所需信息用以
    屏蔽被禁止的站點。

    acl allowed_clients src 192.168.0.1/255.255.255.0
    acl banned_sites url_regex "/etc/banned.list"
    http_access deny banned_sites
    http_access allow allowed_clients

  5. 優化
    Squid 可以通過使用 maxconn 元素來限制客戶端連接的數目。 要使用這個選項,必須
    先允許 client_db。

    acl mynetwork 192.168.0.1/255.255.255.0
    acl numconn maxconn 5
    http_access deny mynetwork numconn

    注:
    maxconn ACL 使用小於(less-than)對比。此 ACL 規則將在連接數大於設定值時被匹配。
    這是 ACL 不與 http_access 允許規則連用的主要原因。

  6. 緩存數據
    對於靜態頁面,緩存的數據能夠立刻回送到發出請求的客戶端。沒有必要去緩存 cgi-bin
    或 Servlet,這些可以用 ACL 元素 no_cache 來禁止。

    acl cache_prevent1 url_regex cgi-bin /?
    acl cache_prevent2 url_regex Servlet
    no_cache deny cache_prevent1
    no_cache deny cache_prevent2

  7. 自定錯誤反饋信息
    可以用拒絕規則的 deny_info 選項來自定錯誤反饋信息。Squid 默認的錯誤信息放在
    /etc/squid/errors 目錄中。這個目錄可以用 error_directory 選項指定。您也可以
    定製現存的錯誤反饋信息。

    acl allowed_clients src 192.168.0.1/255.255.255.0
    acl banned_sites url_regex abc.com *()(*.com
    http_access deny banned_sites
    deny_info ERR_BANNED_SITE banned_sites
    http_access allow allowed_clients

    在上面的例子中,當用戶試圖訪問被禁止的站點時,將會顯示一條定製的信息。
    ERR_BANNED_SITE 選項中的文件名必須在上述的錯誤信息的目錄中。錯誤信息必須是 HTML 格
    式的。上面列出了 ACL 的一些選項,您可以參看 Squid 主頁上的 FAQ 文檔 以獲得使用 ACL
    更多的信息。
 

日誌

Squid 的所有日誌文件都存放在 /var/log/squid 目錄中,有緩存日誌、訪問日誌和 store.log文件。文
件 access.log 記錄了有關客戶機的請求、連接活動、每個 HTTP & ICP 詢問、客戶機 IP 地址、請求方
式、請求的 URL 等等信息。這些數據可以用來對訪問進行分析。許多程序如 sargcalamaris, Squid-Log-Analyzer 都可以用來分析這些數據併產生 HTML 格式的分析報告。 這些報告可以在一組用戶、一組
IP 地址或一組訪問過的站點等等記錄中產生。

這些記錄文件也可以成爲下面這樣:
cache_access_log      For access.log
cache_log             For cache.log
cache_store_log       For store.log (Store manager)
pid_filename          Squid process ID file name
 

驗證方式

Squid 的默認配置允許任何用戶不經過驗證過程就可以進行訪問。Squid 通過一個外部程序提供用戶驗證
功能(比如說只允許有效的用戶訪問 Internet),這就需要一個有效的用戶名和密碼。可以用 proxy_auth
ACL 和 authenticate_program 來實現,在允許訪問前強制進行用戶名和密碼的核查。下面列出一些 Squid
能用到的驗證程序:
  1. LDAP : 使用 Linux Lightweight 目錄訪問協議(Linux Lightweight Directory Access Protocol)
  2. NCSA : 使用 NCSA 風格的用戶名和密碼檔
  3. SMB : 使用 SMB 協議的服務,如 SAMBA 或 Windows NT
  4. MSNT : 使用 Windows NT 的域驗證
  5. PAM : 使用 Linux 的可裝載驗證模塊
  6. getpwam : 使用 Linux 密碼檔
必須指定使用的驗證程序,可以用 authenticate_program 選項完成。請確認選定的驗證程序已安裝並能很
好的工作。

修改 squid.conf 文件選定驗證程序
authenticate_program /usr/local/bin/pam_auth

acl pass proxy_auth REQUIRED
acl mynetwork src 192.168.0.1/255.255.255.0
http_access deny !mynetwork
http_access allow pass
http_access deny all

這個規則表示,使用 PAM 驗證程序,所有用戶在獲得訪問許可前必須進行驗證。

還有些選項比如 authenticate_ttl 和 authenticate_ip_ttl,可以用來改變驗證程序的動作,比如說使某個用戶名及密碼重新生效。  

參考資料

本文僅僅初窺了 Squid 的冰山一角,更多的參考資料可以在下面的站點找到:
發佈了80 篇原創文章 · 獲贊 0 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章