背景描述:
因?yàn)槟硞€(gè)服務(wù)接口綁定了遠(yuǎn)程服務(wù)器C的域名,但是又不能直接在遠(yuǎn)程服務(wù)器C上做服務(wù)接口的調(diào)試,所以希望能夠?qū)崿F(xiàn)將遠(yuǎn)程服務(wù)器C的請(qǐng)求轉(zhuǎn)發(fā)到本地開(kāi)發(fā)環(huán)境A上;
基本原理:
本地開(kāi)發(fā)環(huán)境A可以通過(guò)ssh 服務(wù)鏈接到服務(wù)器C上;
如下圖的實(shí)線,我把ssh 登錄鏈接理解為正向隧道;
那么,如果ssh在鏈接到服務(wù)器C的同時(shí),能夠同時(shí)創(chuàng)建一條反向隧道(虛線),那么我們就可以想把辦法將到達(dá)遠(yuǎn)程服務(wù)器C上的請(qǐng)求,通過(guò)反向隧道轉(zhuǎn)發(fā)到本地;
利用ssh創(chuàng)建反向隧道
ssh -R $remote_port:$local_ip:$local_port user@$remote_ip
#ssh -R 89:127.0.0.1:80 user@remote.server.com
最簡(jiǎn)單的實(shí)現(xiàn):
1. 在遠(yuǎn)程服務(wù)器C上搭建nginx -proxy,使得通過(guò)服務(wù)器C 80端口的請(qǐng)求都轉(zhuǎn)發(fā)到服務(wù)器C的89端口
遠(yuǎn)程服務(wù)器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. 在本地開(kāi)發(fā)機(jī)A上創(chuàng)建到遠(yuǎn)程服務(wù)器上的反向隧道;
在A上鍵入以下命令
ssh -R 89:127.0.0.1:80 user@remote_ip
既可以成功在本地80端口接收服務(wù)器C上的http請(qǐng)求;
本地內(nèi)網(wǎng)docker 容器與遠(yuǎn)程服務(wù)器內(nèi)的docker 容器反向轉(zhuǎn)發(fā):
上圖是實(shí)現(xiàn)最簡(jiǎn)單的反向隧道穿透,實(shí)際在運(yùn)用中,由于有集群的存在,映射的復(fù)雜度會(huì)偏高些;
比如本地的開(kāi)發(fā)環(huán)境內(nèi)有開(kāi)發(fā)環(huán)境的集群,遠(yuǎn)程服務(wù)端C也有線上服務(wù)的集群;
下圖為近期作者完成的本地開(kāi)發(fā)集群及線上服務(wù)環(huán)境集群的反向隧道穿透流程圖:
實(shí)現(xiàn)的基本思路和原理與第一個(gè)例子相同,大家可以實(shí)踐看看~