

摘要:隨著企業數字化和互聯網發展,企業內部系統訪問互聯網服務的需求日益增長,相較于直接開放互聯網訪問權限,正向代理系統具有更好的安全性和管控能力。然而,隨著在線服務逐漸HTTPS化,代理系統又缺少服務器證書,設計正向代理系統面臨著更大的困難。為應對這一挑戰,文章設計并實現了一種基于開源軟件Nginx的HTTPS正向代理系統,在無需服務器證書的情況下實現了高效轉發,并具備HTTPS域名端口復用、域名白名單、源IP地址訪問控制等多種功能,為企業內部系統訪問互聯網HTTPS服務提供了安全、全面的解決方案。
關鍵詞:Nginx;正向代理;HTTPS;SNI;SSL Preread
中圖分類號:TP393.08" 文獻標志碼:A
作者簡介:劉旻昊(1985— ),男,高級工程師,碩士;研究方向:網絡接入與傳輸。
0" 引言
近年來,隨著企業數字化和互聯網服務的飛速發展,企業內部系統調用互聯網服務的需求變得越來越頻繁和強烈,如何讓內部系統安全、高效地訪問互聯網服務,是眾多企業面臨的挑戰。如果直接開放內部服務器的互聯網訪問權限,將帶來多種安全風險,相比之下,正向代理系統能提供更好的訪問控制、流量管理和安全保障,具有明顯的優勢。然而,隨著互聯網的迅猛發展,越來越多的在線服務開始采用超文本傳輸安全協議(Hypertext Transfer Protocol Secure,HTTPS)協議[1],由于HTTPS通信過程需要驗證服務器的身份證書,而企業自身一般沒有需訪問的互聯網域名的證書,無法使用通用的四七層SSL代理模式解密流量,因此HTTPS的普及給企業設計正向代理系統帶來了更大的難度。
1" 系統設計思路
HTTPS正向代理系統的設計思路以適應HTTPS流量代理轉發的關鍵技術選型為核心展開,基本思想是利用域名解析將內部系統訪問互聯網接口的HTTPS加密流量引流傳輸至正向代理系統,通過選取合適的軟件和技術,以實現正向代理系統在無需服務器證書情況下能夠獲取域名信息,從而轉發至互聯網HTTPS接口。
1.1" 技術需求
伴隨著技術進步、政策倡導和大型互聯網公司的推動,互聯網已實現了HTTPS的廣泛應用,據網絡技術調查網站W3Techs的最新數據,在其監測的數百萬個互聯網網站中,已經有85.7%默認使用了HTTPS協議[2]。HTTPS使用SSL/TLS加密技術以確保用戶與服務器之間的通信過程不受第三方的竊聽、篡改或冒充。
另一方面,正向代理系統作為常見的企業內部網絡安全架構,代理服務器充當企業內部和外部網絡間的中介,將內部請求轉發至外部服務器并將響應返回。相比直接開放訪問外部網絡資源權限,正向代理系統在安全性上具有明顯優勢,它能集中管理和控制對外訪問流量,并加以審計,更合理地分配權限,防止敏感數據泄露,還可以對經過的流量加以控制和過濾,降低惡意軟件和網絡攻擊的風險。
由于HTTPS的普及,企業內部系統在調用互聯網外部服務時,通常需要直接使用HTTPS協議訪問,而且不同的系統需訪問多個不同的域名。此外,如果是使用第三方服務商提供的軟件開發工具包(Software Development Kit,SDK),還可能出現協議、域名和端口均無法更改的情況,因此,在設計一個理想、完備的HTTPS正向代理系統時,需盡量滿足如下功能需求:(1)內部訪問源服務器無需修改訪問域名、協議和端口;(2)支持多域名復用,即可以同時代理多個不同域名的HTTPS請求流量。(3)無需代理的互聯網域名的服務器證書。
除了功能需求外,為了提高正向代理系統的安全性,還須進一步考慮如下2個方面的安全需求:(1)域名白名單控制,按照權限最小化原則,正向代理系統應能實現對代理域名的精準控制,除了確需訪問的域名外,內部服務器使用其他互聯網域名訪問正向代理系統時,不應被順利通過。(2)源IP地址訪問控制,在域名白名單的基礎上,可以進一步收縮訪問權限,除了允許的內部服務器IP地址外,正向代理系統不允許其他服務器訪問。
1.2" 關鍵技術點研究
1.2.1" 代理軟件選型
代理軟件選型是整個正向代理系統設計的核心,該軟件需同時具備優秀的性能和強大的代理功能,經過對主流代理軟件的研究,文章選取了開源軟件Nginx搭建系統。Nginx是一款高性能、高并發的開源Web服務器軟件,自2004年發布以來,它憑借其輕量級、穩定性和高效性被廣泛應用于大型網站和互聯網服務提供商,據W3Techs網站數據,截至2024年5月,Nginx以34.2%的使用率位居全球使用量最高的Web服務器[3]。Nginx不僅能在高并發環境下實現優秀的性能和低延遲[4],而且具備強大且多樣化的代理功能,同時支持四層和七層代理模式。在四層代理中,Nginx可負責TCP和UDP流量的轉發;在七層代理中,Nginx可針對HTTP和HTTPS協議提供代理服務。
1.2.2" HTTPS加密流量的識別
HTTPS通信過程從客戶端向服務器發起請求開始,雙方通過握手協議協商加密算法、交換密鑰,并驗證服務器的身份證書,在客戶端和服務器之間建立了一個安全的加密通道,通道建立后,客戶端和服務器可在此基礎上進行加密數據的傳輸,以確保數據傳輸過程的機密性、完整性和可靠性。如前文所述,正向代理系統本身并沒有代理的互聯網域名的服務器SSL證書,因此無法直接以通用的SSL配置方式將代理的HTTPS加密流量進行解密,查看其內容,如何識別HTTPS加密流量并正確轉發是關鍵的技術難點。
為解決該問題,文章利用了一種擴展安全傳輸層協議(Transport Layer Security,TLS)和SSL協議的技術——服務器名稱指示協議(Server Name Indication,SNI),其主要目的是解決在同一IP地址和端口上托管多個域名的SSL/TLS證書的問題[5]。其技術原理是在客戶端與服務器建立SSL/TLS連接時,客戶端在ClientHello消息中攜帶SNI字段,指明所請求的域名,使得服務器能在不解密整個SSL/TLS連接的情況下獲取客戶端請求的域名信息,從而根據請求的域名提供相應的證書。
要在Nginx軟件中讀取SNI信息,須要利用SSL預讀取(SSL Preread)技術,它是一種TLS協議的擴展,Nginx在1.11.5版本中引入了該功能,用于解析客戶端流量中的ClientHello消息,提取SNI字段后,Nginx就能獲取客戶端請求的域名信息,并根據該信息將傳入的SSL/TLS連接路由到適當的后端服務器。這樣,不僅實現了無服務器證書場景下的HTTPS加密流量識別與代理,還避免了Nginx對整個SSL/TLS連接進行解密,降低了計算開銷,簡化了證書管理,非常適用于處理大量加密流量的正向代理應用場景。
2" 系統設計
文章設計的基于Nginx的HTTPS正向代理系統總體架構如圖1所示。
該系統主要由以下幾個主要組件組成。hosts/內部DNS引流:該組件可通過2種方式實現,可以在企業內部服務器上配置hosts,也可以利用內部的DNS服務器,目的是將內部服務器需要訪問的互聯網域名解析至Nginx正向代理系統的IP,從而讓HTTPS流量經過正向代理系統。Nginx正向代理軟件:Nginx軟件的主要功能為接收SSL加密流量,利用SSL Preread功能提取客戶端請求的域名信息,隨后以四層模式轉發至互聯網的對應域名服務。Nginx服務器集群負載:為保證正向代理系統的健壯服務,可通過多種方式搭建Nginx服務器集群的負載均衡,比如利用企業內部的硬件負載均衡設備實現多臺Nginx正向代理服務器的流量均衡分配,或使用開源的Keepalived軟件實現2臺Nginx服務器的高可用方案。
3" 技術實現
3.1" 環境準備
實驗環境:操作系統Centos 7.9,Nginx 1.24.0,Keepalived 1.3.5。
服務器IP、端口規劃如表1所示。
內部應用服務器1須訪問互聯網https://a.com資源,內部應用服務器2須訪問互聯網https://b.com資源。
3.2" 安裝配置Nginx軟件
3.2.1" 安裝Nginx所需的依賴lib庫
包括PCRE、zlib和OpenSSL庫以及它們的開發包,命令如下:
sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel
3.2.2" 編譯安裝
從https://Nginx.org/官網下載Nginx 1.24.0軟件源碼包,解壓后編譯,由于要使用四層模式處理SSL流量,并啟用SSL Preread功能,需要在編譯參數中啟用相關2個模塊,具體步驟如下:
#tar -xzf Nginx-1.24.0.tar.gz
#cd Nginx-1.24.0/
#./configure" --prefix=/usr/local/Nginx --with-stream --with-stream_ssl_preread_module
#make amp;amp; make install
3.2.3" Nginx代理功能配置
在Nginx主配置文件Nginx.conf底部新增如下配置,即可啟用stream_ssl_preread_module模塊,實現讀取SNI信息并轉發。
#vi /usr/local/Nginx/conf/Nginx.conf
…
#HTTPS正向代理
server {
#監聽443端口的流量
listen 443;
#設置DNS服務器,用于對互聯網域名的解析
resolver 114.114.114.114 valid=600s;
# 設置代理超時
proxy_connect_timeout 15s;
proxy_timeout 15s;
# 使用SSL Preread模塊進行SNI解析
ssl_preread on;
#根據ssl_preread域名轉發SSL流量
proxy_pass $ssl_preread_server_name:$server_port;
}
3.2.4" Nginx安全配置
(1)域名白名單。
在Nginx中,map指令功能可用于創建一個基于輸入變量值的映射,以便根據請求信息動態地設置輸出變量。在四層代理stream上下文中,它是由ngx_stream_map_module模塊提供的。為了設置正向代理的域名白名單,可以按如下方式使用map指令,實現的效果為當白名單之外的域名SSL流量到達Nginx時,Nginx會立刻關閉連接,不再轉發。將如下內容增加至Nginx.conf中的stream段中:
#---設置允許代理的域名白名單
map $ssl_preread_server_name $allowed_hosts
{
a.com" a.com:443;" #a.com正常轉發
b.com" b.com:443;" #b.com正常轉發
default" 127.0.0.1∶18443;" #其他域名轉發給本機18443端口
}
#---拒絕白名單之外的域名流量
server {
listen 18443;
return 444;" #關閉連接
}
同時,將監聽443端口的server段中的轉發指令配置修改如下:
server {
listen 443;
…
#根據域名白名單轉發流量
proxy_pass $allowed_hosts;
…
}
(2)源IP地址訪問控制列表。
基于ngx_stream_access_module模塊,Nginx可配置IP訪問控制列表[6],利用allow和deny指令,加上IP地址和掩碼,即可實現靈活的配置,具體配置方法為在Nginx.conf中stream段中監聽443端口的server段里新增如下配置:
server {
listen 443;
…
#設置IP訪問控制列表,僅允許2臺內部服務器訪問
allow 192.168.1.1/32;
allow 192.168.1.2/32;
deny all;
…
}
3.2.5" 啟動Nginx
#/usr/local/Nginx/sbin/Nginx
3.3" 安裝配置Keepalived
文章使用開源軟件Keepalived方式搭建Nginx服務器的雙機高可用集群。
3.3.1" 安裝Keepalived
#yum -y install keepalived
3.3.2" 配置Keepalived高可用虛擬IP
按照IP規劃,在Nginx正向代理服務器上分別配置角色、優先級和高可用虛擬IP:
#vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
…
state MASTER" #服務器1設為MASTER,服務器2為BACKUP
priority 100" #服務器1設為100,服務器2設為80,值越大優先級越高
virtual_ipaddress {
192.168.2.10" #VRRP高可用虛擬IP
}
}
3.3.3" 啟動Keepalived
#systemctl enable keepalived.service amp;amp; systemctl start keepalived.service
可通過ip addr命令觀察高可用虛擬IP的生效情況,正常情況下僅在主機上生效。
3.4" 配置hosts文件實現DNS引流
根據規劃,在內部應用服務器1上/etc/hosts文件中配置如下hosts條目:
192.168.2.10 a.com
同理,在內部應用服務器2上/etc/hosts文件中配置如下hosts條目:
192.168.2.10 b.com
配置完成后,即可在2臺內部應用服務器上分別通過curl或wget命令測試https請求的連通性,驗證返回的內容。
4" 結語
文章提出的基于Nginx的HTTPS正向代理系統不僅有效解決了企業內部服務器在缺少服務器證書的情況下代理訪問互聯網HTTPS資源的代理難題,而且通過合理選擇和使用Nginx各模塊的功能,實現了多域名復用端口、域名白名單和源IP地址訪問控制等多種功能,有力提升了企業內部的網絡安全。
參考文獻
[1]張濤濤.HTTPS安全性討論[J].中國科技信息,2021(2):73-74.
[2]W3Techs.Usage statistics of Default protocol https for websites[EB/OL].(2024-05-20)[2024-05-20].https://w3techs.com/technologies/details/ce-httpsde fault.
[3]W3Techs.Usage statistics and market shares of web servers[EB/OL].(2024-05-19)[2024-05-20].https://w3techs.com/technologies/overview/web_server.
[4]戴偉,馬明棟,王得玉.基于Nginx的負載均衡技術研究與優化[J].計算機技術與發展,2019(3):77-80.
[5]毛偉杰,李永忠.基于SNI的加密流量檢測在蜜罐中的研究與應用[J].信息技術,2021(8):97-101.
[6]劉旻昊.Nginx服務器“秘籍”[J].中國傳媒科技,2018(4):13-14.
(編輯" 王永超)
Design and implementation of an HTTPS forward proxy system based on Nginx
LIU" Minhao, CHENG" Peng, WEI" Haitao, WANG" Meng, LI" Qian
(Xinhua News Agency, Beijing 100803, China)
Abstract:" As the digitalization of enterprises and the expansion of Internet services continue, the demand for secure and efficient access to Internet services by internal systems has grown significantly. In contrast to directly granting Internet access permissions to internal servers, forward proxy systems offer enhanced security and management capabilities. Nevertheless, the widespread adoption of HTTPS in online services, coupled with the lack of server certificates, poses substantial challenges in designing forward proxy systems. In response to these challenges, this study presents the design and implementation of an HTTPS forward proxy system based on the open-source software Nginx. The proposed system enables efficient traffic forwarding without necessitating server certificates, while incorporating features such as HTTPS domain port reuse, domain-level whitelisting, and source IP address access control. Consequently, this solution provides a secure and comprehensive approach for enterprise internal systems to access Internet-based HTTPS services.
Key words: Nginx; forward proxy; HTTPS; SNI; SSL Preread