1. 程式人生 > >用nginx搭建http透明代理

用nginx搭建http透明代理

web服務器 lis 計算機 centos cal out tcp 標簽 dport

背景

代理我們經常聽,在技術層面我們談論的代理往往是非透明代理,那麽既然有非透明代理那就存在有透明代理。我們先看看什麽是透明代理,引用百度百科的一句話可以描述明白 透明代理的意思是客戶端根本不需要知道有代理服務器的存在。既然透明代理是感知不了代理的存在,那麽非透明代理就是可以感知到代理的存在了,最簡單的方式就是你要去訪問網站A,在正常情況下,網站A看到訪問是來自於你的終端的(比如源IP地址是你自己瀏覽器的),假如你的終端是通過代理來訪問網站A的,在普通非透明代理情況下,網站A看到請求是來自於你的代理IP而看不到你這個終端,在透明代理情況下,網站A感知不到你和它之間中間有一層代理,網站A看到的請求是來自於你的終端地址。

除了這兩種代理方式外,還有一種代理方式的區分(這種是另外一個層面的區分),正向代理和反向代理。正向代理引用百度百科描述如下 意思是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。 那麽反向代理呢,描述如下 在計算機網絡中,反向代理是代理服務器的一種。服務器根據客戶端的請求,從其關系的一組或多組後端服務器(如Web服務器)上獲取資源,然後再將這些資源返回給客戶端,客戶端只會得知反向代理的IP地址,而不知道在代理服務器後面的服務器簇的存在。

我們今天要討論的是用nginx來搭建http的透明正向代理,這種場景需求是非常常見的,比如我們希望接管當前某個網絡環境下所有http訪問(通俗來講就是http劫持),所有對外http請求都轉發到一臺透明代理服務器,再經過這臺代理服務器對外訪問然後把數據返回給請求者,但是不希望請求者和外部服務器感知到中間有一層代理。

實戰

nginx官方已經有一篇非常好的文章介紹使用nginx來搭建透明代理,這篇文章不僅僅描述http代理,還介紹了tcp、udp等代理方式,可以說是非常全面詳細,我們只參考了裏面有關透明http反向代理部分,有興趣讀者可以查閱相關連接地址如下 nginx官方透明代理教程
準備

操作系統這次用的是 CentOS7.4 64位

nginx版本用的是 nginx-1.14.2

環境及軟件版本對方案搭建影響不太大,只要linux內核是3或者以上,nginx不要太舊即可。nginx我們選擇的是普通的源碼編譯安裝,過程比較簡單不再列出,我們最終的安裝目錄是/opt

配置

配置是本文的核心關鍵,1是nginx的配置;2是iptable防火墻策略的配置,nginx配置核心關鍵內容如下:
server{

listen80; #既然是http代理,那麽80端口是必須的

resolver 8.8.8.8; #用於解釋對外訪問的域名IP地址

location / {

    proxy_pass $scheme://$host$request_uri; #代理轉發對應的服務器

    proxy_bind $remote_addr transparent; #這行很關鍵,啟用透明代理

    proxy_set_header X-Real-IP $remote_addr; #這行是可選,把客戶端IP頭加到http自定義字段而已

    }

} 

除了上面的nginx,接下來另外一個重點就是iptable防火墻策略,要把http對外流量劫持到代理本機(首先在網絡層面,要把需要劫持的流量路由到本代理設備),策略如下:
#添加一條策略,把目標是80端口的流量轉發到本機的80端口,不加這條策略nginx是不會收到http請求數據的,服務器這個時候只會充當一臺路由器的角色做數據轉發而已

-A PREROUTING -i em1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 80

#這條策略結合下面兩條ip命令規則配合使用,目的是為了使外部http請求返回的數據可以正常地回復給請求者

-A PREROUTING -s 請求者IP範圍段 -p tcp -m tcp --sport 80 -j MARK --set-xmark 0x1/0xffffffff

還需要2條ip指令跟上面的iptable策略配合使用,如下:

    ip rule add fwmark 1 lookup 100
    ip route add local 0.0.0.0/0 dev lo table 100

關於以上2條指令和iptable打標簽,最終能夠發揮出意料之外的效果,希望深知底層原理的讀者可以回復小編,重重有賞。
技術分享圖片
睿江雲計算官網鏈接:https://www.eflycloud.com/home?from=RJ_0024

用nginx搭建http透明代理