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)
如果要为interand使用不同的键,则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 次 |
| 最近记录: |