Squid是Linux下最為流行的代理服務器軟件,它功能強大,支持對HTTP、FTP、Gopher、SSL、WAIS等協議的代理; 設置簡單,只需對配置文件稍稍改動就可使代理服務器運轉起來。此外,Squid具有頁面緩存功能,它接受用戶的下載申請,並自動處理所下載的數據。
前期准備
Squid對硬件的要求是: 內存不應小於128M,硬盤轉速越快越好,最好使用服務器專用SCSI硬盤,對CPU的要求不高,400MHz以上即可。筆者所管理的代理服務器是 Inter2150,安裝了Red Hat Linux 7.2,安裝時就帶有Squid。有兩塊網卡,一塊eth0配外部地址(比如211.88.99.66),一塊eth1配內網地址(比如 192.168.5.1)。如果安裝了Gnome或其他圖形界面,就可以在netconfig中給兩塊網卡配置IP地址,不然的話,可在 /etc/sysconfig/network-script路徑下更改文件ifcfg-eth0和ifcfg-eth1。
首先編輯ifcfg-eht0,有以下幾項:
DEVICE=eth0 (表示用哪塊網卡)
IPADDR=211.88.99.66 (設置該網卡的IP地址)
NETMASK=255.255.255.252 (設置子網掩碼)
同樣編輯ifcfg-eth1,然後運行命令network restart就可以使配置生效了。對eth0、eth1進行配置後,可以用ifconfig命令來查看是不是配置成功。
如果服務器只有一張網卡,也不用擔心,Linux可以在一塊網卡上綁定多個IP地址。在圖形界面下配置很簡單,不贅述。如果在文本狀態下配置,可以將ifcfg-eth0復制並命名為ifcfg-eth0:1,把它完全當成兩塊網卡來配就可以了。
Squid的安裝
1. 安裝Linux
安裝Linux在硬盤分區時要注意,最好不要讓系統自己分區,而是手動分區。通常,在Linux系統中有且僅有一個交換分區(在文件系統形式中選擇 Linux swap),它用做虛擬內存,建議將交換分區的大小設置為內存的兩倍。當硬盤的大小超過了8G,要再建立一個128M(稍稍大一點,不會出錯)的boot 分區,這是為了避免將系統內核文件放到1024磁道以外,如果將boot作為root分區的一個子目錄,內核文件就會安裝在root分區的任何地方。因為要用做代理服務器,建議再分一個分區“var”,作為Squid的緩沖區,所以根據磁盤大小盡量分配大一點,最後將硬盤的剩余空間全部分給root分區。
2. 安裝Squid
新手安裝Squid,建議在安裝Linux時就選中Squid,它並不是默認選中項,而且也不在選擇的大類中,要在詳細列表中查找。如果沒有安裝,又不想重裝系統,可以從www.squid-cache.org 下載Squid軟件。
Squid代理服務器的設置
安裝好Squid後幾乎就可以用了,用編輯器打開/etc/squid/squid.conf文件(以root登錄),Squid的配置文件共有125個配置項,但是一般來說,只要修改幾個配置項即可。找到“http_Access deny all”並改為“http_access allow all”令所有的電腦都能通過代理服務訪問互聯網資源。其實只要修改該項,Squid服務就可以啟動了。
為了更好地控制代理服務器的行為,還有幾個可配置項需要考慮:
1. cache_mem: 設置代理服務使用的內存大小,一般推薦為物理內存的三分之一。
2. cache_dir:設定緩存的位置、大小。一般格式如下:
cache_dir /var/spool/squid/cache 100 16 256
cache_dir指定cache目錄的路徑,默認為/var/spool/squid/cache。
/var/spool/squid/cache代表緩存的位置,使用squid -z指令會在這個目錄下建立存儲交換文件(swap files)的目錄。100表示緩存最大為100M,16和256代表一級和二級目錄數。實際使用時,100M是不夠的,如果硬盤夠大,可以增加存儲空間,比如:cache_dir /var/spool/squid/cache 2000 16 256。
3. http_port:代理服務使用的端口號,默認為3128,可以使用其他的端口,注意將前面的注釋符號“#”去掉。另外,使用端口不能和其他的服務重復,如果使用1024以下的端口,Squid必須以root身份運行。
4. maximum_object_size: 指定Squid可以接收的最大對象的大小。Squid缺省值為4M,可以根據自己的需要進行設定。
啟動Squid
Squid可以設置為自動啟動。運行命令setup,在System services選項中選中Squid。設置後每次重新開機,都會自動執行Squid。
如果是第一次啟動,要建立/var/spool/squid下的暫存資料目錄,先輸入squid -z,再啟動Squid(直接運行Squid即可)。
啟動Squid後,在另一台Windows電腦上(以Internet EXPlorer 5.0為例)運行IE,單擊“工具”,接著單擊“Internet選項”,再單擊“連接”選項卡,選擇“局域網設置”。在“局域網設置”窗口中的“地址” 處填上Squid服務器的IP地址,在“端口”處填上“3218”(Squid軟件默認代理的端口號),確定後退出。接下來,隨意浏覽一些網站檢查 Squid的運行情況,也可以查看logs下的access.log和cache.log,看看代理是否運行正常。
代理服務器的安全
代理服務器是一個單位對外的門戶,安全至關重要。因此,應該采取必要的防護手段。
1. 防火牆的配置
為了保證代理服務器的安全,最好加上防火牆,可以用IPchains或IPtable。
要使用ftp代理,還必須載入相關模塊。可以使用以下命令:
modprobe ip_comtrack_ftp
modprobe命令會自動載入指定模塊及其相關模塊。iptables_filter模塊會在運行時自動載入。
下面用IPtables一步一步地來建立包過濾防火牆,需要說明的是,在這個例子中,主要是對內部的各種服務器提供保護。
給IPtables規則設置一個存儲路徑: iptables -restroe /etc/sysconfig/iptables。
現在開始考慮規則。在這裡需要注意的是,服務器/客戶機交互是雙向的,所以不僅僅要設置數據包出去的規則,還要設置數據包返回的規則,下面先建立針對來自Internet數據包的過濾規則。
1. 首先禁止轉發任何包,然後再一步步設置允許通過的包。
2. 先允許源為內網的所有端口的TCP包。
3. 再允許目的為內部網(192.168.5.0/24)的FTP數據包。
4. 允許目的為內網的來自Internet的非連接請求TCP包。
5. 最後一條接收所有UDP包,主要是針對oicq等使用UDP的服務。
6. icmp包通常用於網絡測試等,故允許所有的icmp包通過。但是黑客常常采用icmp進行攻擊,如“ping of death”等,所以我們采用limit匹配擴展加以限制。對不管來自哪裡的icmp包都進行限制,允許每秒通過一個包,該限制觸發的條件是10個包。
不需要允許WWW服務的包,所有WWW服務由Squid代理。
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 198.168.5.2 -i eth0 -j ACCEPT
iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.5.0/24 -i eth0 -j ACCEPT
iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
說明:
-A加入(append) 一個新規則到一個鏈 (-A)的最後。(用-I可以插入一條規則,插入位置序號寫在Forward後,-D在鏈內某個位置刪除(delete) 一條規則,-R在鏈內某個位置替換(replace) 一條規則 )。
Forward鏈、Input鏈和Output鏈的區別如下:
1. 如果數據包的目的地址是本機,則系統將數據包送往Input鏈。如果通過規則檢查,則該包被發給相應的本地進程處理;如果沒有通過規則檢查,系統就會將這個包丟掉。
2. 如果數據包的目的地址不是本機,也就是說,這個包將被轉發,則系統將數據包送往Forward鏈。如果通過規則檢查,則該包被發給相應的本地進程處理; 如果沒有通過規則檢查,系統就會將這個包丟掉。
3. 如果數據包是由本地系統進程產生的,則系統將其送往Output鏈。如果通過規則檢查,則該包被發給相應的本地進程處理;如果沒有通過規則檢查,系統就會將這個包丟掉。
-s指定源地址,-d指定目的地址。
-p 指定協議,比如-p tcp。
-i或-o指定網絡接口。需要注意的是,對於Input鏈來說,只可能有-i,也即只會有進入的包;同理,對於Output鏈來說,只可能有-o,也即只會有出去的包。只有Forward鏈既可以有-i的網絡接口,也可以有-o的網絡接口。
Drop表示符合規則就丟棄包,Accept相反。
然後,執行命令IPtables -L,可以查看已經建立的規則,並用命令IPtables -save將規則寫入文件。
通過以上步驟,我們建立了一個相對完整的防火牆,只對外開放了有限的幾個端口,同時提供了客戶對Internet的無縫訪問。
2. 其他建議
為了安全,最好不要在一台機器上運行太多服務。為了方便調試,一般都會提供telnet和ftp服務,但這往往是安全隱患,可以在 /etc/host.allow和/etc/host.deny中進行限制。比如:局域網的內網網段為: 192.168.0.0,可以在hosts.allow文件中加入一行: telnet:192.168.0.0/255.255.0.0。在hosts.deny中加入一行:all:all。因為是先執行 host.allow,再執行host.deny。所以上面就只打開了內網網段的telnet服務,而對外關閉。如果想打開其他服務,可以再加。如果還想加上機器名,可以在IP後加上“@abc”(abc代表某機器名)。想關閉所有服務、所有IP、所有機器名,可以在host.deny中寫上“all: all@all”。配置好了運行命令xinetd.d,配置就生效了。如果想遠程訪問代理服務器,最好用SSH(因為telnet是明碼傳送,所以很不安全,SSH可以理解為加密的telnet),它的配置和應用比較簡單,不贅述。
通過以上步驟,我們建立了一個相對完整的防火牆,只對外開放了有限的幾個端口,同時提供了客戶對Internet的無縫訪問。
2. 其他建議
為了安全,最好不要在一台機器上運行太多服務。為了方便調試,一般都會提供telnet和ftp服務,但這往往是安全隱患,可以在 /etc/host.allow和/etc/host.deny中進行限制。比如:局域網的內網網段為: 192.168.0.0,可以在hosts.allow文件中加入一行: telnet:192.168.0.0/255.255.0.0。在hosts.deny中加入一行:all:all。因為是先執行 host.allow,再執行host.deny。所以上面就只打開了內網網段的telnet服務,而對外關閉。如果想打開其他服務,可以再加。如果還想加上機器名,可以在IP後加上“@abc”(abc代表某機器名)。想關閉所有服務、所有IP、所有機器名,可以在host.deny中寫上“all: all@all”。配置好了運行命令xinetd.d,配置就生效了。如果想遠程訪問代理服務器,最好用SSH(因為telnet是明碼傳送,所以很不安全,SSH可以理解為加密的telnet),它的配置和應用比較簡單,不贅述。