Rub*_*ens 19 linux ssh rsa ssh-tunnel
我一直在努力设置一个有效的配置来打开与第二台机器的连接,通过另一台机器,并使用 id_rsa(它要求我输入密码)连接到第三台机器。
我在另一个论坛上问过这个问题,但我没有收到可以认为非常有帮助的答案。
这个问题,更好地描述,如下:
Local machine: user1@localhost
Intermediary machine: user1@inter
Remote target: user2@final
Run Code Online (Sandbox Code Playgroud)
我可以使用伪 tty 完成整个连接:
ssh -t inter ssh user2@final
Run Code Online (Sandbox Code Playgroud)
(这将询问我在机器“inter”中的 id_rsa 文件的密码)
但是,为了加快速度,我想设置我的 .ssh/config 文件,以便我可以使用以下命令简单地连接到机器“final”:
ssh final
Run Code Online (Sandbox Code Playgroud)
到目前为止,我所拥有的 - 不起作用 - 在我的 .ssh/config 文件中:
Host inter
User user1
HostName inter.com
IdentityFile ~/.ssh/id_rsa
Host final
User user2
HostName final.com
IdentityFile ~/.ssh/id_rsa_2
ProxyCommand ssh inter nc %h %p
Run Code Online (Sandbox Code Playgroud)
id_rsa 文件用于连接到中间机器(这不需要我输入密码),而 id_rsa_2 文件用于连接到机器“final”(这个需要密码)。
我试过混合一些LocalForward
和/或RemoteForward
字段,并将 id_rsa 文件放在第一台和第二台机器上,但我似乎无法在没有任何配置的情况下成功。
PS:我试图从以下方面获得一些帮助的线程:
http://www.linuxquestions.org/questions/linux-general-1/proxycommand-on-ssh-config-file-4175433750/
Joh*_*Siu 22
如果要保留身份验证流程
local -- authenticate --> inter -- authenticate (ask password) --> final
Run Code Online (Sandbox Code Playgroud)
这不能用 .ssh/config 代理主机完成。
您需要的是 bash shell 别名(我希望您使用的是 bash)。
在~/.bashrc
,添加以下行
alias ssh-final='ssh -t inter ssh user2@final.com'
Run Code Online (Sandbox Code Playgroud)
在命令提示符下,只需键入以下内容
ssh-final
Run Code Online (Sandbox Code Playgroud)
final
~/.ssh/config
不使用in 部分。
ssh -t inter ssh user2@final.com
可以查看如下
local# ssh inter
inter# ssh user2@final.com
Run Code Online (Sandbox Code Playgroud)
local
只是“交谈” inter
。local
和之间没有直接或间接的 ssh 连接final
。local
只是显示ssh user2@final.com
.
Host inter
User user1
HostName inter.example.com
Host final
User user2
Hostname <final.com / final IP Address>
Port 22
ForwardAgent yes
ProxyCommand ssh inter nc %h %p
Run Code Online (Sandbox Code Playgroud)
复制到本地 ~/.ssh/id_ras.pub
/home/user1/.ssh/authorized_keys in `inter`
/home/user2/.ssh/authorized_keys in `final`
Run Code Online (Sandbox Code Playgroud)
ssh隧道
在我们详细介绍 之前ProxyCommand
,让我们看一下下面的例子
步骤 1,在终端窗口 1
local# ssh inter -L 2000:final.com:22
Run Code Online (Sandbox Code Playgroud)
第 2 步,在终端窗口 2 上
local# ssh localhost -p 2000
Run Code Online (Sandbox Code Playgroud)
在终端 1 中,在本地端口 2000 和 final.com 端口 22 之间建立了一条隧道。发送到本地端口 2000 的任何内容都将转发到 final.com 端口 22,反之亦然。
在终端 2 中,ssh 连接到本地端口 2000,但实际上正在与 final.com 端口 22 通信,即 sshd。
使用隧道,步骤 2 中的本地 ssh 客户端直接与 final.com sshd 连接。
本地端口 2000 的“输出”是“原始”ssh 守护进程流量。
此类隧道的常见用途是访问内部 Web 服务器或电子邮件服务器。以下是 Web 服务器的示例
local# ssh inter -L 2000:final.com:80
Run Code Online (Sandbox Code Playgroud)
在浏览器中使用以下 URL
http://localhost:2000
Run Code Online (Sandbox Code Playgroud)
隧道的两个端点是本地端口 2000 和 final.com 端口 80。
进出隧道端点的流量“按原样”。让我们称之为“原始”流量。
代理命令
Host final
User user2
Hostname <final.com / final IP Address>
Port 22
ForwardAgent yes
ProxyCommand ssh inter nc %h %p
Run Code Online (Sandbox Code Playgroud)
在ProxyCommand
把它一步。它跳过创建本地端口并连接到它的步骤。
ssh 客户端将执行后面给出的任何命令ProxyCommand
,并将该命令的输出视为“原始”流量。它持有本地端点,然后开始与它的 ssh 连接。
为什么一个工作另一个不工作?
以下命令
ssh inter nc final.com 22
Run Code Online (Sandbox Code Playgroud)
基本上意味着(1)连接到inter
,然后(2)在inter
,运行命令nc final.com 22
。
nc - arbitrary TCP and UDP connections and listens
Run Code Online (Sandbox Code Playgroud)
Sonc final.com 22
将连接到 final.com 端口 22,将所有传入流量打印到 stdout,并将所有 stdin 发送到另一端。它是 nc stdin/out 和 final.com 端口 22 之间的“隧道”。
由于nc
在 ssh 会话中运行,因此其所有标准输出都作为“原始”流量传递回 ssh 客户端。并且 ssh 客户端可以将流量传递到 nc stdin,最终会到达 final.com 的 22 端口。
通过上面的“隧道”,本地 ssh 客户端将final.com
直接与其启动 ssh 会话。
以下命令
ssh -t inter ssh user2@final.com
Run Code Online (Sandbox Code Playgroud)
不起作用,ProxyCommand
因为它不是来自 ssh 守护程序的“原始”流量。它是ssh 客户端的标准输出。客户与客户交谈意味着没有业务。
Host inter
User user1
HostName inter.com
IdentityFile ~/.ssh/id_rsa
Host final
User user2
HostName final.com
IdentityFile ~/.ssh/id_rsa_2
ProxyCommand ssh inter nc %h %p
Run Code Online (Sandbox Code Playgroud)
复制到本地 ~/.ssh/id_ras.pub
/home/user1/.ssh/authorized_keys in `inter`
Run Code Online (Sandbox Code Playgroud)
复制到本地 ~/.ssh/id_ras_2.pub
/home/user2/.ssh/authorized_keys in `final`
Run Code Online (Sandbox Code Playgroud)
以上都将启用以下用法
local# ssh final
Run Code Online (Sandbox Code Playgroud)
local# ssh -v final
Run Code Online (Sandbox Code Playgroud)
这应该有助于识别 ssh 问题。
ProxcyCommand
在执行nc
上inter
。检查是否nc
在 上实际可用inter
。
local# ssh inter
inter# nc final.com 22
Run Code Online (Sandbox Code Playgroud)
如果要为inter
and使用不同的键,则final
本地计算机中应存在以下文件
local# ls ~/.ssh
id_rsa id_rsa_2 id_rsa.pub id_rsa_2.pub
Run Code Online (Sandbox Code Playgroud)
由于您inter
已经可以通过 ssh 连接,请检查 上的密钥设置final
。从您的本地机器
local# ssh -t inter ssh user2@final
final# cat .ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)
你应该看到id_rsa_2.pub
那里的内容。
归档时间: |
|
查看次数: |
23166 次 |
最近记录: |