引言:隨著互聯(lián)網(wǎng)業(yè)務(wù)的急速增加,越來(lái)越多的企業(yè)服務(wù)需要在保證內(nèi)網(wǎng)互聯(lián)的基礎(chǔ)上,進(jìn)行公網(wǎng)的交互訪問(wèn)。這時(shí)對(duì)于業(yè)務(wù)的訪問(wèn)加速、安全增強(qiáng)、穩(wěn)定性鞏固,就變得越來(lái)越重要。為了提升網(wǎng)絡(luò)安全,設(shè)計(jì)并部署了Protal+Cache集成服務(wù)。
隨著互聯(lián)網(wǎng)業(yè)務(wù)的急速增加,越來(lái)越多的企業(yè)服務(wù)需要在保證內(nèi)網(wǎng)互聯(lián)的基礎(chǔ)上,進(jìn)行公網(wǎng)的交互訪問(wèn)。這時(shí)對(duì)于業(yè)務(wù)的訪問(wèn)加速、安全增強(qiáng)、穩(wěn)定性鞏固,就變得越來(lái)越重要。以筆者單位為例,本地某平臺(tái)需要能夠在內(nèi)網(wǎng)環(huán)境下訪問(wèn)公網(wǎng)上的某些資源,并且可以通過(guò)寬帶及手機(jī)流量訪問(wèn)平臺(tái)中的某些信息。
為了提升網(wǎng)絡(luò)安全,我們沒(méi)有給相應(yīng)的服務(wù)器和終端提供直接的網(wǎng)絡(luò)環(huán)境,而是設(shè)計(jì)并部署了Protal+Cache集成服務(wù),并利用自己的DNS平臺(tái)為用戶提供網(wǎng)絡(luò)中繼,目前平臺(tái)已經(jīng)安全穩(wěn)定運(yùn)行半年。
整套平臺(tái)采用NGINX的proxy_pass和DNS解析作為核心,即反向代理功能與域名解析功能,整體網(wǎng)絡(luò)拓?fù)淙鐖D1所示,其中服務(wù)器集群分布式部署在各個(gè)縣區(qū)機(jī)房,防火墻與DNS服務(wù)統(tǒng)一放置在市級(jí)機(jī)房。

圖1 平臺(tái)網(wǎng)絡(luò)拓?fù)鋱D
網(wǎng)內(nèi)擁有多臺(tái)互為備份的服務(wù)器,當(dāng)公網(wǎng)用戶訪問(wèn)網(wǎng)內(nèi)設(shè)備時(shí),通過(guò)兩臺(tái)暴露在公網(wǎng)環(huán)境的服務(wù)器與防火墻互備組合,利用反向代理提供負(fù)載均衡服務(wù)。網(wǎng)內(nèi)用戶訪問(wèn)公網(wǎng)設(shè)備時(shí),使用另外兩臺(tái)部署在公網(wǎng)NAT后面的服務(wù)器與防火墻互備組合,除了提供反向代理外,還設(shè)計(jì)了緩存機(jī)制,加快訪問(wèn)速度。
除上述公網(wǎng)、內(nèi)網(wǎng)互訪機(jī)制,單位還部署了自己的DNS服務(wù),通過(guò)定向解析的方式加速服務(wù),即:平臺(tái)的全部域名,在公網(wǎng)上正常解析公網(wǎng)地址;內(nèi)網(wǎng)用戶使用自己的DNS服務(wù),訪問(wèn)其他域名時(shí)正常轉(zhuǎn)發(fā)公網(wǎng)地址,訪問(wèn)這些域名時(shí)直接解析內(nèi)網(wǎng)地址。
平臺(tái)采用Centos6.8系統(tǒng),使用常規(guī)安裝的方法即可。兩塊系統(tǒng)磁盤(pán)使用RAID1部署,剩下的存儲(chǔ)磁盤(pán)使用RAID5部署;磁盤(pán)使用GPT分區(qū)方式,勿用MBR分區(qū);內(nèi)存為96GB,CPU使用E5-2650v3兩顆。
需要注意的是,Centos在自動(dòng)分區(qū)時(shí),會(huì)自動(dòng)分配/,/boot、/boot/efi三個(gè)數(shù)百兆字節(jié)的分區(qū)和swap分區(qū),然后剩下的全部磁盤(pán)空間自動(dòng)分配給/home。本平臺(tái)具有緩存功能,緩存文件存儲(chǔ)在/usr/local/nginx/proxy_cache/中,因此可以簡(jiǎn)單的將/home并入根目錄,或者修改分區(qū)方式,或者直接修改本文提供的源代碼。
Centos服務(wù)器本身倉(cāng)庫(kù)中有編譯好的nginx,但為滿足大眾化的需求,其已經(jīng)安裝好了很多組件,本平臺(tái)不需使用的多余組件只會(huì)影響安全性,因此需要定制化從源碼開(kāi)始調(diào)試。
本文僅涉及核心部分的調(diào)試,搭建Nginx服務(wù)還有很多細(xì)節(jié)需要調(diào)整,筆者編寫(xiě)了一個(gè)自動(dòng)部署項(xiàng)目,已經(jīng)以Leniy Tsan為昵稱開(kāi)源發(fā)布到了GitHub上,項(xiàng)目名為L(zhǎng)eniy/Install_Nginx,供參考。
(1) 首先創(chuàng)建nginx用戶和組
創(chuàng)建專門(mén)的nginx用戶,防止服務(wù)器腳本被提權(quán)。

(2) 安裝編譯環(huán)境

(3) Nginx源代碼編譯
使 用./configure編譯源代碼時(shí),需要指定用戶和組--user=nginx,--group=nginx,然后設(shè)置安裝目錄--prefix=/usr/local/nginx,--sbin-path=/usr/sbin/nginx,最 后 調(diào)用本平臺(tái)需要使用的如下模塊編 譯 :--with-http_stub_status_module,--withhttp_realip_module,--with-stream,--with-http_gzip_static_module,--with-http_sub_module,--http-proxy-temp-path=/usr/local/nginx/proxy_temp/,其它參數(shù)可自行定義。
(4) 配置Nginx
Nginx需要調(diào)試配置文件。在服務(wù)開(kāi)啟前需要通過(guò)chmod +w和chown -R設(shè)置www目錄權(quán)限。
然后將nginx設(shè)置為開(kāi)機(jī)自啟chkconfig nginx on并開(kāi)啟防火墻,只允許需要的端口通過(guò)。
5) 增強(qiáng)Nginx根目錄的安全并開(kāi)啟服務(wù)
通過(guò).user.ini中聲明open_basedir等參數(shù)限制基本目錄層級(jí),并設(shè)置此文件為chmod 644和chattr +i屬性。
完整的配置文件同樣開(kāi)源了,需要注意的是緩存部分的配置:

當(dāng)內(nèi)網(wǎng)訪問(wèn)公網(wǎng)服務(wù)的時(shí)候,需要將一些大文件緩存,加快訪問(wèn)速度,因此將名為content的緩存創(chuàng)建在了服務(wù)器的/usr/local/nginx/proxy_cache目錄中,即RAID5的六塊1.2TB SAS硬盤(pán),并設(shè)計(jì)了二層緩存目錄,文件超過(guò)1年未使用自動(dòng)刪除,最大緩存空間5TB。
當(dāng)公網(wǎng)訪問(wèn)內(nèi)網(wǎng)時(shí),不使用緩存策略,單獨(dú)進(jìn)行負(fù)載均衡轉(zhuǎn)發(fā)。
單位中有多種服務(wù)需要能夠在公網(wǎng)訪問(wèn)。暴露在公網(wǎng)環(huán)境的服務(wù)器與防火墻互備組合,具有相同的配置,由DNS同域名多IP解析進(jìn)行負(fù)載均衡。服務(wù)器利用反向代理連接內(nèi)網(wǎng)中的各個(gè)雙機(jī)熱備系統(tǒng)進(jìn)行負(fù)載均衡。以某個(gè)服務(wù)為例,某一臺(tái)公網(wǎng)服務(wù)器的nginx配置文件如下(此處端口和IP僅為示例,非真實(shí)端口):


這個(gè)nginx配置文件會(huì)將全部訪問(wèn)公網(wǎng)服務(wù)器9090端口的請(qǐng)求,輪詢的轉(zhuǎn)發(fā)到內(nèi)網(wǎng)100和200兩臺(tái)服務(wù)器的8080端口,并將這兩臺(tái)的響應(yīng)數(shù)據(jù)原路發(fā)回給用戶。
內(nèi)網(wǎng)訪問(wèn)公網(wǎng)的時(shí)候,為了加速并隔離業(yè)務(wù),將相應(yīng)的大文件緩存在服務(wù)器中。
為了防止公網(wǎng)網(wǎng)站出現(xiàn)訪問(wèn)故障,整個(gè)網(wǎng)站默認(rèn)情況下僅僅轉(zhuǎn)發(fā)不緩存,配置文件與上述類似,不使用upstream負(fù)載均衡的方法,如下所示(每個(gè)配置文件中都有三個(gè)與上面相同的proxy_set_header參數(shù),此處略過(guò)):

對(duì)于幾乎很難更改的文件,則使用前文中定義的content緩存空間:


以本項(xiàng)目為例,需要加速數(shù)十個(gè)企業(yè)網(wǎng)站,如果每個(gè)域名寫(xiě)一個(gè)配置文件,將會(huì)極大地加重維護(hù)成本,故而可以在配置文件中設(shè)置正則表達(dá)式批量匹配:

本項(xiàng)目的服務(wù)加速不使用upstream負(fù)載均衡,因此直接設(shè)置resolver 114.114.114.114即可。
在域名注冊(cè)商的NS服務(wù)器中為服務(wù)器集群配置雙聯(lián)路,以portal-1域名為例:

非權(quán)威應(yīng)答:

當(dāng)用戶訪問(wèn)portal-1的時(shí)候,DNS會(huì)輪詢的解析某一個(gè)公網(wǎng)地址,一旦某地址不可訪問(wèn),則僅僅解析另外一個(gè)地址。為了減少切換時(shí)間,同時(shí)考慮到服務(wù)器與電腦的DNS緩存,將TTL設(shè)為了120。
在第一部分概述中提到的三個(gè)目標(biāo)中,內(nèi)網(wǎng)加速與外網(wǎng)負(fù)載均衡第三部分已經(jīng)講到了,現(xiàn)在只需要讓內(nèi)網(wǎng)用戶直接訪問(wèn)內(nèi)網(wǎng)服務(wù)器即可。
用戶訪問(wèn)的業(yè)務(wù)全部通過(guò)域名提供服務(wù),如`portal-1.leniy.org A 1.1.1.1`表示將`portal-1`這個(gè)二級(jí)域名綁定了`1.1.1.1`這個(gè)公網(wǎng)地址,域名的NS服務(wù)發(fā)布在公網(wǎng)上,則公網(wǎng)上的用戶可以直接解析。但是為防止內(nèi)網(wǎng)用戶解析出公網(wǎng)地址,因此給用戶DHCP推送的DNS服務(wù)器是在內(nèi)網(wǎng)專門(mén)建立的。
DNS服務(wù)器使用Windows Server 2008 R2自帶的DNS服務(wù),直接添加正向查找zone區(qū)域,然后在里面添加需要解析的次級(jí)域名。為防止配置一個(gè)二級(jí)域名導(dǎo)致本域名下其他的三級(jí)域名無(wú)法轉(zhuǎn)發(fā)解析,現(xiàn)將各個(gè)多級(jí)域名分別單獨(dú)添加為一個(gè)zone,然后解析其@地址即可。核心代碼為:

其中192.168.100.50即前面提到的1.1.1.1這個(gè)公網(wǎng)地址的內(nèi)網(wǎng)地址。
本平臺(tái)的DNS需要讓全部用戶能夠自動(dòng)獲取到。我們使用BRAS進(jìn)行用戶身份認(rèn)證與IP池的分配,采用vbui用戶虛接口。
以平臺(tái)集群中某地的分節(jié)點(diǎn)為例,在BRAS上創(chuàng)建名為zhihuishequ的地址 池 :ip-pool pool-name zhihuishequ pool-id 3,然后設(shè)置接入域accessdomain yzzhihui。本地址池可以直接DHCP獲取,不需撥號(hào),因此不用配置VCC和AAA認(rèn)證,只需設(shè)置member 1 start-ip 10.0.0.1 endip 10.255.255.254。假設(shè)內(nèi)網(wǎng)的DNS服務(wù)器的內(nèi)網(wǎng)IP地址是192.168.100.60,則設(shè)置pppoe-dns-server 192.168.100.60即可實(shí)現(xiàn)目標(biāo)。
本項(xiàng)目上線以來(lái),業(yè)務(wù)量快速增加,特別是服務(wù)器集群中存儲(chǔ)的數(shù)據(jù)量越來(lái)越大。此時(shí)平臺(tái)網(wǎng)內(nèi)流量已經(jīng)達(dá)到8Gbps,出口雙方向流量300Mbps。隨著本平臺(tái)的上線,網(wǎng)內(nèi)用戶直接走內(nèi)網(wǎng)線路,訪問(wèn)直連公網(wǎng)網(wǎng)站大文件走緩存,節(jié)省了約1Gbps的帶寬,外網(wǎng)用戶通過(guò)Portal訪問(wèn),降低了業(yè)務(wù)宕機(jī)的風(fēng)險(xiǎn)并加強(qiáng)了安全防護(hù)。對(duì)整個(gè)項(xiàng)目的提升效果顯著。