## 17.2 Proxy 服務器的基礎設定
雖然在我們小型的網絡環境中,架設 Proxy 真的沒有什么用,不過,考慮到大家未來可能會高升嘛!所以企業常用的 Proxy 也需要了解一下比較好。 在這個小節中,我們主要介紹一個比較簡單的 Proxy 環境,就是單純可以跑而已的代理服務器。比較高階的設定請參考后續小節的介紹啰。
* * *
### 17.2.1 Proxy 所需的 squid 軟件及其軟件結構
達成代理服務器功能的軟件很多,例如效能不是很好的 Apache 以及我們這個章節要介紹的八爪章魚 squid 這一套。 目前代理服務器在 Unix Like 的環境下,大多就是使用 squid ,因此我們這里以 squid 為準來介紹啦。同樣的, 請使用 rpm 來檢查,如果尚未安裝,請用『 yum install squid 』來安裝吧!安裝好 squid 之后,它主要的提供的配置文件有:
* /etc/squid/squid.conf
這個是主要的配置文件,所有 squid 所需要的設定都是放置在這個檔案當中的! 鳥哥底下提到的種種設定方法幾乎都是這個檔案里面的說明喔!
* /etc/squid/mime.conf
這個檔案則是在設定 squid 所支持的 Internet 上面的文件格式,就是所謂的 mime 格式啰! 一般來說,這個檔案的預設內容已經能夠符合我們的需求了,所以不需要更動他,除非你很清楚的知道你所需要額外支持的 mime 文件格式。
其他重要的目錄與檔案有:
* /usr/sbin/squid:提供 squid 的主程序啊!
* /var/spool/squid:就是默認的 squid 快取放置的目錄。
* /usr/lib64/squid/:提供 squid 額外的控制模塊,尤其是影響認證密碼方面的程序,都是放在這個目錄下的;
* * *
### 17.2.2 CentOS 預設的 squid 設定
在預設的情況下,CentOS 的 squid 具有底下幾個特色:
* 僅有本機 (localhost, 127.0.0.1) 來源可以使用這個 squid 功能
* squid 所監聽的 Proxy 服務埠口在 port 3128
* 快取目錄所在的位置在 /var/spool/squid/ ,且僅有 100MB 的磁盤高速緩存量
* 除了 squid 程序所需要的基本內存之外,尚提供 8MB 的內存來給熱門檔案快取在內存中 (因為內存速度比硬盤還快)
* 默認啟動 squid 程序的用戶為 squid 這個賬號 (與磁盤高速緩存目錄權限有關)
其實, CentOS 預設的 squid 設定,是僅針對本機 (localhost) 開放的情況,而一大堆設定的默認值, 都是僅針對小型網絡環境所指定的數值,同時,很多比較特殊的參數都沒有啟動。所以,我們就得要來了解一下各設定值的意義, 這樣才能夠進行修改嘛!這些參數都是在 squid.conf 里頭指定的,所以,就讓我們來看看這個檔案的內容與較重要的參數吧:
**Tips:** CentOS 6.x 已經將 squid.conf 里面不相干的設定值通通拿掉了,所以這個檔案就變的非常的精簡!這樣其實有好有壞啦! 好處是,你不用去看一些你用不到的參數值,壞處是,如果你想要其他的設定,就得額外參考外部文件了!傷腦筋~

```
[root@www ~]# vim /etc/squid/squid.conf
# 1\. 信任用戶與目標控制,透過 acl 定義出 localhost 等相關用戶
acl manager proto cache_object <==定義 manager 為管理功能
acl localhost src 127.0.0.1/32 <==定義 localhost 為本機來源
acl localhost src ::1/128
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 <==定義 to_localhost 可聯機到本機
acl to_localhost dst ::1/128
# 2\. 信任用戶與目標控制,定義可能使用這部 proxy 的外部用戶(內網)
acl localnet src 10.0.0.0/8 <==可發現底下都是 private IP 的設定
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10
# 上述數據設定兩個用戶 (localhost, localnet) 與一個可取得目標 (to_localhost)
# 3\. 定義可取得的數據端口所在!
acl SSL_ports port 443 <==聯機加密的埠口設定
acl Safe_ports port 80 # http <==公認標準的協議使用埠口
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
# 定義出 SSL_ports 及標準的常用埠口 Safe_ports 兩個名稱
# 4\. 定義這些名稱是否可放行的標準依據(有順序喔!)
http_access allow manager localhost <==放行管理本機的功能
http_access deny manager <==其他管理來源都予以拒絕
http_access deny !Safe_ports <==拒絕非正規的埠口聯機要求
http_access deny CONNECT !SSL_ports <==拒絕非正規的加密埠口聯機要求
<==這個位置為你可以寫入自己的規則的位置喔!不要寫錯了!有順序之分的!
http_access allow localnet <==放行內部網絡的用戶來源
http_access allow localhost <==放行本機的使用
http_access deny all <==全部都予以拒絕啦!
# 5\. 網絡相關參數,最重要的是那個定義 Proxy 協議埠口的 http_port
http_port 3128 <==Proxy 預設的監聽客戶端要求的埠口,是可以改的
# 其實,如果想讓 proxy server/client 之間的聯機加密,可以改用 https_port (923)
# 6\. 快取與內存相關參數的設定值,尤其注意內存的計算方式
hierarchy_stoplist cgi-bin ? <==hierarchy_stoplist 后面的關鍵詞 (此例為 cgi-bin)
# 若發現在客戶端所需要的網址列,則不快取 (避免經常變動的數據庫或程序訊息)
cache_mem 8 MB <==給proxy額外的內存,用來處理最熱門的快取數據(需自己加)
# 7\. 磁盤高速緩存,亦即放置快取數據的目錄所在與相關設定
cache_dir ufs /var/spool/squid 100 16 256 <==默認使用 100MB 的容量放置快取
coredump_dir /var/spool/squid
# 底下的四個參數得要自己加上來喔!舊版才有這樣的默認值!
minimum_object_size 0 KB <==小于多少 KB 的數據不要放快取,0 為不限制
maximum_object_size 4096 KB <==與上頭相反,大于 4 MB 的數據就不快取到磁盤
cache_swap_low 90 <==與下一行有關,減低到剩下 90% 的磁盤高速緩存為止
cache_swap_high 95 <==當磁盤使用量超過 95% 就開始刪除磁盤中的舊快取
# 8\. 其他可能會用到的默認值!參考參考即可,并不會出現在配置文件中。
access_log /var/log/squid/access.log squid <==曾經使用過 squid 的用戶記錄
ftp_user Squid@ <==當以 Proxy 進行 FTP 代理匿名登錄時,使用的賬號名稱
ftp_passive on <==若有代理 FTP 服務,使用被動式聯機
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
# 上面這四行與快取的存在時間有關,底下內文會予以說明
cache_mgr root <==預設的 proxy 管理員的 email
cache_effective_user squid <==啟動 squid PID 的擁有者
cache_effective_group squid <==啟動 squid PID 的群組
# visible_hostname <==有時由于 DNS 的問題,找不到主機名會出錯,就得加上此設定
ipcache_size 1024 <==以下三個為指定 IP 進行快取的設定值
ipcache_low 90
ipcache_high 95
```
光是了解上述的一些基礎設定值,可能就要頭昏昏了,更別說 squid.conf 里面的其他設定值,看到頭好昏... 無論如何,上述這些設定已經是很基礎的設定了,你最好了解一下!除了 cache_dir 那一行取消批注,其他的保持不動! 讓我們以默認值來直接啟動 squid 看看有什么特別的地方再說。
* 使用默認值來啟動 squid 并觀察相關信息
要啟動 squid 真是簡單,讓我們來啟動 squid 并且觀察有沒有相關的埠口吧!
```
[root@www ~]# /etc/init.d/squid start
init_cache_dir /var/spool/squid... 正在激活 squid: . [ 確定 ]
# 第一次啟動會初始化快取目錄,因此會出現上述左邊的數據,未來這個訊息不會再出現
[root@www ~]# netstat -tulnp | grep squid
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::3128 :::* LISTEN 2370/(squid)
udp 0 0 :::45470 :::* 2370/(squid)
[root@www ~]# chkconfig squid on
```
如果你有設定 icp_port 時,squid 預設會啟動 3128 及 3130 兩個埠口,其中要注意的是, 實際幫用戶進行監聽與傳送數據的是 port 3128 (TCP),3130 (UDP) 僅是負責與鄰近 Proxy 互相溝通彼此的快取數據庫的功能,與實際的用戶要求無關。因此,如果你的 proxy 是單純的單一主機,或者是單純的作為防火墻功能,那么這個 port 3130 是可以關閉的。就因如此,所以 CentOS 6.x 預設將這個設定值批注不使用啰!
例題:由于我的 Proxy 僅是部簡單的單一代理服務器,并沒有架設成為公開的鄰近代理服務器 (peer proxy 或 neighbor proxy), 因此想要關閉 port 3130 ,該如何處理?答:舊版的 CentOS 5.x 以前的版本才需要進行,很簡單,直接修改 icp_port 即可!方法為:
```
[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,將下列數據從 3130 改為 0 即可
icp_port 0
[root@www ~]# /etc/init.d/squid restart
```
事實上,如果你的客戶端與 proxy 之間的溝通想要使用加密機制的 SSL 功能,以保障客戶端的信息避免被竊取時, 那么還有個 https_port 可以取代 http_port !不過,充其量我們的 proxy 并非公開也僅是架設在內部區網, 因此還不需要使用到這個 https_port 啦!
* 觀察與修改快取目錄 (cache_dir):權限與 SELinux
從前面的說明我們知道磁盤高速緩存是影響 proxy 效能的一個相當重要的參數,那么 squid 是如何將快取存進磁盤的呢? squid 是將數據分成一小塊一小塊,然后分別放置到個別的目錄中。由于較多的目錄可以節省在同一個目錄內找好多檔案的時間 (想一想,分門別類的放置書籍在不同的書柜內,總比將所有書籍雜亂無章的放置到一個大書柜要好的多吧!), 因此,在默認的 /var/spool/squid/ 目錄下, squid 又會將它分成兩層子目錄來存放相關的快取數據,所以觀察該目錄就會是:
```
[root@www ~]# ls /var/spool/squid
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F swap.state
# 算一下,你會發現共有 16 個子目錄!那么我們來看看第一個子目錄的內容:
[root@www ~]# ls /var/spool/squid/00
00 08 10 18 20 28 ... 98 A0 A8 B0 B8 C0 C8 D0 D8 E0 E8 F0 F8
01 09 11 19 21 29 ... 99 A1 A9 B1 B9 C1 C9 D1 D9 E1 E9 F1 F9
....(中間省略)....
06 0E 16 1E 26 2E ... 9E A6 AE B6 BE C6 CE D6 DE E6 EE F6 FE
07 0F 17 1F 27 2F ... 9F A7 AF B7 BF C7 CF D7 DF E7 EF F7 FF
# 看見了嗎?總共有 256 個子目錄出現啰!
```
現在我們知道了較多的目錄是為了將數據分門別類放置,但是第一層 16 個與第二層 256 個是怎么來的? 讓我們來瞧一瞧 cache_dir 這個重要參數的設定是怎樣:
* cache_dir ufs /var/spool/squid 100 16 256
在 /var/spool/squid/ 后面的參數意義是:
* 第一個 100 代表的是磁盤使用量僅用掉該文件系統的 100MB
* 第二個 16 代表第一層次目錄共有 16 個
* 第三個 256 代表每層次目錄內部再分為 256 個次目錄
根據 squid 的說法與其他文獻的說明,這兩層快取目錄較佳的配置就是 16 256 以及 64 64 這兩種配置, 所以我們也不需要修改相關的數據啦!重點時還得要注意這個目錄的檔案擁有者與 SELinux 類型才成呦!
例題:看起來預設的 proxy 的磁盤高速緩存應該是不夠用,而之前的磁盤規劃又沒有做好,因此 /var/ 最多還有 500MB 可以讓我們做為磁盤高速緩存。 那么如果想要將預設的磁盤高速緩存改為 500MB 而且再加上 /srv/squid/ 目錄給予 2GB 的容量做為磁盤高速緩存,該如何進行設定?答:這里都與 cache_dir 有關!這個設定值可以重復出現多次!因此,我們可以這樣進行的,特別注意底下的目錄權限與 SELinux 類型呦!
```
[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,底下的設定除了拿掉 # 之外還得修改!
cache_dir ufs /var/spool/squid 500 16 256
cache_dir ufs /srv/squid 2000 16 256
[root@www ~]# mkdir /srv/squid
[root@www ~]# chmod 750 /srv/squid
[root@www ~]# chown squid:squid /srv/squid
[root@www ~]# chcon --reference /var/spool/squid /srv/squid
[root@www ~]# ll -Zd /srv/squid
drwxr-x---. squid squid system_u:object_r:squid_cache_t:s0 /srv/squid/
[root@www ~]# /etc/init.d/squid restart
```
之所以要改成 squid 擁有,是因為上頭的 squid.conf 中,預設的啟動 PID 的賬號就是 squid 這個人物嘛!所以當然要變更!至于 SELinux 的類型方面,參考預設的 /var/spool/squid 就能夠知道了。不過要注意,某些特定的目錄 (例如 /home) 是不允許建立快取目錄的, 因此我們使用服務資料可以放置的 /srv 作為測試范例啰!
想一想,既然快取是放在磁盤上面的,那么快取的數據會不會塞滿整個快取磁盤呢?當然會啊!而且當塞滿磁盤之后, 你的 proxy 恐怕就無法繼續運作了!所以,我們當然得要好好的注意磁盤使用量是否已經飽和了。在上述的例題中, 若 /var/spool/squid 塞滿 500MB 而 /srv/squid 塞滿 2GB 那么你的 proxy 就掛了。為了避免這個問題,因此 squid 有底下兩個重要設定:
* cache_swap_low 90
* cache_swap_high 95
代表當磁盤使用量達 95% 時,比較舊的快取數據將會被刪除,當刪除到剩下磁盤使用量達 90% 時,就停止持續刪除的動作。 以本案例中,總共 2.5GB 的容量,當用到 2.5*0.95=2.375G 時,舊的數據會開始被刪除,刪到剩下 2.5*0.9=2.25GB 時,就停止刪除的意思。所以會被刪除掉 125MB 的舊數據就是了。通常這個設定值已經足夠了,不需要變動他, 除了你的快取太大或太小時,才會調整這個設定值。
* squid 使用的內存計算方式
事實上,除了磁盤容量之外,內存可能是另一個相當重要的影響 proxy 效能的因子!怎么說呢?因為 proxy 會將數據存一份在磁盤高速緩存中,但是同時也會將數據暫存在內存當中啊,以加快未來使用者存取同一份數據的速度! 但是這個內存快取是需要花費額外的服務器物理內存的量,所以就得要以額外的設定值來指定啰。那就是 cache_mem 這個設定值的功能了。
很多人 (包括鳥哥) 都會誤會 cache_mem 的用途!其實 cache_mem 是額外的指定一些內存來進行比較『熱門』的數據存取! cache_mem 并不是指我要使用多少內存給 squid 使用,而是指 "我還要額外提供多少內存給 squid 使用" 的意思』!由于預設 1GB 的磁盤高速緩存會占用約 10M 的內存,而 squid 本身也會占用約 15MB 的內存, 因此,上個例題中 squid 使用掉的內存就有:
* 2.5 * 10 + 15 + "cache_mem 設定值 (8)"
squid 官方網站建議你的物理內存最好是上面數值的兩倍,也就是說,上述的內存使用量已經是 48MB, 則我的物理內存最好至少要有 100 MB 以上,才會有比較好的效能!當然,這個單指 Proxy 部分而已,如果你的該部主機還有負責其他的工作,呵呵!那么內存就得在累加上去啦!一般來說,如果你的 Proxy 很多人使用時,這個值越大越好,但是最好也要符合上面的需求喔!
例題:由于我的內存夠大,而 proxy 確實是我重要的服務,因此想要增加額外的 32MB 作為熱門數據快取,該如何修改?答:直接做了啦!就是修改 cache_mem 而已!
```
[root@www ~]# vim /etc/squid/squid.conf
#Default: VBird 2011/04/06 modified,將原本的 8 改為 32 啰!
cache_mem 32 MB
[root@www ~]# /etc/init.d/squid restart
```
* * *
### 17.2.3 管控信任來源 (如區網) 與目標 (如惡意網站): acl 與 http_access 的使用
在上面的基礎設定中,其實僅有 proxy 服務器本身可以向自己的 proxy 要求網頁代理~那有個屁用啊? 我們的重點是想要開放給區網來使用這個 proxy 的嘛!所以當然得要修改信任用戶的管控參數啰。 此時,那個重要到不行的 acl 就得要來瞧一瞧啦!這個 acl 的基本語法為:
```
acl <自定義的 acl 名稱> <要控制的 acl 類型> <設定的內容>
```
由于 squid 并不會直接使用 IP 或網域來管控信任目標,而是透過 acl 名稱來管理,這個 <acl 名稱> 就必須要設定管理的是來源還是目標 (acl 類型) ,以及實際的 IP 或網域 (設定的內容) 啦!這個 acl 名稱可以想成是一個昵稱就是了。那么有哪些重要的 acl 類型呢?基本上有這些:
* 管理是否能使用 proxy 的信任客戶端方式:
由于因特網主要有使用 IP 或主機名來作為聯機方式的,因此信任用戶的來源至少就有底下幾種:
* src ip-address/netmask:
主要控制『來源的 IP 地址』。舉例來說,鳥哥的內網有兩個,分別是 192.168.1.0/24 以及 192.168.100.0/24 , 那么假設我想要制訂一個 vbirdlan 的 acl 名稱,那就可以在配置文件內寫成:
acl vbirdlan src 192.168.1.0/24 192.168.100.0/24
* src addr1-addr2/netmask:
主要控制『一段范圍來源的 IP 地址』。假設我只想要讓 192.168.1.100-192.168.1.200 使用這部 proxy ,那么就用:
acl vbirdlan2 src 192.168.1.100-192.168.1.200/24
* srcdomain .domain.name:
如果來源用戶的 IP 一直變,所以使用的是 DDNS 的方式來更新主機名與 IP 的對應,此時我們可以使用主機名來開放! 例如來源是 .ksu.edu.tw 的來源用戶就開放使用權,那就是:
acl vbirdksu srcdomain .ksu.edu.tw
* 管理是否讓 proxy 幫忙代理到該目標去獲取數據:
除了管理來源用戶之外,我們還能夠管理是否讓 proxy 服務器到某些目標去獲取數據喔!在預設的設定中, 我們的 proxy 僅管理可以向外取得 port 21, 80, 440... 等端口的目標網站,不是這些端口就無法幫忙代理取得。 至于 IP 或網域則沒有管理。基本的管理有這些方式:
* dst ip-addr/netmask:
控制不能去的目標網站的 IP ,舉例來說,我們不許 proxy 去捉取 120.114.150.21 這部主機的 IP 時,可以寫成是:
acl dropip dst 120.114.150.21/32
* dstdomain .domain.name:
控制不能去的目標網站的主機名。舉例來說,如果你在上課時不允許學生跑去種田還是小小戰爭,那就得要把 .facebook.com 給關閉!那就需要寫成:
acl dropfb dstdomain .facebook.com
* url_regex [-i] ^http://url:
使用正規表示法來處理網址列的一種方式!這種方式的網址列必須要完整的輸入正規表示法的開始到結尾才行。 舉例來說,昆山科大的中文網頁寫法為 (并非部分比對,所以最結尾的 .* 記得要加上去!):
acl ksuurl url_regex ^http://www.ksu.edu.tw/cht/.*
* urlpath_regex [-i] \.gif$:
與上一個 acl 非常類似,只是上一個需要填寫完整的網址數據,這里則是根據網址列的部分比對來處置。以上述的預設案例來說, 只要網址列結尾是 gif (圖片文件) 就符合這個項目了。萬一我要找出有問題的色情網站,有出現 /sexy 名稱并以 jpg 結尾的, 就予以抵擋,那就是使用:
acl sexurl urlpath_regex /sexy.*\.jpg$
除了上述的功能之外,我們還能夠使用外部的檔案來提供相對應的 acl 內容設定值喔! 舉例來說,假設我們想要抵擋的外部主機名常常會變動,那么我們可以使用 /etc/squid/dropdomain.txt 來設定主機名, 然后透過底下的方式來處理
```
acl dropdomain dstdomain "/etc/squid/dropdomain.txt"
```
然后在 dropdomain.txt 當中,一行一個待管理的主機名,這樣也能夠減少持續修改 squid.conf 的困擾! 好了!了解了 acl 之后,接下來得要談談 http_access 這個實際放行或拒絕的參數了!
* 以 http_access 調整管理信任來源與管控目標的『順序』:
設定好 acl 之后,接下來就是要看看到底要不要放行喔~放行與否跟 http_access 這個項目有關。基本上, http_access 就是拒絕 (deny) 與允許 (allow) 兩個控件目,然后再加上 acl 名稱就能夠達到這樣的功能了! 只是你得要特別注意的是:http_access 后面接的數據,是有順序的!這個觀念很重要喔! 我們用底下的案例來說明好了:
假設我要放行內部網絡 192.168.1.0/24, 192.168.100.0/24 這兩段網域,然后拒絕對外的色情相關圖片, 以及 facebook.com 網站,那么就應該要這樣做:
```
[root@www ~]# vim /etc/squid/squid.conf
# http_access 是有順序的,因此建議你找到底下這個關鍵詞行后,將你的資料加在后面
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
acl vbirdlan src 192.168.1.0/24 192.168.100.0/24
acl dropdomain dstdomain .facebook.com
acl dropsex urlpath_regex /sexy.*jpg$
http_access deny dropdomain <==這三行的『順序』很重要!
http_access deny dropsex
http_access allow vbirdlan
[root@www ~]# /etc/init.d/squid restart
```
你得要注意,如果先放行了 vbirdlan 才抵擋 dropdomain 時,你的設定可能會失敗!因為內網已經先放行, 因此后面的規則不會比對,那么 facebook.com 就無法被抵擋了!這點得要很注意才行! 通常的作法是,先將要拒絕的寫上去,然后才寫要放行的數據就好了。
* * *
### 17.2.4 其他額外的功能項目
* 不要進行某些網頁的快取動作
從前面的說明我們知道 Proxy 的快取通常在記錄比較少變動的數據,如果是討論區或者是程控類的數據庫型態網頁, 那么恐怕就沒有快取的需要,因為數據一直變動嘛!你總不希望你發了一帖留言,結果等一下再去瀏覽時,看到的還是舊留言吧! 所以啰,在預設的情況下,squid 已經拒絕某些數據的快取了,那就是底下的幾個設定值:
```
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY <==重點就是這一行!可以拒絕,不要讓后面的 URL 被快取!
```
我們知道通常 .php 結尾的網頁大部分就是討論區之類的變動性數據,那么能不能出現 .php 結尾的網頁就不要快取呢? 當然可以啊!那該如何進行?我們以上面的數據來照樣造句一下吧!
例題:只要網址列出現 .php 結尾的,就不予以快取!答:透過 acl 配合 cache 這兩個參數來處理即可!
```
[root@www ~]# vim /etc/squid/squid.conf
acl denyphp urlpath_regex \.php$
cache deny denyphp
# 在此檔案的最后新增這兩行即可!
[root@www ~]# /etc/init.d/squid restart
```
* 磁盤中快取的存在時間
還記得底下的設定值嗎?這個設定值的參數是這樣設定的:
```
# refresh_pattern <regex> <最小時間> <百分比> <最大時間>
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
```
* regex:使用的是正規表示法來分析網址列的資料,如上面第一行設定為網址列開頭是 ftp 的意思。
* 最小時間:單位是分鐘,當取得這個數據的時間超過這個設定值,則該數據會被判定為舊資料。如上面第一行, 表示當取得的資料超過 1440 分鐘時,該資料會被判定為舊數據,若有人嘗試讀取同樣的網址列,那么 squid 會重新抓取該數據,不會使用快取內的舊數據。至于第三行,則表示除了上述的兩個開頭數據外,其他的數據都是被定義為新的, 因此 squid 只會從快取內抓數據給客戶端。
* 百分比:這個項目與『最大時間』有關,當該資料被抓取到快取后,經過最大時間的多少百分比時,該數據就會被重抓。
* 最大時間:與上一個設定有關,就是這個數據存在快取內的最長時間。如上面第一行,最大時間為 10080 分鐘,但是當超過此時間的 20% (2016分鐘) 時,這個數據也會被判定為舊資料。
例題:在網址列出現 .vbird. 字樣時,該數據為暫時使用的,因此 2 小時后就算舊數據。而最長保留在快取給她一天的時間, 且經過 50% 的時間后,就被判定為舊數據吧!答:
```
[root@www ~]# vim /etc/squid/squid.conf
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern \.vbird\. 120 50% 1440
refresh_pattern . 0 20% 4320
[root@www ~]# /etc/init.d/squid restart
```
* 主機名與管理員的 email 指定
如果你的服務器主機名尚未決定,因此使用的主機名在因特網上面是找不到對應的 IP 的 (因為 DNS 未設定), 那么在預設的 squid 設定中,恐怕會無法順利的啟動。此時你可以手動的加入一個主機名,就是透過 visible_hostname 來指定。 同時,如果客戶端使用 squid 出現任何錯誤時,屏幕上都會出現管理員的 email 讓用戶可以回報。現在假設主機名為 www.centos.vbird 且管理員的 email 為 dmtsai@www.centos.vbird ,此時我們可以這樣修改:
```
[root@www ~]# vim /etc/squid/squid.conf
cache_mgr dmtsai@www.centos.vbird <==管理員的 email 呦!
visible_hostname www.centos.vbird <==直接設定主機名喔!
[root@www ~]# /etc/init.d/squid restart
```
* * *
### 17.2.5 安全性設定:防火墻, SELinux 與黑名單檔案
* 防火墻得要放行 tcp 的 port 3128
現在我們已經設定了讓 192.168.100.0/24 及 192.168.1.0/24 這兩段來源使用我們的 proxy server , 那么想當然爾,防火墻的設定就得要開放這兩段使用 port 3128 才行啊!不過你得要特別注意,并不是開放防火墻就能使用 proxy server 的資源,還得要使用 acl 配合 http_access 才行呦!注意注意!假設你已經使用了 iptables.rule , 那么修改的方法就是這樣:
```
[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -p tcp -s 192.168.1.0/24 --dport 3128 -j ACCEPT
# 因為內網 192.168.100.0/24 本來就是全部都接受放行的!
[root@www ~]# /usr/local/virus/iptables/iptables.rule
```
* SELinux 的注意事項
針對 proxy 來說,CentOS 6.x 倒是沒有給予太多的規則限制,因此似乎不太需要修訂規則。不過,SELinux 的安全本文在類型部分得注意。這包括配置文件 (/etc/squid/ 內的數據) 類型是 squid_conf_t 的樣式, 而快取目錄的類型則是 squid_cache_t 的類型,且上層類型 (/var/spool/) 應該是要成為 var_t 之類的才行。 修改的方法就是透過 chcon 來處理即可。
* 建立黑名單配置文件
我們在 [17.2.3](#http_access) 小節里面談到,可以透過『 dstdomain .domain.name 』來抵擋不想聯機的網站。 不過每次都得使用 root 身份來設定 squid.conf 才行。那有沒有辦法額外處理出一個檔案,讓想要拒絕聯機的數據寫入, 這樣比較容易管理,不需要一直去修改 squid.conf 嘛!有沒有辦法可以達成呢?有的,就透過特定檔案來處置即可。 看看底下這個例題來修訂一下吧:
例題:建立一個名為 /etc/squid/dropdomain.txt 的檔案,內容為拒絕聯機的目標網站。答:我們之前設定過相關的網站,處理的方法是直接將主機名寫入 squid.conf 中,現在我們可以這樣修訂:
```
[root@www ~]# vim /etc/squid/squid.conf
# 找到底下的數據,就是 dropdomain 那行,約在 629 行左右,并且修改一下
acl dropdomain dstdomain "/etc/squid/dropdomain.txt"
# 注意一下,如果是檔名,請寫絕對路徑,且使用雙引號或單引號圈起來!
[root@www ~]# vim /etc/squid/dropdomain.txt
.facebook.com
.yahoo.com
# 一行一個 domain 名稱即可
[root@www ~]# /etc/init.d/squid reload
```
這個方法的好處是,你可以使用額外的控制方式去修改 /etc/squid/dropdomain.txt 這個檔案的內容, 并且修改完畢后再使用 reload 去加載配置文件,不必要重新啟動 (restart),因為 reload 的速度比較快速。 舉例來說,鳥哥的專題生就用 PHP 寫了一支控制該檔案的網頁接口,可以讓老師在上課時直接透過網頁輸入要被控制的目標網站, 這樣學生就無法在上課時聯機到外面的某些網站去玩游戲啰~
* * *
- 鳥哥的Linux私房菜:服務器架設篇 第三版
- 第一部份:架站前的進修專區
- 作者序
- 第一章、架設服務器前的準備工作
- 1.1 前言: Linux 有啥功能
- 1.2 基本架設服務器流程
- 1.3 自我評估是否已經具有架站的能力
- 1.4 本章習題
- 第二章、基礎網絡概念
- 2.1 網絡是個什么玩意兒
- 2.2 TCP/IP 的鏈結層相關協議
- 2.3 TCP/IP 的網絡層相關封包與數據
- 2.4 TCP/IP 的傳輸層相關封包與數據
- 2.5 連上 Internet 前的準備事項
- 2.6 重點回顧:
- 2.7 本章習題
- 2.8 參考數據與延伸閱讀
- 第三章、局域網絡架構簡介
- 3.1 局域網絡的聯機
- 3.2 本書使用的內部聯機網絡參數與通訊協議
- 第四章、連上 Internet
- 4.1 Linux 連上 Internet 前的注意事項
- 4.2 連上 Internet 的設定方法
- 4.3 無線網絡--以筆記本電腦為例
- 4.4 常見問題說明
- 4.5 重點回顧
- 4.6 本章習題
- 4.7 參考數據與延伸閱讀
- 第五章、 Linux 常用網絡指令
- 5.1 網絡參數設定使用的指令
- 5.2 網絡偵錯與觀察指令
- 5.3 遠程聯機指令與實時通訊軟件
- 5.4 文字接口網頁瀏覽
- 5.5 封包擷取功能
- 5.6 重點回顧
- 5.7 本章習題
- 5.8 參考數據與延伸閱讀
- 第六章、 Linux 網絡偵錯
- 6.1 無法聯機原因分析
- 6.2 處理流程
- 6.3 本章習題
- 6.4 參考數據與延伸閱讀
- 第二部分:主機的簡易資安防護措施
- 第七章、網絡安全與主機基本防護:限制端口, 網絡升級與 SELinux
- 7.1 網絡封包聯機進入主機的流程
- 7.2 網絡自動升級軟件
- 7.3 限制聯機埠口 (port)
- 7.4 SELinux 管理原則
- 7.5 被攻擊后的主機修復工作
- 7.6 重點回顧
- 7.7 課后練習
- 7.8 參考數據與延伸閱讀
- 第八章、路由觀念與路由器設定
- 8.1 路由
- 8.2 路由器架設
- 8.3 動態路由器架設:quagga (zebra + ripd)
- 8.4 特殊狀況:路由器兩邊界面是同一個 IP 網段: ARP Proxy
- 8.5 重點回顧
- 8.6 本章習題
- 8.7 參考數據與延伸閱讀
- 第九章、防火墻與 NAT 服務器
- 9.1 認識防火墻
- 9.2 TCP Wrappers
- 9.3 Linux 的封包過濾軟件:iptables
- 9.4 單機防火墻的一個實例
- 9.5 NAT 服務器的設定
- 9.6 重點回顧
- 9.7 本章習題
- 9.8 參考數據與延伸閱讀
- 第十章、申請合法的主機名
- 10.1 為何需要主機名
- 10.2 注冊一個合法的主機名
- 10.3 重點回顧
- 10.4 本章習題
- 10.5 參考數據與延伸閱讀
- 第三部分:局域網絡內常見的服務器架設
- 第十一章、遠程聯機服務器SSH / XDMCP / VNC / RDP
- 11.1 遠程聯機服務器
- 11.2 文字接口聯機服務器: SSH 服務器
- 11.3 最原始圖形接口: Xdmcp 服務的啟用
- 11.4 華麗的圖形接口: VNC 服務器
- 11.5 仿真的遠程桌面系統: XRDP 服務器
- 11.6 SSH 服務器的進階應用
- 11.7 重點回顧
- 11.8 本章習題
- 11.9 參考數據與延伸閱讀
- 第十二章、網絡參數控管者: DHCP 服務器
- 12.1 DHCP 運作的原理
- 12.2 DHCP 服務器端的設定
- 12.3 DHCP 客戶端的設定
- 12.4 DHCP 服務器端進階觀察與使用
- 12.5 重點回顧
- 12.6 本章習題
- 12.7 參考數據與延伸閱讀
- 第十三章、文件服務器之一:NFS 服務器
- 13.1 NFS 的由來與其功能
- 13.2 NFS Server 端的設定
- 13.3 NFS 客戶端的設定
- 13.4 案例演練
- 13.5 重點回顧
- 13.6 本章習題
- 13.7 參考數據與延伸閱讀
- 第十四章、賬號控管: NIS 服務器
- 14.1 NIS 的由來與功能
- 14.2 NIS Server 端的設定
- 14.3 NIS Client 端的設定
- 14.4 NIS 搭配 NFS 的設定在叢集計算機上的應用
- 14.5 重點回顧
- 14.6 本章習題
- 14.7 參考數據與延伸閱讀
- 第十五章、時間服務器: NTP 服務器
- 15.1 關于時區與網絡校時的通訊協議
- 15.2 NTP 服務器的安裝與設定
- 15.3 客戶端的時間更新方式
- 15.4 重點回顧
- 15.5 本章習題
- 15.6 參考數據與延伸閱讀
- 第十六章、文件服務器之二: SAMBA 服務器
- 16.1 什么是 SAMBA
- 16.2 SAMBA 服務器的基礎設定
- 16.3 Samba 客戶端軟件功能
- 16.4 以 PDC 服務器提供賬號管理
- 16.5 服務器簡單維護與管理
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考數據與延伸閱讀
- 第十七章、區網控制者: Proxy 服務器
- 17.1 什么是代理服務器 (Proxy)
- 17.2 Proxy 服務器的基礎設定
- 17.3 客戶端的使用與測試
- 17.4 服務器的其他應用設定
- 17.5 重點回顧
- 17.6 本章習題
- 17.7 參考數據與延伸閱讀
- 第十八章、網絡驅動器裝置: iSCSI 服務器
- 18.1 網絡文件系統還是網絡驅動器
- 18.2 iSCSI target 的設定
- 18.3 iSCSI initiator 的設定
- 18.4 重點回顧
- 18.5 本章習題
- 18.6 參考數據與延伸閱讀
- 第四部分:常見因特網服務器架設
- 第十九章、主機名控制者: DNS 服務器
- 19.1 什么是 DNS
- 19.2 Client 端的設定
- 19.3 DNS 服務器的軟件、種類與 cache only DNS 服務器設定
- 19.4 DNS 服務器的詳細設定
- 19.5 協同工作的 DNS: Slave DNS 及子域授權設定
- 19.6 DNS 服務器的進階設定
- 19.7 重點回顧
- 19.8 本章習題
- 19.9 參考數據與延伸閱讀
- 第二十章、WWW 伺服器
- 20.1 WWW 的簡史、資源以及伺服器軟體
- 20.2 WWW (LAMP) 伺服器基本設定
- 20.3 Apache 伺服器的進階設定
- 20.4 登錄檔分析以及 PHP 強化模組
- 20.5 建立連線加密網站 (https) 及防砍站腳本
- 20.6 重點回顧
- 20.7 本章習題
- 20.8 參考資料與延伸閱讀
- 第二十一章、文件服務器之三: FTP 服務器
- 21.1 FTP 的數據鏈路原理
- 21.2 vsftpd 服務器基礎設定
- 21.3 客戶端的圖形接口 FTP 聯機軟件
- 21.4 讓 vsftpd 增加 SSL 的加密功能
- 21.5 重點回顧
- 21.6 本章習題
- 21.7 參考數據與延伸閱讀
- 第二十二章、郵件服務器: Postfix
- 22.1 郵件服務器的功能與運作原理
- 22.2 MTA 服務器: Postfix 基礎設定
- 22.3 MRA 服務器: dovecot 設定
- 22.4 MUA 軟件:客戶端的收發信軟件
- 22.5 郵件服務器的進階設定
- 22.6 重點回顧
- 22.7 本章習題
- 22.8 參考數據與延伸閱讀