我希望避免直接访问到系统A. 但是,系统A上正在运行服务C.
还有一个其他系统B可以被任何人访问。
我想将B中的请求“转发”给用户可以认为服务C正在B上运行。
从技术上讲,我知道如何实现两个网络程序(D和E)来实现这一要求。 D在连接到系统B上运行的E的系统A上运行。
对服务C的任何B请求都将从E转发到D. D将请求传递给“真实”服务C.当然,响应顺序相反。
Network Access Anyone -> B <- A
Programs E <- D
Service flow Anyone -> E -> D -> C
对于还在我身边的人:
在执行此类程序时,我会重新发明轮子吗?
换句话说,是否有一个开源/ linux程序正在执行此功能?答案 0 :(得分:2)
这看起来像是SSH隧道的教科书用例。
在服务器A上,安装SSH服务器(例如,安装包openssh-server,如果它是Debian)。在服务器B上,运行以下命令:
ssh -f SERVICEUSER@AHOST -L BPORT:AHOST:APORT -N
其中SERVICEUSER是服务运行的用户的名称,A是A的主机名或IP,BPORT是服务B上服务应该可用的端口号,APORT是端口的端口号该服务正在服务器A上侦听。以下是更多信息:http://www.revsys.com/writings/quicktips/ssh-tunnel.html
每次重启后都必须运行此命令,因此最好为其编写一个init脚本,以便像服务一样进行管理。从这里开始:http://www.thegeekstuff.com/2012/03/lsbinit-script/
为了避免输入SERVICEUSER的密码(这在初始化脚本中是不可能的),您还需要在服务器B上生成私有SSH密钥并将其添加到SERVICEUSER的authorized_keys文件中,这可能涉及创建一个主目录。 SERVICEUSER。使用usermod -d
命令执行此操作:http://linux.die.net/man/8/usermod然后按http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html要记住的一个常见问题是authorized_keys文件和.ssh目录都必须chmod
600并由SERVICEUSER拥有,否则SSH服务器将忽略它们。