記一次ip映射以及nginx的正向,反向代理

IP地址映射和nginx的反向代理記錄


一、問題描述

在項目中,遇到了這樣一個問題:

有四臺服務器,分別爲:服務器A、服務器B、服務器C,服務器D,他們對應的IP地址舉例如下:

服務器A:110.110.110.110

服務器B:120.120.120.120  內網地址:10.10.10.1

服務器C:無外網地址,內網地址爲10.10.10.2

服務器D:無外網地址,內網地址爲10.10.10.3

他們的關係是服務器B、服務器C、服務器D內網互通,服務器A內網不和他們中的任何一個互通

關係如下圖:

 

         問題描述:服務器A有個客戶端應用服務需要請求服務器C,再請求服務器C後,服務器C給服務器A返回了服務器B、C、D的內網地址,這個時候呢,服務器A上的客戶端拿到這些數據後,回去請求B、C、D的內網地址並建立連接,但是由於服務器A和他們的內網不通,所以服務器報錯。

         場景描述:項目用了workman的框架,而workman啓動後其實分爲註冊中心regeistor和網關gateway,客戶端在連接regieistor後,workman的註冊中心回把gateway的地址返回給客戶端,客戶端拿到這個地址後再去請求gateway,完成連接。

其中regeist的默認端口是1236,gage的默認端口是2300和2301。

一般來說gateway都是監聽的ip地址都是內網。之前的服務器A是阿里雲,所以內網是通的,但是忽然有一天服務器A變成了國外地址,這個時候內網就不通了。

 

二、解決方案:iptable+nginx

1、iptable:負責ip映射

在本問題中,在服務器A獲得註冊中心返回給的內網地址後,在iptable中,將此ip地址的出方向映射到本地的127.0.0.1,方法如下:

iptable 轉發
1)、允許內核ip轉發
  echo 1 > /proc/sys/net/ipv4/ip_forward,重啓後失效。要想永久生效,具體百度。
2)、將本機訪問x.x.x.x轉發到127.0.0.1
  iptables -t nat -A OUTPUT -d x.x.x.x -j DNAT --to-destination 127.0.0.1

其中x.x.x.x爲從服務器拿到的內網地址。

2、nginx:負責tcp正向代理和tcp反向代理

在建立好iptable後,服務器A的出方向,所有的請求服務器B、C、D的tcp將會映射到請求本地127.0.0.1上,所以,這裏需建立本地對應端口的反向代理,也就是把127.0.0.1的請求轉發到能與服務器A互通的服務器B上去

由於項目裏的連接的都是tcp協議,所以nginx做的是tcp代理。在本問題中,具體做法是:

1)服務器A的反向代理

在nginx.conf中,不要再http塊中,加入一下轉發:或者建立個tcp.d文件夾,在nginx.conf的最後另起一行:

include tcp.d/*.conf;

然後建立一個xx.conf,內容如下:

stream {
  upstream websocket_1236 {
                server 120.120.120.120:1236;
        }

  server {
        listen                1236;
        proxy_pass            websocket_1236;
       }

}

以上只是一個端口的,實際上是需要根據返回的端口都加入轉發。

2)服務器B的反向代理

服務器B的作用則是將服務器A轉發過來的tcp轉發到內網地址去,內容類似,只是server的地址變化下

stream {
  upstream websocket_1236 {
                server 10.10.10.2:1236;
        }

  server {
        listen                1236;
        proxy_pass            websocket_1236;
       }

}

 

三、iptable的一些操作

1、將iptable的導出,

iptables-save >/tmp/somefile

2、修改/tmp/sonefile

3、將修改後的iptables存入系統

4、iptables-restore < /tmp/somefile

 

 

以上爲一個塊的代碼,實際則根據需要代理的ip加入即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章