文/陳國良 巫園芬
在高校,信息化和數(shù)字化早已滲透到學(xué)校教學(xué)、科研、管理等各方面,數(shù)字化校園成為學(xué)校教學(xué)和科研的有力支持。基本上每個二級單位都建設(shè)了數(shù)個信息系統(tǒng),如果為眾多信息系統(tǒng)提供互聯(lián)網(wǎng)服務(wù)對高校網(wǎng)絡(luò)中心而言將是巨大的挑戰(zhàn)。
高校通常自建校園網(wǎng)及IDC,所有校內(nèi)的信息系統(tǒng)都運(yùn)行在IDC 中。在單一互聯(lián)網(wǎng)出口的網(wǎng)絡(luò)架構(gòu)中,由于路由簡單,問題的焦點(diǎn)落于IP 地址匱乏上;在多個互聯(lián)網(wǎng)出口的網(wǎng)絡(luò)架構(gòu)中,除匱乏的IP 地址,還將存在復(fù)雜路由、源進(jìn)源出、智能DNS 等問題。
復(fù)雜路由和源進(jìn)源出可通過路由設(shè)備解決,智能DNS 則可通過配置view zone 解決多運(yùn)營商互聯(lián)網(wǎng)出口用戶訪問優(yōu)化問題,但匱乏的IP 地址致使無法為每個信息系統(tǒng)配備公網(wǎng)IP,虛擬主機(jī)、反向代理技術(shù)可以較好地解決IP 地址匱乏問題。
信息系統(tǒng)提供互聯(lián)網(wǎng)服務(wù)無非為實(shí)例主機(jī)或虛擬主機(jī)。實(shí)例主機(jī)即每個信息系統(tǒng)對應(yīng)一個公網(wǎng)IP,對于IPv4 地址已經(jīng)分配完畢但仍未過渡到IPv6 網(wǎng)絡(luò)期間,顯然會占用過多的IPv4 地址。在多出口校園網(wǎng)環(huán)境中非主要出口所分配到的IPv4 地址通常只有64 個甚至更少。實(shí)例主機(jī)方式顯然不適合。
暨南大學(xué)
虛擬主機(jī)的技術(shù)實(shí)現(xiàn)則有兩種方式。第一,使用同一IP 地址但不同端口,由此,每個IP 地址可以支持超過6 萬個虛擬主機(jī)即運(yùn)行超過6 萬個信息系統(tǒng)。在數(shù)量上確實(shí)能滿足為高校信息系統(tǒng)提供互聯(lián)網(wǎng)服務(wù),但信息系統(tǒng)的承載是http 或https 協(xié)議,這兩者都有其默認(rèn)服務(wù)端口80 和443。使用同一IP 地址但不同端口做虛擬主機(jī)服務(wù)意味著需要改變服務(wù)端口,即用戶訪問該信息系統(tǒng)時(shí)需要在域名或IP 地址后面加上端口號以便映射到相應(yīng)的信息系統(tǒng),大大降低了用戶友好度。
第二,使用同一IP 地址同一端口,根據(jù)不同主機(jī)名即域名來區(qū)分信息系統(tǒng)。如此,每個IP 地址可以支持趨近無限個信息系統(tǒng),且用戶只需輸入域名作為信息系統(tǒng)的識別即可訪問到相應(yīng)的信息系統(tǒng),大大提高了用戶友好度。
采用主機(jī)名虛擬主機(jī)方式可實(shí)現(xiàn)區(qū)分無限個信息系統(tǒng),但一臺物理主機(jī)的性能終歸是有限的,而且信息系統(tǒng)的編程語言不一、技術(shù)架構(gòu)參差不齊,亦不可能運(yùn)行在同一臺服務(wù)器中。因此,中間件和負(fù)載均衡是不得不考慮的問題。
業(yè)界解決此類問題的方案不少,考慮到在實(shí)際的網(wǎng)絡(luò)環(huán)境中,部分二級單位的服務(wù)器并非統(tǒng)一托管到網(wǎng)絡(luò)中心機(jī)房,因此選用反向代理的方案。
對用戶而言,反向代理服務(wù)器就是信息系統(tǒng),用戶訪問反向代理服務(wù)器,反向代理服務(wù)器接收到用戶的請求,接著向真實(shí)服務(wù)器請求相應(yīng)的數(shù)據(jù),收到真實(shí)服務(wù)器返回的數(shù)據(jù)后再將數(shù)據(jù)返回給用戶。反向代理服務(wù)器終止了用戶的TCP 連接,所以用戶不必與真實(shí)服務(wù)器跟帖可達(dá),用戶只需能訪問反向代理服務(wù)器即可,代理服務(wù)器可以通過私有網(wǎng)絡(luò)向真實(shí)服務(wù)器請求數(shù)據(jù)。此架構(gòu)可節(jié)省公網(wǎng)IP 地址,保護(hù)真實(shí)服務(wù)器不受互聯(lián)網(wǎng)攻擊,信息系統(tǒng)數(shù)量不受服務(wù)器性能限制,優(yōu)點(diǎn)顯著,如圖1 所示。
在反向代理軟件的選擇上,主要考慮三款主流的開源軟件,Squid、Varnish 和Nginx。
圖1 反向代理原理
Squid,有一定歷史的反向代理軟件,其功能有傳統(tǒng)代理、身份驗(yàn)證、URL 過濾、連接管理等。目前廣泛應(yīng)用于各CDN 上做反向緩存代理服務(wù)器。
Varnish 則較為年輕,設(shè)計(jì)簡單,數(shù)據(jù)主要緩存在內(nèi)存上,響應(yīng)更快,更符合目前高速交付的需求,但重啟后數(shù)據(jù)將消失,更適合做網(wǎng)絡(luò)加速用途。
Nginx 具有高并發(fā)的優(yōu)點(diǎn),支持http、https、pop、smtp、imap 等多種協(xié)議,廣泛應(yīng)用于各大型網(wǎng)站中。
近年來,信息安全事件頻出,隨著信息安全形勢日益嚴(yán)峻,全網(wǎng)使用ssl 安全連接被提上了日程,全網(wǎng)使用https 協(xié)議也即將實(shí)現(xiàn),支持反向代理部署的全網(wǎng)https 協(xié)議方案必然要求反向代理軟件支持SNI,SNI 即服務(wù)器名稱指示(Server Name Indication),是TLS 協(xié)議的擴(kuò)展,用于指示和哪些主機(jī)名服務(wù)端來握手連接。這使得一臺服務(wù)器上相同的IP 地址和端口允許使用多張證書,從而允許多個安全的站點(diǎn)(https 站點(diǎn))在相同的IP 地址上,不需要使用相同的SSL 證書。這相當(dāng)于允許虛擬主機(jī)用于https。Nginx 較其他軟件更好地支持SNI,能夠更好地滿足需求。
Nginx 除了能實(shí)現(xiàn)反向代理功能外,其實(shí)還是一款優(yōu)質(zhì)的負(fù)載均衡軟件,它可以做應(yīng)用層的負(fù)載均衡,支持熱備、輪詢等模式并可靈活配置真實(shí)服務(wù)器檢活機(jī)制。然而僅使用Nginx 來實(shí)現(xiàn)負(fù)載均衡容易出現(xiàn)單點(diǎn)故障,同時(shí)單臺服務(wù)器性能有限,無法很好支持逐年增長的龐大數(shù)量的信息系統(tǒng)。
LVS+HA+Ldirectord 可以很好地解決單點(diǎn)故障,從網(wǎng)絡(luò)層進(jìn)行負(fù)載均衡,具體功能實(shí)現(xiàn)如下:
LVS 提供虛擬IP 接收業(yè)務(wù)請求,并將請求按設(shè)定算法調(diào)度到真實(shí)服務(wù)器,工作在OSI 四層以下,通過IP、端口處理業(yè)務(wù)流量。
HA 是雙機(jī)高可用,即協(xié)商兩臺服務(wù)器,在其中一臺服務(wù)器上運(yùn)行LVS,若該服務(wù)器出現(xiàn)故障無法運(yùn)行LVS 則會切換到另一臺服務(wù)器運(yùn)行LVS,實(shí)現(xiàn)虛擬IP 高可用。
Ldirectord 主要用于檢測后端服務(wù)器的服務(wù)狀態(tài),一旦檢測到后端服務(wù)器下線,則把該服務(wù)器從LVS 服務(wù)器列表中剔除,避免LVS 把用戶請求轉(zhuǎn)發(fā)到故障服務(wù)器中。
如圖2 所示,用戶請求www、news、net 等站點(diǎn),LVS 將用戶請求調(diào)度到各反向代理服務(wù)器,反向代理服務(wù)器再根據(jù)用戶請求連接到真實(shí)服務(wù)器。
圖2 反向代理負(fù)載均衡原理
顯而易見,信息系統(tǒng)服務(wù)器將存在單點(diǎn)故障風(fēng)險(xiǎn),部分重點(diǎn)服務(wù)器無法得到保障。在此情況下,Nginx 的應(yīng)用負(fù)載均衡則可以很好地補(bǔ)充反向代理對真實(shí)服務(wù)器的負(fù)載均衡,實(shí)現(xiàn)反向代理負(fù)載均衡體系的高可用,如圖3 所示。
1.安裝
采用內(nèi)核版本為2.6.x 的Linux 操作系統(tǒng),以更好地支持LVS。采用源碼方式安裝ipvsadm-1.26、Heartbeat-3、ClusterLabsresource-agents 和Reusable-Cluster-Components-glue。
圖3 高可用反向代理負(fù)載均衡原理
2.配置
ha.cf 指定雙機(jī)均衡對端,關(guān)鍵配置如下:
ucast eth0 192.168.0.121
auto_failback off
node lvsweb48a lvsweb48b
authkeys 配置使用md5 加密驗(yàn)證方法:
auth 3
3 md5 lvsweb48
haresources 配置運(yùn)行的資源:
lvsweb48b lvsadm ldirectord
ldirectord.cf 關(guān)鍵配置:
virtual=192.168.0.48:80
real=192.168.0.106:80 gate
……
fallback=192.168.0.100:80
service=http
scheduler=lc
lvsadm 配置LVS 初始運(yùn)行:
#!/bin/bash
RWEBCACHE11=192.168.0.102
……
VWEBCACHE1=192.168.0.48
ogateway=192.168.0.123
……
VHWaddr0=00:CA:74:00:30:00
……
VIPaddr0=192.168.0.48
RIPaddr0=192.168.0.122
# 以下為優(yōu)化內(nèi)容一
/sbin/ifconfig eth0 down
/sbin/ifconfig eth0 hw ether $VHWaddr0
/sbin/ifconfig eth0 up
/sbin/ifconfig eth1 down
/sbin/ifconfig eth1 hw ether $VHWaddr1
/sbin/ifconfig eth1 up
……
# 以下為優(yōu)化內(nèi)容二
ping -c 3 -i 1 $ogateway
ping -c 3 -i 1 $igateway
ping -c 3 -i 1 $vogateway1
ping -c 3 -i 1 $vogateway2
#以下省略正常配置
#Clear IPVS table
#Set LVS
#Run LVS
3. 優(yōu)化
上述LVS+HA+Ldirectord 體系配置是經(jīng)優(yōu)化后的最終配置,主要體現(xiàn)在:
(1)自編程初始配置,其中將VIP 的MAC 地址統(tǒng)一為雙機(jī)一致,即LVS 雙機(jī)進(jìn)行故障切換時(shí),保持網(wǎng)關(guān)設(shè)備的arp 表不變,將切換控制在2~3 個ping 包內(nèi)。若不對此進(jìn)行優(yōu)化,剛故障切換時(shí)網(wǎng)絡(luò)中斷時(shí)間更長,或者需要網(wǎng)關(guān)設(shè)備調(diào)整arp 老化時(shí)間,從而影響設(shè)備性能。
(2)切換時(shí)增加ping 網(wǎng)關(guān)等操作,進(jìn)一步提升網(wǎng)絡(luò)自愈能力。
(3)使用雙網(wǎng)卡路由配置可自由區(qū)分內(nèi)外網(wǎng)流量。
4.增強(qiáng)自愈能力
通過配置監(jiān)控腳本,實(shí)現(xiàn)雙活、雙宕機(jī)等異常情況的自愈。主要原理為通過ping 測LVS 真實(shí)IP 與虛擬IP 監(jiān)控LVS 是否存活,如雙宕機(jī)則相繼重啟服務(wù)器。設(shè)置監(jiān)控網(wǎng)卡,LVS 生效與失效會改變監(jiān)控網(wǎng)卡的MAC,通過ping 測監(jiān)控網(wǎng)卡,分析MAC是生效前或后的值即可判斷LVS 是否存在雙活異常,如是則相繼重啟服務(wù)器。腳本關(guān)鍵內(nèi)容如下:
system ("ping -c 4 $virtual_ip > $status_file") &&
printf "Can not run ping command! ";
open(pid_f,$status_file) || die ("Could not open file");
while ($line=
chomp $line;
$cmd_line = $line;
if ( index($cmd_line,$cmd_v) > 0 ) {
$run_v=0;
}
}
close(pid_f);
……
if ( $run_v > 0 ) {
system ("echo $time restart no service>> $fail_
log");
system ("init 6 ") && die "Can not run SH! ";
}
elsif ( $arp_r == $arp_l ) {
system ("echo $time restart both service>> $fail_
log");
system ("init 6 ") && die "Can not run SH! ";
}
exit;
效果較顯著,能確保LVS 正常服務(wù),見
日志記錄:
201905132015 restart both service
201905190533 restart no service
201905200533 restart both service
……
格式為“日期 操作 原因”,其中“both service”為雙活異常,“no service”為宕服務(wù)異常。從日志可看出監(jiān)控腳本可有效維持LVS 正常服務(wù)。
1.安裝
采用Freebsd 操作系統(tǒng),源碼方式安裝nginx-1.10.2。
2.配置
配置nginx.conf 實(shí)現(xiàn)反向代理功能,關(guān)鍵配置如下:
server {
listen 80;
server_name *.test.edu.cn;
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_
x_forwarded_for;
proxy_buffering off;
}
}
server {
listen 443 ssl;
server_name *.test.edu.cn;
ssl_certificate test.edu.cn.crt;
ssl_certificate_key test.edu.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_
x_forwarded_for;
proxy_buffering off;
}
}
}
include upstream.conf;
include server80.conf;
include server443.conf;
3.優(yōu)化
上述配置為Nginx 的主配置,做了幾點(diǎn)優(yōu)化,主要體現(xiàn)在:
(1)優(yōu)化日志記錄格式,既考慮到更詳盡地記錄訪問日志,又兼顧安全部門溯源的需要。詳盡的日志記錄,可以通過分析各響應(yīng)時(shí)間,得出不同站點(diǎn)不同節(jié)點(diǎn)的訪問時(shí)延,進(jìn)一步有針對性地優(yōu)化。
(2)主配置與站點(diǎn)個性化配置分離,以便更好地管理,站點(diǎn)個性化配置通過include 方式加載。
(3)對部分重要信息系統(tǒng)需要應(yīng)用層負(fù)載均衡的,通過“include upstream.conf;”,設(shè)置upstream 服務(wù)器即可實(shí)現(xiàn)。
經(jīng)實(shí)驗(yàn)驗(yàn)證并在生產(chǎn)環(huán)境穩(wěn)定運(yùn)行數(shù)年,高可用反向代理體系運(yùn)行情況良好。實(shí)現(xiàn)了校園網(wǎng)的信息系統(tǒng)統(tǒng)一向各互聯(lián)網(wǎng)出口提供服務(wù),解決了校園網(wǎng)信息系統(tǒng)數(shù)量多而各互聯(lián)網(wǎng)出口IP 不足的問題,減輕了網(wǎng)絡(luò)管理員的管理工作。通過優(yōu)化,極大提升了反向代理體系的高可用性。
隨著信息技術(shù)的發(fā)展,信息系統(tǒng)基礎(chǔ)重點(diǎn)從簡單提供服務(wù)到規(guī)范代碼編寫、從簡單網(wǎng)絡(luò)連通到網(wǎng)絡(luò)安全、從信息發(fā)布到信息安全轉(zhuǎn)變,反向代理體系從提供服務(wù)的角度解決了高可用,但無法阻擋惡意攻擊、無法很好地解決安全問題,這需要進(jìn)一步的研究與探索。