nginx tcp代理_记一次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内网不和他们中的任何一个互通

关系如下图:

a4d9d96b60930f6a7fb0e6f3cb39aab1.png

问题描述:服务器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;

}

}

以上为一个块的代码,实际则根据需要代理的ip加入即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值