0

我希望避免直接访问系统 A。但是,系统 A 上正在运行服务 C。

任何人都可以访问另一个系统 B。

我想以用户认为服务 C 在 B 上运行的方式将请求从 B“转发”到 A。

从技术上讲,我知道如何实现两个网络程序(D 和 E)来实现这个要求。D 在系统 A 上运行,连接到在系统 B 上运行的 E。

对服务 C 的任何请求都将从 E 转发到 D。D 将请求传递给“真正的”服务 C。当然,响应顺序相反。

Network Access Anyone -> B <- A
Programs  E <- D 

Service flow Anyone -> E -> D -> C 

对于还在我身边的人:

做这些程序时我会重新发明轮子吗?

换句话说,是否已经有一个开源/ linux 程序在做这个功能?

4

1 回答 1

2

这看起来像是 SSH 隧道的教科书用例。

在服务器 A 上,安装一个 SSH 服务器(例如,如果它是 Debian,则安装软件包 openssh-server)。在服务器 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 的密码,这在 init 脚本中是不可能的,您还需要在服务器 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 服务器将忽略它们。

于 2013-02-10T22:09:33.933 回答