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加入即可。