一、對使用者的分析 現有網絡情況: 我校校園網通過光纜已將31座建築物連通,光纜總長度約15Km,絕大多數樓中實現結構化布線,連入校園網的網絡多媒體教室、教學基地、實驗室、機房等約有數十個,連網計算機達3000多台 。我校目前出口有2個,一條速率為10M bps,通過光纖接入中國教育科研網CERNET,另一條速率為4M bps連入中國電信。 用戶的需求: 我校校園網的使用者主體為在校學生及老師。根據統計,約80%的用戶使用WWW、FTP等資源。我校現有Chinanet ip 126個,不可能分給所有的用戶使用。通過架設代理服務器來實現讓所有用戶使用網絡資源是最簡單並且相對安全和可靠的方法。通過架設專門的WWW (FTP)代理來滿足用戶的主要需求,通過架設socks5代理來滿足用戶的其他需求。 二、硬件及軟件的選擇 硬件 Cache Server可以是一台普通的PC服務器加上cache軟件(如Squid、Inktomi)構成,也可以是軟硬件系統和一台專門的cache服務器。根據Chinanet出口的實際情況,4Mbps速率的出口,每秒最大傳入數據量為約500K/s。我校主干網節點間為雙千兆連接,到達部分實驗室是百兆,到達宿捨為10M。送出的最大數據量為約12M/s。傳送的數據量不是很大,使用傳統的IA32構架服務器既可滿足需求。我校網絡中心主機房使用機櫃來存放服務器。惠普公司的LH6000服務器,具有很強的擴展性,是新型的六路服務器。代理服務器的運算負荷不是很重,對於IO的要求較高。LH6000通過自定義配置可以達到這個要求。通過使用raid可以提高磁盤性能,增加數據的可靠性。代理服務器軟件占用內存較大。LH6000可以支持8GB內存。最終選擇配置如下: 配置 處理器:1個100MHz系統總線的Intel Pentium III Xeon 700MHz處理器 內存:1G PC-133 ECC SDRAM 磁盤控制器:集成具有32MB高速緩存雙通道Ultra3 SCSI HP NetRAID控制器 附加單通道:Ultra Wide SCSI控制器 內置存儲:熱插拔5x18G半高驅動器 網卡:內置INTEL 82559 100M網卡 電源:3個熱插拔電源 RAID使用了RAID5模式,這個模式是向陣列中的磁盤寫數據,奇偶校驗數據存放在陣列中的各個盤上,允許單個磁盤出錯。RAID 5也是以數據的校驗位來保證數據的安全,但它不是以單獨硬盤來存放數據的校驗位,而是將數據段的校驗位交互存放於各個硬盤上。這樣,任何一個硬盤損壞,都可以根據其它硬盤上的校驗位來重建損壞的數據。 軟件 Squid Internet Object Cache (Harvest Project的後續版本) 是美國政府大力助的一項研究計劃。Squid是一個開放源代碼的代理服務器軟件。它是一個為UNIX系統下運行的全功能的代理服務器軟件。它可以為 HTTP協議、FTP協議以及其他使用URL方式定位的協議作緩存。它支持客戶端使用SSL協議進行數據傳送。它可以使用ICP, HTCP, CARP, Cache Digests等協議和方式和其他運行squid的服務器進行協同。它支持SNMP協議,可以用相應的軟件來做協調和管理。並且能配置詳細的訪問控制列表(acl)。 操作系統 以前學校的代理服務器使用Linux作為操作系統。這是因為以前的代理服務器通常還兼作其他的服務器。很多服務器軟件是專門為linux開發的,或者在linux上運行的效率最高。Squid本身是為unix-like操作系統開發的。本身對系統沒有太多的要求。目前我校Chinanet代理服務器使用的是FreeBSD作為操作系統。 沒有選擇Linux有下面幾點原因: Linux的核心部分開發相對比較開放,FreeBSD的核心是由一個嚴格的core team來完成的。相對檢查更加嚴格。從核心部分比較BSD的內核更加穩定。 Linux對高負荷的承載能力不如FreeBSD。對於高負荷下程序出錯的容忍力,BSD遠強於Linux。 許多著名的網站,如:yahoo, netease 等著名的商業網站使用的就是freebsd,穩定性和性能早已通過很多專家的評測,遠遠強於Linux。 在著名的文章“Linux vs BSD: A Tale of Two System”中,是這樣評價Freebsd的: FreeBSD focuses on the Intel Architecture PC and server platforms, and on providing the best performance and stability possible. The DEC/Compaq Alpha is also supported. 但是Freebsd也有不如Linux的弱點。主要表現在磁盤IO的性能上。這主要是因為Freebsd使用的文件系統—UFS的性能不如linux上使用的ext2/ext3。但是在加上softupdate之後會有很大的改進。而且出國代理上配置的使用raid5模式,磁盤使用高轉速scsi硬盤,在上述硬件配置的情況下,讀取squid cache的數k大小的小文件使用ext2和ufs+softupdate的效率的差別在萬分之一以下。對於負載數千用戶的代理服務器來說,可以忽略這樣的效率差別。 基於以上原因,最終選用Freebsd作為代理服務器的操作系統。 三、代理服務器軟件的安裝 squid的安裝 freebsd本身的ports程序帶有squid的穩定版本。目前squid的最新版本是2.4.STABLE6。在freebsd的 /usr/ports/www/squid 目錄下執行make;make install就會將最新版本的squid代碼下載、編譯並最終安裝到/usr中的相應路徑中。 Squid本身會被安裝到/usr/local/sbin下 Squid的cache目錄默認為/usr/local/squid/cache Squid的log目錄默認為/usr/local/squid/logs squid的配置文件目錄默認為/usr/local/etc/squid 這樣的安裝方式比直接使用二進制的package安裝要好。因為二進制的package不能保證在自定義的系統上穩定運行。下載源代碼代碼在本地進行編譯之前,首先會校驗源代碼的MD5 checksum,這樣能保證我得到的源代碼是未經修改過的版本。然後再在本地進行編譯。最後安裝到相應目錄。 Squid的配置 Squid的配置文件是squid.conf 部分參數的配置如下:(為保證代理服務器安全,部分參數用*代替) http_port 8080 設置http代理端口為8080 cache_peer pa.us.ircache.net sibling 3128 3130 login=*:* cache_peer sj.us.ircache.net sibling 3128 3130 login=*:* cache_peer * parent 13280 4827 htcp *:* 這幾行是使用squid可以和其他幾台機器進行協同工作的特性,同幾台組成cache_peer。具體設置在後面的優化部分會解釋。 cache_peer_domain * .edu.cn設置.edu.cn的域名使用某個cache_peer訪問 cache_mem 400 MB設定內存cache的大小為400M cache_swap_low 80 cache_swap_high 97這兩行是設置cache進行替換的閘值。當占用到97%的cache後,cache中的內容將被清空20%。 maximum_object_size 20000 KB 最大對象大小為20M. maximum_object_size_in_memory 10000 KB 內存中最大的對象大小為10M ipcache_size 4096 ip對應cache的大小為4096 fqdncache_size 4096 域名全稱cache的大小為4096 cache_replacement_policy heap LFUDA cache替換策略 memory_replacement_policy heap LRU 內存替換策略 cache_dir ufs /usr/local/squid/cache 25000 16 256 cache存放的路徑大小及具體配置 dns_nameservers * * * * * 內部指定dns服務器 authenticate_program * * 身份認證程序 authenticate_children 32 身份認證程序啟動的進程數目 request_body_max_size 5 MB 最大請求的body大小 reply_body_max_size 20 MB 最大回應的body大小 acl all src 0.0.0.0/0.0.0.0 acl dorm proxy_auth 192.168.0.0/255.255.0.0 REQUIRED acl bjpu proxy_auth 202.112.64.0/255.255.240.0 REQUIRED acl bjpu2 proxy_auth 211.71.80.0/255.255.240.0 REQUIRED 訪問控制列表 acl banned_sites {過濾的關鍵字} http_Access deny banned_sites deny_info ERR_BANNED_SITE banned_sites 禁止訪問違禁站點的設置 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl SSL_ports port 443 563 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT 設置可以連接的端口 http_access allow dorm http_access allow bjpu http_access allow bjpu2 http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access deny all 允許http訪問 icp_access allow *允許cache_peer使用ICP協議訪問 proxy_auth_realm BJPU proxy-caching web server 驗證框提示的banner cache_mgr [email protected] cache管理員的電子郵件地址 cache_effective_user * cache_effective_group * 執行cache程序的用戶uid和gid visible_hostname cnproxy.bjpu.edu.cn cache服務的機器名 memory_pools on 內存池設置為打開。 memory_pools_limit 50 MB 內存池的大小 Socks5代理的安裝 出國代理上選用的socks5代理軟件是NEC公司制作的軟件。它實際上是一個商業版軟件。但是根據它的license文件所述,在非商業用途上使用這個軟件是免費的。 在RFC-1928對socks5如何運行做了詳細的描述。這個標准就是NEC公司的“Ying-Da Lee”和HP及IBM公司制定的。在相應的測試中,NEC公司的這個socks5代理軟件的性能是較好的。雖然它有一些安全上的漏洞,但是使用 freebsd的ports方式安裝,將會自動對源代碼打補丁,修正安全隱患。 在/usr/ports/net/socks5下執行make;make install就能安裝好該程序。相應的文件將被安裝在下列目錄: socks5可執行文件被放在/usr/local/bin socks5.conf文件被放在/usr/local/etc下 bugtraq上曾經提到socks5的密碼驗證部分有安全隱患,因此沒有使用該功能。 Socks5代理的配置 Socks5代理的配置文件是socks5.conf,內容如下: set SOCKS5_MAXCHILD 8000 permit - - 192.168. - (1024,65535) - permit - - 202.112.64.0/255.255.240.0 - (1024,65535) - permit - - 211.71.80.0/255.255.240.0 - (1024,65535) ?C 限制工大可以使用該socks5代理,限制目標端口為1024-65535。設置最多可以有8000個進程運行。 配置文件的切換 為了避免帶寬的浪費,出國代理設置為夜間取消最大下載對象限制。這是是使用crontab來做到的。每天夜間23:30將配置文件切換為沒有最大下載對象限制的。每天上午7:30切換回有最大下載對象限制的。 四、使用情況分析 單位時間內流量 input (total) output packets errs bytes packets errs bytes colls 917 0 646248 1015 0 767928 0 941 0 667858 1287 0 1548180 0 832 0 673330 897 0 836839 0 895 0 655289 1067 0 878449 0 *以上數據為出國代理負載中等時的數據。 Chinanet出口已經被占滿,經過cache的作用,送出數據大於進入數據 CPU負荷 使用top命令看到的CPU的負荷: load averages: 0.72, 0.86, 0.86(1mi,5min,15min),此數據為出國代理負載中等時的數據。 Hourly usage 通過這張圖可以清晰的了解出國代理的使用情況。 早6時,宿捨通電。出國代理的使用頻度增加數倍。 早8時,機房、實驗室開始開放,出國代理的使用頻度近一步增多。 上午11時,課程結束,部分學生離開機房、實驗室,午餐時間使用頻度略微減少。 中午13時,下午課程開始,學生離開宿捨,使用頻度減少。 下午15時,機房和實驗室用戶增多。 下午17時,部分機房、實驗室關閉,教師離開學校,造成使用頻度減少。 晚18-20時,學生去上自習或選修課,使用頻度呈減少趨勢 晚21時-22時,選修課結束,學生回到宿捨,使用頻度急劇增加,並且達到每天的最高點。 晚23時,部分宿捨斷電,實驗室斷電。使用頻度進一步減少。 0時-5時,宿捨學生大多已經休息,使用頻度程減少趨勢。 Daily usage 通過上面可以看出我校Chinanet線路代理服務器每天的使用情況。出國代理的日訪問日志在約600M。圖中顯示出周末,尤其是周日訪問量很大。這是由於周末我校宿捨不斷電,作為用戶主體的學生的使用網絡的時間大大增加。對此稱為“周末效應”。 五、安全保障 物理安全的保護 供電:該服務器放在我校網絡中心主機房,有雙路供電。UPS可以保證在沒有市電供應下5小時不中斷服務。 物理隔離:網絡中心24小時有專人值班,進入主機房需要登記。 服務器軟件安全保護 操作系統選用了FreeBSD。Freebsd本身幾乎沒有任何安全漏洞。根據服務最少化原則,出國代理上目前使用的服務有ssh ntp socks5 squid幾種。其中ssh沒有使用freebsd自帶的openssh,而是使用了ssh.com出的非商業版的ssh服務器軟件。這個版本的ssh服務器軟件相對openssh有更安全效率更高的優勢。而且對於非商業應用是免費的。服務器通過ntp服務與某網絡時間服務器進行時間同步,這是為了保證日志文件記錄事件發生時間的准確性。另2個為必須提供的代理服務。其余服務沒有打開。執行ps命令確認沒有任何多余進程。 對SYN-Flood及掃描的防護 SYN Flood是當前最流行的DoS(拒絕服務攻擊)與DdoS(分布式拒絕服務攻擊)的方式之一,這是一種利用TCP協議缺陷,發送大量偽造的TCP連接請求,從而使得被攻擊方資源耗盡(CPU滿負荷或內存不足)的攻擊方式。 TCP協議的三次握手過程是這樣的: 首先,請求端(客戶端)發送一個包含SYN標志的TCP報文,SYN即同步(Synchronize),同步報文會指明客戶端使用的端口以及TCP連接的初始序號; 第二步,服務器在收到客戶端的SYN報文後,將返回一個SYN+ACK的報文,表示客戶端的請求被接受,同時TCP序號被加一,ACK即確認(Acknowledgement)。 第三步,客戶端也返回一個確認報文ACK給服務器端,同樣TCP序列號被加一,到此一個TCP連接完成。假設一個用戶向服務器發送了SYN報文後突然死機或掉線,那麼服務器在發出SYN+ACK應答報文後是無法收到客戶端的ACK報文的(第三次握手無法完成),這種情況下服務器端一般會重試(再次發送 SYN+ACK給客戶端)並等待一段時間後丟棄這個未完成的連接,這段時間的長度我們稱為SYN Timeout,一般來說這個時間是分鐘的數量級(大約為30秒-2分鐘);一個用戶出現異常導致服務器的一個線程等待1分鐘並不是什麼很大的問題,但如果有一個惡意的攻擊者大量模擬這種情況,服務器端將為了維護一個非常大的半連接列表而消耗非常多的資源----數以萬計的半連接,即使是簡單的保存並遍歷也會消耗非常多的CPU時間和內存,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。 實際上如果服務器的TCP/IP棧不夠強大,最後的結果往往是堆棧溢出崩潰。即使服務器端的系統足夠強大,服務器端也將忙於處理攻擊者偽造的TCP連接請求而無暇理睬客戶的正常請求(畢竟客戶端的正常請求比率非常之小),從而造成DoS。 在freebsd的可以調整的內核參數中有下面2項:net.inet.tcp.blackhole和net.inet.udp.blackhole。相應的描述如下:The blackhole sysctl(8) MIB is used to control system behaviour when connection requests are received on TCP or UDP ports where there is no socket listening. Normal behaviour, when a TCP SYN segment is received on a port where there is no socket accepting connections, is for the system to return a RST segment, and drop the connection. The connecting system will see this as a "Connection reset by peer". By setting the TCP blackhole MIB to a numeric value of one, the incoming SYN segment is merely dropped, and no RST is sent, making the system appear as a blackhole. By setting the MIB value to two, any segment arriving on a closed port is dropped without returning a RST. This provides some degree of protection against stealth port scans.In the UDP instance, enabling blackhole behaviour turns off the sending of an ICMP port unreachable message in response to a UDP datagram which arrives on a port where there is no socket listening. It must be noted that this behaviour will prevent remote systems from running traceroute(8) to a system. The blackhole behaviour is useful to slow down anyone who is port scanning a system, attempting to detect vulnerable services on a system. It could potentially also slow down someone who is attempting a denial of service attack. 根據上面描述可以將net.inet.tcp.blackhole和net.inet.udp.blackhole設置為2和1,這樣將防止半開式的端口掃描,並且能對syn-flood有初步的防護。 在內核的配置文件中有options TCP_DROP_SYNFIN這個選項。通過加入這個參數,可以防止通過TCP/IP堆棧對操作系統進行識別。可以將安全問題中的”information gathering”解決 。 六、優化 內核的優化 FreeBSD有很豐富的可以自定義的內核的參數。默認的內核為了保證通用性和穩定性,有大量優化性能的參數沒有加入。 我校Chinanet代理服務器操作系統內核部分優化參數如下: options MAXDSIZ="(1024*1024*1024)" options MAXSSIZ="(1024*1024*1024)" options DFLDSIZ="(1024*1024*1024)" options CPU_ENABLE_SSE options PANIC_REBOOT_WAIT_TIME=16 前三行是對freebsd下運行的應用程序可以使用的最大的內存資源作限制,默認為128M。 由於出國代理服務器軟件squid占用內存巨大,默認的配置顯然不能滿足要求,所以要使用自定義的配置。這個配置允許單一進程占用1G的內存資源。 第四行是打開對SSE/MMX2指令集的支持。通過加入這一參數,出國代理的性能提高了約1%。即單位時間內吞吐量增加了1%。 第5行是在內核發生嚴重錯誤的時候自動重新啟動的時間。這個參數保證了服務器出現嚴重的軟件錯誤後能自動恢復。 Cache policy 在本文的第三部分中提到了出國代理使用的cache policy。 cache_replacement_policy heap LFUDA cache替換策略 memory_replacement_policy heap LRU 內存替換策略 HP公司曾經對squid作過詳細的測試。 參考該文檔,對我校出國代理作了相應的調整。默認的cache_replacement_policy 和memory_replacement_policy都是LRU。這個算法用在cache上效率相對較低。經過實際測試,使用LFUDA(Least Frequently Used with Dynamic Aging)作為cache replacement policy,cache的命中率最高。使用heap LRU作為memory replacement policy,memory cache命中率最高。使用工具測得加入出國代理後,對使用代理的用戶來說,Chinanet的出口帶寬達到了5-7M,已經遠遠高於4M的實際帶寬。確實起到了cache的作用。 對於磁盤IO的優化 前文提到freebsd的磁盤性能不佳。除使用raid 技術之外,squid本身有unlinkd 和diskd兩個子進程來專門負責對磁盤作操作。配置文件中的cache_dir ufs /usr/local/squid/cache 25000 16 256 這行指定了squid可以使用25G的硬盤空間來作為緩存。Ufs指定了使用unlinkd作為對磁盤做操作的進程。Unlinkd只負責刪除文件的操作,diskd負責所有的操作。Squid的相應文檔上建議使用diskd。但是經過測試,使用diskd雖然能提高系統的性能,但是會使squid進程變得不穩定。基於保證穩定性的考慮,選擇使用unlinkd作為對磁盤操作的進程。 Cache peer Squid支持多台服務器進行協同工作,組成cache peer。美國的National Laboratory for Applied Network Research、UCSD、The National Science Foundation建立了相應的cache peer組織(http://www.ircache.net)。我校Chinanet代理服務器將該組織中的2台服務器設置為slibing模式來調用,將我校另外一台cernet線路上的服務器設置為域名以.edu.cn結尾的parent模式。訪問過程是這樣的:如果客戶端提交來的請求是以. edu.cn結尾的,首先查詢cache中是否有,如果沒有則請求cernet線路上的服務器去讀取相應資源。 對於其他的域名,則首先查詢本身的cache,如果沒有則查詢slibing的cache,如果還沒有,則自己主動去獲取該資源。與ircache的協調使用ICP (Internet Cache Protoclol),與cernet線路服務器協調使用HTCP(Hypertext Caching Protocol)。對ICP的描述在RFC2186、RFC2187,對HTCP的描述在http: //icp.ircache.net/htcp.txt。HTCP更有利於提高cache的性能,但是對系統的配置有要求,ICP相對簡單。所以,選擇使用ICP與ircache的服務器協同工作,使用HTCP與學校cernet服務器協同工作。