Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在现有TCP连接上运行ssh_Linux_Ssh - Fatal编程技术网

Linux 如何在现有TCP连接上运行ssh

Linux 如何在现有TCP连接上运行ssh,linux,ssh,Linux,Ssh,我希望能够在不同的NAT后面同时SSH到多个linux设备。我无法配置它们所在的网络。但是,我无法让ssh通过现有连接 我可以完全控制我的客户端和设备。以下是迄今为止的流程: 在我的客户机上,我首先运行 socat TCP-LISTEN:5001,pktinfo,fork-EXEC:./create_-socket.sh,fdin=3,fdout=4,nofork /create_socket.sh的内容: ssh-N-M-S“~/sockets/${SOCAT_PEERADDR}”-o“Pr

我希望能够在不同的NAT后面同时SSH到多个linux设备。我无法配置它们所在的网络。但是,我无法让ssh通过现有连接

我可以完全控制我的客户端和设备。以下是迄今为止的流程: 在我的客户机上,我首先运行

socat TCP-LISTEN:5001,pktinfo,fork-EXEC:./create_-socket.sh,fdin=3,fdout=4,nofork
/create_socket.sh的内容

ssh-N-M-S“~/sockets/${SOCAT_PEERADDR}”-o“ProxyCommand=SOCAT-FD:3!!FD:4”“root@${SOCAT_PEERADDR}”
在设备上,我正在运行

socat TCP:my_host:4321 TCP:localhost:22
但是,
FD:3中没有任何内容!!FD:4
,我假设是因为proxy命令是一个子进程。我还尝试设置了
fdin=3,fdout=3
并将
/create\u socket.sh
更改为:

ssh-N-M-S“~/sockets/${SOCAT_PEERADDR}”-o“ProxyUseFdpass=yes”-o“ProxyCommand=echo 3”“root@${host}”
这将打印一个错误:

mm_receive_fd: no message header
proxy dialer did not pass back a connection

我认为这是因为fd应该使用
sendmsg
以某种方式发送,但fd无论如何都不是源于子流程。我想让它尽可能简单,这感觉接近可行。

您想改变客户机/服务器模型,创建一个通用服务器,根据需要生成客户机,并响应来自网络边界的未经验证的TCP连接,然后告诉新生成的客户端使用未经验证的TCP会话我认为这可能有您没有想到的安全注意事项。如果恶意用户向您的计算机发送垃圾邮件连接,您的计算机将生成大量SSH实例以重新连接,这些进程在进行身份验证时可能会占用大量本地系统资源。您实际上是在尝试将SSH设置为跨网络边界自动连接到不受信任(未验证)的远程启动机器。我不能强调这对你的客户机有多危险。使用错误的选项可能会暴露您拥有的任何凭据,甚至让恶意人员完全访问您的计算机

还值得注意的是,您要求执行的场景,即在多个设备之间构建隧道,以跨不受信任的网络边界多路传输附加连接,正是VPN软件的目的。是的,SSH可以构建隧道。VPN软件可以更好地构建隧道。其概念是在客户端计算机上运行VPN服务器。VPN服务器将创建一个新的(虚拟)网络接口,该接口仅代表您的设备。这些设备将连接到VPN服务器并分配一个IP地址。然后,从客户机,您只需启动SSH到设备的VPN地址,它将通过虚拟网络接口路由,到达设备并由其SSH守护进程服务器处理。然后,您就不需要为端口转发而使用
socat
或SSH选项了。您将获得VPN中存在的所有工具和教程我强烈建议您查看VPN软件

如果您真的想使用SSH,那么我强烈建议您学习如何保护SSH服务器。您已经声明设备跨越网络边界(NAT),并且您的客户端系统未受保护。我不会阻止你射中自己的脚,但在你所说的情况下,这样做很容易。如果你在工作环境中,你应该和你的系统管理员讨论防火墙规则、堡垒主机等等

是的,你可以照你说的做。不过,我强烈建议谨慎行事。我强烈建议,我不会提出任何与上述内容相关的建议。我将推荐一个具有相同概念但更多身份验证的变体

首先,您已经有效地设置了自己的SSH bounce服务器,但没有任何与SSH服务器兼容的通用工具。因此,这是我要解决的第一件事:使用SSH服务器软件来验证传入的隧道请求,方法是使用
SSH
客户端软件从设备而不是
socat
启动连接
ssh
已经具备了大量在两个方向上创建隧道的功能,您可以通过它获得捆绑的身份验证(使用
socat
,没有身份验证)。设备应该能够使用加密密钥进行身份验证(ssh调用这些身份)。您需要从设备手动连接一次,以验证和授权远程加密密钥指纹。您还需要将公钥文件(而不是私钥文件)复制到客户端计算机,并将其添加到授权密钥文件中。如果需要的话,你可以单独寻求帮助

第二个问题是,您似乎正在使用fd3和fd4。我不知道你为什么这么做。如果有的话,应该使用fd0和fd1,因为它们分别是
stdin
stdout
。但是,如果您使用
socat
启动连接,甚至不需要这样做。只需使用
-
即可,其中
stdin
stdout
是指。它应该与
-o ProxyCommand
完全兼容,而不指定任何文件描述符。在这个答案的末尾有一个例子

设备端的调用可能如下所示(将其放入脚本文件中):

IDENTITY=/home/wavesatpicles/.ssh/tunnel.id_rsa#在设备上
客户端上的远程_SOCKET=/home/wavesatpicles/.ssh/$(主机名).sock
客户端上的REMOTEUSER=WavesAtParticles
REMOTEHOST=REMOTEHOST#可从设备访问的客户端主机名或IP地址
虽然是真的
做
echo“$(日期-Is)正在连接”
#
#设置SSH隧道。检查stderr是否存在已知问题。
党卫军
ssh -o ProxyCommand='socat - unix-connect:/home/WavesAtParticles/remotehost.sock' -l WavesAtParticles .
2019/08/26 18:09:52 socat[29914] E connect(5, AF=1 "/home/WavesAtParticles/remotehost.sock", 7): Connection refused
ssh_exchange_identification: Connection closed by remote host