釣魚?這是反代理!

wyzsk發表於2020-08-19
作者: wrfly · 2015/06/16 11:30

0x00 前言


我是學弟。

進入正題之前,感謝那些分享知識的前輩們,我在參考了他們的文章之後學習到了很多東西。

奉上詳細連結:

Nginx反向代理、負載均衡、頁面快取、URL重寫及讀寫分離詳解

Nginx官方文件

nginx反向代理配置

排程演算法

其中第一篇已經寫的很詳細了,有關正向代理,反向代理的介紹什麼的;第二篇是nginx的官方文件,也是最最詳細和標準的一個;第三篇是我參考的檔案,第一遍當然看不懂,但是理解了每句話的內容之後也就明白了,下面的評論也挺搞笑的~。

0x01 簡介


那我們就開始步入正題吧!

關於學習,無非就是,是什麼,為什麼,和怎樣做。

是什麼?

首先說明反向代理(reverse proxy)是什麼,但是在這之前要先說明正向代理是什麼,沒錯,真有正向代理(proxy)。

我們平時所說的代理就是正向代理,最常見的就是QQ代理,和VPN代理,以前的QQ主登陸介面的背面都會藏著一些設定選項,最醒目的就是代理,什麼http代理啊,socks代理啊,https代理啊,我覺得這個功能是提供給那些在公司裡面上不了QQ的人準備的,為什麼上不了QQ?老闆不讓唄!所以就出現了“代理”這個工具,包括現在,也有很多網站提供免費的線上代理(我不是來打廣告噠!),有匿名的,也有非匿名的,但是安全性,嘿嘿,真不好說。

代理的過程大概是這個樣子的:

我上不了QQ,但是你可以上,所以我就把資料包發給你,你再幫我把資料包轉給QQ伺服器,當QQ伺服器返回訊息的時候,你再返回給我,這樣你就充當了一箇中間人的角色,也就是,代理。並不是多麼難理解,就跟小時候傳紙條差不多,中間傳遞的那個傢伙就是我們的代理。當然,被老師抓到的也是他,不過,他也是有可能把你供出來的。所以在這裡也提醒一下各位小黑闊們(海倫請無視),天網恢恢,疏而不漏,別以為掛了代理就找不到你了哦。

那麼什麼是反向代理?

有這樣一種場景,你可以訪問QQ的網站,但是我不行,我只能訪問360的網站(先不要管為什麼了)。但是我們之間的通訊是暢通的,也就是說,我可以訪問你的網站,那麼,我該如何訪問QQ呢?當然,我可以透過你這個跳板去上網,比如在你上面弄弄弄個VPN啊,ssh啊,但是如果你不讓我這樣做呢?你只開放了80埠給我,也就是說,我只能從你這裡得到WWW的服務,這可如何是好?(不要問我為什麼非要上QQ!)那麼有一種辦法就是你把QQ的內容抓取下來,放到80埠給我看,也就是說,我間接地透過你上了QQ。而你呢,就充當了反向代理的角色。注意,這裡是間接上網,我表面上是訪問的你,但是你再後端把QQ給抓過來了,所以,實質上我還是訪問的QQ,這樣說應該就會很好理解了。

0x02 為什麼?


那麼,為什麼需要用反向代理呢?

1.伺服器群的負載均衡

你有很多伺服器對外提供服務,雖然說提供的服務都是一樣的,但是每臺伺服器都有自己的IP啊,你不可能只讓一臺工作吧,那麼怎樣才能透過一個網址來調動所有的伺服器都對外工作呢?這就需要反向代理了,設立一臺主機對外開放,剩餘的那些作為伺服器群在後端負責處理資料,然後,當有請求傳送到對外開放的主機上面時,這臺主機就會透過演算法去調動在後端的主機處理資料,然後把結果返回給客戶,這樣這臺主機就僅僅起到了一個前臺的作用,髒活累活什麼的就交給了後面的那群主機們幹了~前臺作為排程員,是有責任處理好這些事務的,剛才說道透過演算法進行處理,那麼,究竟是什麼演算法呢?客官且聽我慢慢說來。

[靜態方法:僅根據演算法本身實現排程:][a]

  • Round-robin(輪迴排程)

    我有十臺肉雞,啊不,是伺服器,每臺伺服器的效能都差不多,所以我就採用了這個輪迴查詢演算法,每當有新的業務進來了,前臺的排程員就會每臺伺服器每臺伺服器的給分配任務,不會偏袒著誰,因為是按照次序來的,1號有任務就分給是2號,2號完了是3號,3號完了就讓4號上,但是,如果4號要是掛了呢?這就需要我們設定一個fail_timeout,意思是如果伺服器在這個時間裡沒能應答或者啥的,就把任務再分配給下一臺肉雞,啊不,主機。

  • Weighted round-robin(加權輪迴排程)

    還是那十臺主機,但是有的是Digitalocean的,有的是阿里雲的,有的用的是SSD,有的還tm用軟盤,有的CPU用的是i7,有的用的是8086...效能不一樣啊!要是按照上面的輪迴演算法,讓一個超級電腦去等一臺記憶體只有512M虛擬機器,不能忍!所以,這時候就需要給我們的電腦加權了。好電腦就把權值分配的大一點,渣主機就把權值寫小一點。這樣前臺在排程的時候就會按照他們的權值進行分配,主機A更快,那我就給他多分配點任務,主機B比較慢,那我分配任務的時候就少點。如果你還有興趣瞭解,請谷歌“Weighted round-robin”。

  • Source ip Hashing(源地址雜湊排程)

    通俗點講就是按照你的IP地址給你hash一個主機,然後這臺主機就為你服務了,這種演算法的優點是什麼的?很明顯的一對一金牌服務嘛!記得有一次CTF,出題的妖怪在後臺部署了好多好多伺服器,上傳shell每次都會到不同的主機上,那麼,你猜他們用的是什麼排程方法?沒錯,反正不是這種。那麼如果巧了,同一時間好多工都給了一臺主機,而這臺主機又沒反應咋弄?排程員也不是傻X,當伺服器沒有正常反應的時候,他就會給下一臺主機分配這個任務了,涉及到很多演算法的問題吧,我想。

  • Destination ip Hashing(目標地址雜湊排程)

    這種排程方法主要應用在快取服務上面,如果好多主機訪問的是同一臺主機,那麼前臺排程員就會把這些主機看成同一類,把他們統統交給某一臺伺服器,怎麼說呢,跟上面的雜湊溯源正好相反著的,上面是一對一的服務,下面是一對多的服務。反正是快取伺服器嘛,效能肯定棒棒的,讓他多做點事情也是沒問題的。

動態方法:根據演算法及後端RS當前的負載狀況實現排程:

啊發現這些東西已經跑題了,所以各位看官有興趣瞭解的話就不要聽我在這裡白活了,連結上面有哦~ 雖然那些文字看起來皺巴巴的 =。=

2. 海外代理

這就跟海外代購差不多的,我想買化妝品,但是國內沒有啊,我就讓代購去買,買完了給我就行了。放在伺服器上呢,比如說,我想上谷歌,但是偉大的防火牆不讓啊,所以我就交給海外的一臺主機,讓它幫我訪問谷歌,然後我在向這臺主機請求資源,這樣就達到了訪問谷歌的目的。https://google.kfd.me上面的站是我搭建的google。

“哎等會兒,你說的這個反向代理和VPN啥的有什麼區別,還有我用的Shadowsocks,Goagent,不也都可以實現這種功能嗎?”

哦。

那我就來扯一扯他們之間的區別。要是讓我詳細講,估計一天也講不完(其實是不會QAQ)。那我就簡單粗略的給大家說一下有啥不同。首先說下VPN,VPN可以理解為一條虛擬的網線,我上不去谷歌,但是我遠在日本的女朋友可以上啊,所以我就讓女朋友答了一個VPN伺服器,我呢,就透過VPN這條虛擬的網線連線上了女朋友的電腦,當然就可以上谷歌啦,不僅可以上谷歌,而且還可以……嘿嘿嘿。

那麼,shadowsocks和goagent呢,他們都是代理軟體,原理類似於上面講到的正向代理,但是,代理的主機是127.0.0.1,也就是你自己的主機,如果在瀏覽器上設定了代理的話,那麼你瀏覽器的流量都會先在本機走一圈,也就是透過那些shadowsocks啊goagent啊走一遍,而goagent呢,是連線了外網的傢伙,我這裡的外網,指的是out of China 的網,當然,在國內部署Goagent也不是不可以,只是你上不了谷歌而已,上上百度啊,QQ啊,360啊還都是可以的。Goagent會把流經它的資料轉發到你部署的伺服器上,在透過伺服器進行資源請求。我之前也寫過一篇關於goagent的,感興趣的可以看一下。Shadowsocks的原理類似,不在贅述。

0x03 怎樣做?


基本的配置Nginx我就不說了,網上一搜一大把,我在這裡囉囉嗦嗦,大家也覺著沒意思。如果說有什麼需要注意的,那可能就是注意代理谷歌的時候不要被牆了你的域名。(我簡直就是在作死……)

然後,我也不想做一個搬運工,把那些長篇大論以及圖片複製貼上過來,所以我就直接貼出配置文件以供大家參考,如果你把這份配置放在伺服器上的話,你也會得到一個谷歌的反向代理以造福國人。順便說下,kfd.me 這個域名是我的。

proxy_cache_path /var/www/cache/ levels=1:2 keys_zone=one:100m max_size=1g;
proxy_cache_key $host$request_uri;

upstream google{
server 74.125.200.103 max_fails=3 fail_timeout=10s;
server 74.125.200.105 max_fails=3 fail_timeout=10s;
server 74.125.200.99 max_fails=3 fail_timeout=10s;
server 74.125.200.147 max_fails=3 fail_timeout=10s;
server 74.125.200.104 max_fails=3 fail_timeout=10s;
}

server {
    listen 80;
    server_name google.kfd.me;
#   rewrite ^/(.*) https://google.kfd.me$1 permanent;
#}

#server {
#   listen 443;
#   server_name google.kfd.me;
#   ssl on;
#   ssl_certificate /etc/ssl/private/google_kfd_me.crt;
#   ssl_certificate_key /etc/ssl/private/kfd_me.key;

    location / {
    proxy_pass http://google;
    proxy_cache one;
    proxy_cache_valid  200 302 2h;
    proxy_cache_valid  404 1h;

    proxy_buffering off;

    proxy_cookie_domain google.com google.kfd.me;
    proxy_redirect https://www.google.com.sg/ /;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Accept-Encoding "";
    proxy_set_header User-Agent $http_user_agent;
    proxy_set_header Accept-Language "zh-CN";
    proxy_set_header Cookie "PREF=ID=047818f19f6de346:U=0f622f33dd8549d11:FF=25:LD=zh-CN:NW=1:TM=1325238577:LM=1332342444:GM=5:SG=1:S=rE01SyJh2w1IQ-Maw";

    sub_filter www.google.com google.kfd.me;
    sub_filter_once off;
    }
}

下面就詳細的解釋一下每句話的作用,其實也就是口頭翻譯下官方文件(⊙﹏⊙b汗)

上面的兩句是用來配置快取目錄的,首先定義了一個快取目錄,然後設定了目錄的級別,也就是說,可以有幾層目錄keys_zone這個是設定空間名稱的,可以隨便定義,但是在下面引用的時候名字必須相同,而且要唯一。100m代表100分鐘,快取時間。最後的1g是代表快取的總大小。 key代表的是透過什麼方式來定義快取,這裡用的是主機名+url地址來確定的。這樣每次有主機訪問反代理的時候都會先查詢一下這個快取檔案,如果有的話就不再請求新的資源。下面是快取資料夾的一個tree。

cache

這個upstream google,表示的是上游伺服器們,google只是一個代號,你完全可以寫成guge,只要你知道這是什麼意思就行了,而且下面引用的時候不要引用錯。下面引用的條目是 proxy_pass。在這個欄目裡面我們要寫的是伺服器的ip,其實你寫網址也行,畢竟解析的都是ip。然後這裡要注意的是裡面的排程演算法,這裡面可以說是大有學問,我在[上面][a]講的只是一點點皮毛而已。“max_fails=3” -> 最多允許三次失敗。三次失敗過後預設伺服器掛掉,並將請求轉入下一個伺服器。 fail_timeout=10s -> 失敗的時間為10秒。由於俺代理的是谷歌,而且谷歌的伺服器這麼堅挺,絕壁不會down,所以這裡寫上去也就沒什麼太大的鳥用。僅作教學示範~

proxy_pass 這一條是最最重要的,別的可以什麼都沒有,但是這一條是作為反向代理最重要的,它後面跟的值就是你要代理的網址,我這裡的google是引用了上面定義的那些server,如果不需要那些server,你也可以直接放一個網址在這裡,比如,http://zh.wikipedia.org/wiki/ 然後他就會訪問這個網址了,哦對了,這裡還有一個比較重要的地方,如果你的代理是一個ip地址,但是直接訪問這個ip地址又得不到東西,那麼這時候就需要定義header裡面的 Host 了,可以這樣來一條 prxy_set_header Host "zh.wikipedia.org"; 比如我要代理百度,然而百度並不讓我直接上,所以我就可以這樣寫:

proxy_pass http://www.baidu.com;
proxy_set_header Host "www.baidu.com";

這樣就可以矇混過關~

baidu

baidu-config

proxy_cache 這裡就是在上面 keys_zone 定義的那個名字。至於為什麼要在這裡宣告一下,是因為一臺伺服器上可能不僅有一個快取池,這裡的宣告是為了更好的區分。

proxy_cache_valid 200 302 2h; 這個說的是,當返回狀態200和302的時候,快取時間為兩個小時。這裡的返回狀態是指我反代伺服器給我的返回狀態,一般可以設定的大一點,如果這個站經常被訪問的話。想我這反代的谷歌,沒幾個人上,我也就寫的這麼小了。

proxy_cache_valid 404 1h; 404快取一個小時。

proxy_cookie_domain google.com google.kfd.me; 替換cookie的domain,把google.com換成google.kfd.me。在這裡你要有一個“域”的概念,cookie是不能隨便用的,更不能串著用。(大牛們見笑了,我是說給小白聽的,哎哎別打我臉啊,哎輕點輕點……)

proxy_redirect https://www.google.com.sg/ /; 重定向 "https://www.google.com.sg" 到 "/",也就是說,當有請求google的資源的時候都會請求本地,這才是我們搭這個反代理的目的所在。

proxy_buffering off; 關閉緩衝.(記憶體中的快取,不是cache)無關緊要的東西。

proxy_set_header這個是用來定義header的,也就是我們傳送給谷歌的header,在這裡我定義了使用者的真實ip,和一部分cookie,還有語言,以及User agent。

sub_filter www.google.com google.kfd.me; 這個是最好玩的,但是隻能玩一次。將返回結果中的www.google.com全部替換為google.kfd.me,這樣當返回的網頁中存在下一連結的時候,就會繼續請求我們的 google.kfd.me 而不是跳到谷歌去。這裡也可以好好地發揮一下,比如,偷點東西出來。當然,不在這裡深究。P牛早已看穿了一切

sub_filter_once off; 是否只替換一次? 否。

當然,這個是全域性代理谷歌,因為location是 / 嘛。你也可以在下面在加上一個location /hello { ... }然後訪問 google.kfd.me/hello 就可以重新定義到另一個地方了。花樣location,看起來很簡單,但,做的事情卻有很多。最簡單的,定義robots,然後說不定就會有好玩的事情發生了呢~

0x04 寫在最後


我一直以為,不想當廚子的裁縫不是好司機,其實我錯了,不相當司機的廚子才不是好裁縫。

事情並沒有這樣簡單地結束,因為這東西是一把刀,然而你要用這把刀犯罪還是防身,分寸在你心中。

釣魚網站就是這麼簡單,我寫這篇文章的目的也不是教你怎樣釣魚,而是讓你知道,下一個被釣魚的就是你。

如果你要問我為什麼這麼做,那麼我的回答就跟為什麼要去爬珠峰一樣,因為我能。

提高防範意識,切勿玩火自焚。

baidu-config

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章