背景描述:
因为某个服务接口绑定了远程服务器C的域名,但是又不能直接在远程服务器C上做服务接口的调试,所以希望能够实现将远程服务器C的请求转发到本地开发环境A上;
基本原理:
本地开发环境A可以通过ssh 服务链接到服务器C上;
如下图的实线,我把ssh 登录链接理解为正向隧道;
那么,如果ssh在链接到服务器C的同时,能够同时创建一条反向隧道(虚线),那么我们就可以想把办法将到达远程服务器C上的请求,通过反向隧道转发到本地;
利用ssh创建反向隧道
ssh -R $remote_port:$local_ip:$local_port user@$remote_ip
#ssh -R 89:127.0.0.1:80 user@remote.server.com
最简单的实现:
1. 在远程服务器C上搭建nginx -proxy,使得通过服务器C 80端口的请求都转发到服务器C的89端口
远程服务器C上的nginx配置文件如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /tmp/access.log main;
server {
listen 80;
server_name www.* ;
location / {
proxy_pass http://127.0.0.1:89;
proxy_set_header X-Real-IP $remote_addr;
}
}
2. 在本地开发机A上创建到远程服务器上的反向隧道;
在A上键入以下命令
ssh -R 89:127.0.0.1:80 user@remote_ip
既可以成功在本地80端口接收服务器C上的http请求;
本地内网docker 容器与远程服务器内的docker 容器反向转发:
上图是实现最简单的反向隧道穿透,实际在运用中,由于有集群的存在,映射的复杂度会偏高些;
比如本地的开发环境内有开发环境的集群,远程服务端C也有线上服务的集群;
下图为近期作者完成的本地开发集群及线上服务环境集群的反向隧道穿透流程图:
实现的基本思路和原理与第一个例子相同,大家可以实践看看~