SSH 的“虚拟主机”

Ale*_*ysh 14 linux ssh

我们有一个远程 Xen 服务器,运行着很多来宾机器(在 Linux 上),只有几个 IP 可用。

每个来宾机器都应该可以通过 SSH 从外部直接访问。

现在我们为每台访客机器分配一个单独的域名,指向少数可用 IP 之一。我们还为那台访客机器分配了一个端口号。

因此,要访问名为 m​​achine 的机器foo,应执行以下操作:

$ ssh foo.example.com -p 12345

...并访问名为的机器bar

$ ssh bar.example.com -p 12346

双方foo.example.combar.example.com指向同一个IP。

是否有可能以某种方式摆脱此配置中的自定义端口并配置 SSH 服务器,侦听该 IP(或防火墙或服务器端的任何内容),以便根据域地址将传入连接路由到正确的来宾计算机,以便以下按预期工作?

$ ssh foo.example.com 主机名 # 打印 foo
$ ssh bar.example.com 主机名 # 打印栏

请注意,我确实了解.ssh/config相关的客户端配置解决方案,我们现在正在使用它。这个问题专门针对零客户端配置解决方案。

qua*_*nta 12

                         foo  
                        /
Client ----- Xen server
                        \
                         bar
Run Code Online (Sandbox Code Playgroud)

听起来您正在寻找 SSH 网关。

首先,创建2个新用户foobarXen的服务器上:

Xen # useradd foo
Xen # useradd bar
Run Code Online (Sandbox Code Playgroud)

生成密钥对并将公钥复制到foo-serverbar-server

Xen # su - foo
Xen $ ssh-keygen
Xen $ ssh-copy-id -i ~/.ssh/id_rsa.pub foo-user@foo-server
Run Code Online (Sandbox Code Playgroud)

(对bar用户做同样的事情)

现在,从Xen的服务器(SSH网关),您可以登录到foo-serverbar-server无密码提示。

下一步是让使用公钥进行Client身份验证Xen server

Client $ ssh-keygen
Client $ ssh-copy-id -i ~/.ssh/id_rsa.pub foo@Xen
Run Code Online (Sandbox Code Playgroud)

最后一步是Xen server打开与相应内部服务器的第二个连接。访问 Xen,切换到foo,打开~/.ssh/authorized_keys文件并更改:

ssh-rsa AAAAB3N...== user@clienthost
Run Code Online (Sandbox Code Playgroud)

到:

command="ssh -t -t foo-user@foo-server" ssh-rsa AAAAB3N...== user@clienthost
Run Code Online (Sandbox Code Playgroud)

样本结果:

$ ssh foo-user@Xen
Last login: Thu Nov 10 13:02:25 2011 from Client
$ id
uid=500(foo-user) gid=500(foo-user) groups=500(foo-user) context=user_u:system_r:unconfined_t
$ exit
logout

Connection to foo-server closed.
Connection to Xen closed.
Run Code Online (Sandbox Code Playgroud)
$ ssh bar-user@Xen
Last login: Thu Nov 10 11:28:52 2011 from Client
$ id
uid=500(bar-user) gid=500(bar-user) groups=500(bar-user) context=user_u:system_r:unconfined_t
$ exit
logout

Connection to bar-server closed.
Connection to Xen closed.
Run Code Online (Sandbox Code Playgroud)