引言:隨著互聯(lián)網(wǎng)業(yè)務(wù)的急速增加,越來越多的企業(yè)服務(wù)需要在保證內(nèi)網(wǎng)互聯(lián)的基礎(chǔ)上,進(jìn)行公網(wǎng)的交互訪問。這時對于業(yè)務(wù)的訪問加速、安全增強(qiáng)、穩(wěn)定性鞏固,就變得越來越重要。為了提升網(wǎng)絡(luò)安全,設(shè)計并部署了Protal+Cache集成服務(wù)。
隨著互聯(lián)網(wǎng)業(yè)務(wù)的急速增加,越來越多的企業(yè)服務(wù)需要在保證內(nèi)網(wǎng)互聯(lián)的基礎(chǔ)上,進(jìn)行公網(wǎng)的交互訪問。這時對于業(yè)務(wù)的訪問加速、安全增強(qiáng)、穩(wěn)定性鞏固,就變得越來越重要。以筆者單位為例,本地某平臺需要能夠在內(nèi)網(wǎng)環(huán)境下訪問公網(wǎng)上的某些資源,并且可以通過寬帶及手機(jī)流量訪問平臺中的某些信息。
為了提升網(wǎng)絡(luò)安全,我們沒有給相應(yīng)的服務(wù)器和終端提供直接的網(wǎng)絡(luò)環(huán)境,而是設(shè)計并部署了Protal+Cache集成服務(wù),并利用自己的DNS平臺為用戶提供網(wǎng)絡(luò)中繼,目前平臺已經(jīng)安全穩(wěn)定運(yùn)行半年。
整套平臺采用NGINX的proxy_pass和DNS解析作為核心,即反向代理功能與域名解析功能,整體網(wǎng)絡(luò)拓?fù)淙鐖D1所示,其中服務(wù)器集群分布式部署在各個縣區(qū)機(jī)房,防火墻與DNS服務(wù)統(tǒng)一放置在市級機(jī)房。
圖1 平臺網(wǎng)絡(luò)拓?fù)鋱D
網(wǎng)內(nèi)擁有多臺互為備份的服務(wù)器,當(dāng)公網(wǎng)用戶訪問網(wǎng)內(nèi)設(shè)備時,通過兩臺暴露在公網(wǎng)環(huán)境的服務(wù)器與防火墻互備組合,利用反向代理提供負(fù)載均衡服務(wù)。網(wǎng)內(nèi)用戶訪問公網(wǎng)設(shè)備時,使用另外兩臺部署在公網(wǎng)NAT后面的服務(wù)器與防火墻互備組合,除了提供反向代理外,還設(shè)計了緩存機(jī)制,加快訪問速度。
除上述公網(wǎng)、內(nèi)網(wǎng)互訪機(jī)制,單位還部署了自己的DNS服務(wù),通過定向解析的方式加速服務(wù),即:平臺的全部域名,在公網(wǎng)上正常解析公網(wǎng)地址;內(nèi)網(wǎng)用戶使用自己的DNS服務(wù),訪問其他域名時正常轉(zhuǎn)發(fā)公網(wǎng)地址,訪問這些域名時直接解析內(nèi)網(wǎng)地址。
平臺采用Centos6.8系統(tǒng),使用常規(guī)安裝的方法即可。兩塊系統(tǒng)磁盤使用RAID1部署,剩下的存儲磁盤使用RAID5部署;磁盤使用GPT分區(qū)方式,勿用MBR分區(qū);內(nèi)存為96GB,CPU使用E5-2650v3兩顆。
需要注意的是,Centos在自動分區(qū)時,會自動分配/,/boot、/boot/efi三個數(shù)百兆字節(jié)的分區(qū)和swap分區(qū),然后剩下的全部磁盤空間自動分配給/home。本平臺具有緩存功能,緩存文件存儲在/usr/local/nginx/proxy_cache/中,因此可以簡單的將/home并入根目錄,或者修改分區(qū)方式,或者直接修改本文提供的源代碼。
Centos服務(wù)器本身倉庫中有編譯好的nginx,但為滿足大眾化的需求,其已經(jīng)安裝好了很多組件,本平臺不需使用的多余組件只會影響安全性,因此需要定制化從源碼開始調(diào)試。
本文僅涉及核心部分的調(diào)試,搭建Nginx服務(wù)還有很多細(xì)節(jié)需要調(diào)整,筆者編寫了一個自動部署項目,已經(jīng)以Leniy Tsan為昵稱開源發(fā)布到了GitHub上,項目名為Leniy/Install_Nginx,供參考。
(1) 首先創(chuàng)建nginx用戶和組
創(chuàng)建專門的nginx用戶,防止服務(wù)器腳本被提權(quán)。
(2) 安裝編譯環(huán)境
(3) Nginx源代碼編譯
使 用./configure編譯源代碼時,需要指定用戶和組--user=nginx,--group=nginx,然后設(shè)置安裝目錄--prefix=/usr/local/nginx,--sbin-path=/usr/sbin/nginx,最 后 調(diào)用本平臺需要使用的如下模塊編 譯 :--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ù)開啟前需要通過chmod +w和chown -R設(shè)置www目錄權(quán)限。
然后將nginx設(shè)置為開機(jī)自啟chkconfig nginx on并開啟防火墻,只允許需要的端口通過。
5) 增強(qiáng)Nginx根目錄的安全并開啟服務(wù)
通過.user.ini中聲明open_basedir等參數(shù)限制基本目錄層級,并設(shè)置此文件為chmod 644和chattr +i屬性。
完整的配置文件同樣開源了,需要注意的是緩存部分的配置:
當(dāng)內(nèi)網(wǎng)訪問公網(wǎng)服務(wù)的時候,需要將一些大文件緩存,加快訪問速度,因此將名為content的緩存創(chuàng)建在了服務(wù)器的/usr/local/nginx/proxy_cache目錄中,即RAID5的六塊1.2TB SAS硬盤,并設(shè)計了二層緩存目錄,文件超過1年未使用自動刪除,最大緩存空間5TB。
當(dāng)公網(wǎng)訪問內(nèi)網(wǎng)時,不使用緩存策略,單獨(dú)進(jìn)行負(fù)載均衡轉(zhuǎn)發(fā)。
單位中有多種服務(wù)需要能夠在公網(wǎng)訪問。暴露在公網(wǎng)環(huán)境的服務(wù)器與防火墻互備組合,具有相同的配置,由DNS同域名多IP解析進(jìn)行負(fù)載均衡。服務(wù)器利用反向代理連接內(nèi)網(wǎng)中的各個雙機(jī)熱備系統(tǒng)進(jìn)行負(fù)載均衡。以某個服務(wù)為例,某一臺公網(wǎng)服務(wù)器的nginx配置文件如下(此處端口和IP僅為示例,非真實端口):
這個nginx配置文件會將全部訪問公網(wǎng)服務(wù)器9090端口的請求,輪詢的轉(zhuǎn)發(fā)到內(nèi)網(wǎng)100和200兩臺服務(wù)器的8080端口,并將這兩臺的響應(yīng)數(shù)據(jù)原路發(fā)回給用戶。
內(nèi)網(wǎng)訪問公網(wǎng)的時候,為了加速并隔離業(yè)務(wù),將相應(yīng)的大文件緩存在服務(wù)器中。
為了防止公網(wǎng)網(wǎng)站出現(xiàn)訪問故障,整個網(wǎng)站默認(rèn)情況下僅僅轉(zhuǎn)發(fā)不緩存,配置文件與上述類似,不使用upstream負(fù)載均衡的方法,如下所示(每個配置文件中都有三個與上面相同的proxy_set_header參數(shù),此處略過):
對于幾乎很難更改的文件,則使用前文中定義的content緩存空間:
以本項目為例,需要加速數(shù)十個企業(yè)網(wǎng)站,如果每個域名寫一個配置文件,將會極大地加重維護(hù)成本,故而可以在配置文件中設(shè)置正則表達(dá)式批量匹配:
本項目的服務(wù)加速不使用upstream負(fù)載均衡,因此直接設(shè)置resolver 114.114.114.114即可。
在域名注冊商的NS服務(wù)器中為服務(wù)器集群配置雙聯(lián)路,以portal-1域名為例:
非權(quán)威應(yīng)答:
當(dāng)用戶訪問portal-1的時候,DNS會輪詢的解析某一個公網(wǎng)地址,一旦某地址不可訪問,則僅僅解析另外一個地址。為了減少切換時間,同時考慮到服務(wù)器與電腦的DNS緩存,將TTL設(shè)為了120。
在第一部分概述中提到的三個目標(biāo)中,內(nèi)網(wǎng)加速與外網(wǎng)負(fù)載均衡第三部分已經(jīng)講到了,現(xiàn)在只需要讓內(nèi)網(wǎng)用戶直接訪問內(nèi)網(wǎng)服務(wù)器即可。
用戶訪問的業(yè)務(wù)全部通過域名提供服務(wù),如`portal-1.leniy.org A 1.1.1.1`表示將`portal-1`這個二級域名綁定了`1.1.1.1`這個公網(wǎng)地址,域名的NS服務(wù)發(fā)布在公網(wǎng)上,則公網(wǎng)上的用戶可以直接解析。但是為防止內(nèi)網(wǎng)用戶解析出公網(wǎng)地址,因此給用戶DHCP推送的DNS服務(wù)器是在內(nèi)網(wǎng)專門建立的。
DNS服務(wù)器使用Windows Server 2008 R2自帶的DNS服務(wù),直接添加正向查找zone區(qū)域,然后在里面添加需要解析的次級域名。為防止配置一個二級域名導(dǎo)致本域名下其他的三級域名無法轉(zhuǎn)發(fā)解析,現(xiàn)將各個多級域名分別單獨(dú)添加為一個zone,然后解析其@地址即可。核心代碼為:
其中192.168.100.50即前面提到的1.1.1.1這個公網(wǎng)地址的內(nèi)網(wǎng)地址。
本平臺的DNS需要讓全部用戶能夠自動獲取到。我們使用BRAS進(jìn)行用戶身份認(rèn)證與IP池的分配,采用vbui用戶虛接口。
以平臺集群中某地的分節(jié)點(diǎn)為例,在BRAS上創(chuàng)建名為zhihuishequ的地址 池 :ip-pool pool-name zhihuishequ pool-id 3,然后設(shè)置接入域accessdomain yzzhihui。本地址池可以直接DHCP獲取,不需撥號,因此不用配置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即可實現(xiàn)目標(biāo)。
本項目上線以來,業(yè)務(wù)量快速增加,特別是服務(wù)器集群中存儲的數(shù)據(jù)量越來越大。此時平臺網(wǎng)內(nèi)流量已經(jīng)達(dá)到8Gbps,出口雙方向流量300Mbps。隨著本平臺的上線,網(wǎng)內(nèi)用戶直接走內(nèi)網(wǎng)線路,訪問直連公網(wǎng)網(wǎng)站大文件走緩存,節(jié)省了約1Gbps的帶寬,外網(wǎng)用戶通過Portal訪問,降低了業(yè)務(wù)宕機(jī)的風(fēng)險并加強(qiáng)了安全防護(hù)。對整個項目的提升效果顯著。