釣魚?這是反代理!
0x00 前言
我是學弟。
進入正題之前,感謝那些分享知識的前輩們,我在參考了他們的文章之後學習到了很多東西。
奉上詳細連結:
Nginx反向代理、負載均衡、頁面快取、URL重寫及讀寫分離詳解
其中第一篇已經寫的很詳細了,有關正向代理,反向代理的介紹什麼的;第二篇是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。
這個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";
這樣就可以矇混過關~
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 寫在最後
我一直以為,不想當廚子的裁縫不是好司機,其實我錯了,不相當司機的廚子才不是好裁縫。
事情並沒有這樣簡單地結束,因為這東西是一把刀,然而你要用這把刀犯罪還是防身,分寸在你心中。
釣魚網站就是這麼簡單,我寫這篇文章的目的也不是教你怎樣釣魚,而是讓你知道,下一個被釣魚的就是你。
如果你要問我為什麼這麼做,那麼我的回答就跟為什麼要去爬珠峰一樣,因為我能。
提高防範意識,切勿玩火自焚。
相關文章
- 釣魚網站與反釣魚技術剖析(圓桌會議)2018-04-12網站
- 釣魚釣魚去2022-03-11
- 釣魚篇-其他釣魚2024-03-09
- 釣魚篇-郵件釣魚2024-03-07
- 釣魚篇-網路釣魚2024-03-08
- 釣魚篇-其他型別釣魚2024-03-09型別
- 網路釣魚是什麼?網路釣魚攻擊的形式有哪些?2024-02-02
- 釣魚學習2024-10-15
- XSS漏洞釣魚2020-11-19
- 這樣的釣魚郵件,你會中招嗎?2022-02-24
- 釣魚小技巧-XLM2021-11-27
- 什麼是魚叉式網路釣魚?常見的方式有哪些?2023-11-24
- 網路釣魚攻擊2023-09-25
- 這幾種釣魚郵件,你一定不陌生~2020-06-03
- 什麼是欺騙性網路釣魚?如何防禦?2023-11-29
- 釣魚攻擊防不勝防,該如何預防網路釣魚攻擊?2022-08-24
- 釣魚攻擊時間軸,你知道常見的釣魚攻擊有哪些嗎2020-08-26
- 網路釣魚攻擊常用方法是什麼?如何防護?2023-04-28
- 掌握這些方法,輕鬆識破釣魚郵件的偽裝2020-05-11
- 使用powershell Client進行有效釣魚2020-08-19client
- 【NOIP2011模擬11.1】釣魚2020-10-05
- 郵件釣魚攻擊與溯源2019-02-13
- 為什麼說針對反網路釣魚的培訓還遠遠不夠?2021-05-31
- 【釣魚攻擊】外貿白領:比“貿易戰”更頭疼的釣魚攻擊來襲!2019-10-17
- 某汽車零部件企業:定期反釣魚演練是降低企業安全風險的優選方案2023-03-28
- “!提醒:續購防毒”釣魚網站套路2024-10-03防毒網站
- Proofpoint:2024年網路釣魚報告2024-08-08
- 如何防範釣魚網站詐騙?2022-09-15網站
- 關於釣魚郵件,你知道多少?2020-05-28
- 透過.PAC進行網路釣魚2020-08-19
- 記一次完成的釣魚實戰2021-11-29
- 網路釣魚 你知道如何識別嗎?2020-08-21
- 網路釣魚,你要怎麼防範2020-08-14
- 記一次釣魚靶機測試2022-02-28
- 雙因素認證繞過的釣魚工具2019-06-18
- GoogleTalk被黑客利用發動釣魚攻擊2019-05-09Go黑客
- 卡巴斯基:2020年網路釣魚報告2021-06-13
- 攻防演練 | 無懼無檔案釣魚,這裡有一份硬核指南2022-07-08