有人可以用简单的方式解释SSH隧道吗?

nop*_*ole 54 ssh ssh-tunnel

虽然我使用一些别名来做ssh隧道或反向隧道,但我从来不知道它是如何工作的.有人知道如何以非常简单的方式解释它吗?

我认为3个主要用途是:

首先,我可以使用我的家用电脑进行ssh foo.mycompany.com,而不使用任何密码(foo是工作中的服务器)

1)如何 foo.mycompany.com:8080去我的家用电脑localhost:3000

2)如果在家,我无法访问http://bar.mycompany.com,但foo可以访问bar,如何使家用电脑能够访问http://bar.mycompany.com

3)如果在家里,我无法访问MySQL数据库db.mycompany.com,但foo可以,如何db.mycompany.com使用ssh隧道也可以访问它.

可以用非常简单的术语解释一下吗?除了这3个,还有其他一些流行的用途吗?谢谢.

for*_*sck 53

1)假设你从home连接到foo,你需要一个反向隧道(-R)

ssh -R 8080:localhost:3000 foo.mycompany.com
Run Code Online (Sandbox Code Playgroud)

这将使在foo上运行的进程能够localhost:8080在端口3000处连接并实际与您的家庭计算机通信.如果您希望工作中的其他计算机能够连接到foo:8080并在端口3000访问您的家用计算机,那么您需要

ssh -R 0.0.0.0:8080:localhost:3000 foo.mycompany.com
Run Code Online (Sandbox Code Playgroud)

但为了使这个工作你还需要这个选项来foo的sshd_config

 GatewayPorts yes
Run Code Online (Sandbox Code Playgroud)

2)使用ssh创建http代理的最佳方法是使用socks.首先连接

ssh -D 8888 foo.company.com
Run Code Online (Sandbox Code Playgroud)

然后转到浏览器连接设置并启用代理连接,选择socks4/5和host:localhost,端口8888.然后输入http://bar.mycompany.com浏览器的地址栏.

3)现在您需要一个本地端口转发(-L).

ssh -L 3333:db.mycompany.com:3306 foo.mycompany.com
Run Code Online (Sandbox Code Playgroud)

这意味着您将能够localhost:3333从家用计算机进行连接,并且所有内容都将转发到db.mycompany.com:3306,就像连接是由foo.mycompany.com.主机数据库将foo视为客户端连接,因此您需要使用从foo工作时使用的相同用户名和密码登录.

添加-g标志将使您家庭网络中的其他计算机能够连接到您的计算机端口3333并实际访问db:3306.

  • 很高兴您能提供一个示例,但问题实际上是关于“什么是 SSH 隧道”。如果您可以对您的描述进行更多解释,并将 bash 命令留待以后使用,那就太好了。 (2认同)

Muk*_*ain 8

分享我发现的一个很好的教程,其中包含一些图表: https ://iximiuz.com/en/posts/ssh-tunnels/

本地端口转发

例如,使用笔记本电脑上的精美 UI 工具访问在线服务器的数据库(MySQL、Postgres、Redis 等)。

ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr
Run Code Online (Sandbox Code Playgroud)

-L标志表明我们正在启动本地端口转发

它实际上的意思是:

  • 在您的计算机上,SSH 客户端将开始侦听local_port(可能在本地主机上)。
  • 到此端口的任何流量都将转发到remote_private_addr:remote_port您通过 SSH 连接到的计算机上。

在此输入图像描述

远程端口转发

向外界公开本地服务,例如,将笔记本电脑中的开发服务公开到公共互联网上进行演示。

ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr
Run Code Online (Sandbox Code Playgroud)

-R标志表明我们正在启动远程端口转发

在此输入图像描述


Ben*_*Ben 6

SSH 隧道非常简单。它在一端打开一个侦听套接字。每当有人连接到该侦听套接字时,它都会打开从另一端到配置位置的相应连接,然后通过 SSH 链接在两者之间双向转发所有信息。

  • 你能列出如何做问题中的三件事并提及它是如何实现的吗? (2认同)

Guy*_*ark 5

一个很老的问题,但看看这个页面是否有助于为你解释它,它有漂亮的图片等等。:)

https://www.ssh.com/ssh/tunneling/

基本上,SSH 隧道是一种隧道,可用于将(隧道)数据从一个地方传递到另一个地方,并进行加密。

它也常用于将流量(通过隧道,想想虫洞)路由到其他地方,这允许诸如通过防火墙隧道或重定向流量(加密端口转发)之类的事情。

假设您和服务器之间有防火墙。服务器可以访问其内部网络上的另一台服务器 (server2)。

[client]--------||------[server]----[sever2]
Run Code Online (Sandbox Code Playgroud)

假设您想访问server2上的 Web 服务器,并且由于显而易见的原因,您不能直接执行此操作。假设端口 22 (ssh) 在防火墙上打开。所以我们要做的是创建一个从serverserver2SSH 隧道(在server 上)。这意味着端口 22 上的任何(出站?)流量都将通过此隧道从 server:22 -> server2:80 发送

[client]--------||------[server:22]======[sever2:80]
Run Code Online (Sandbox Code Playgroud)

所以(据我所知),如果我们连接到server:22,它应该server2:80使用这个新的 SSH 隧道将端口 22 上的流量重定向到 Web 服务器。(据我所知,数据只在隧道中加密,所以最后将是解密数据,如果你想知道 server:80 是否必须是 SSL)。

我想在某种程度上,使用 SSH 本身就是用于您旧telnet通信的 SSH 隧道。只是在大多数时候你听说 SSH 隧道,人们指的是它提供的(安全)端口转发功能,而无需访问防火墙管理员,这是一个很多黑客喜欢使用的漂亮小功能绕过安全。

更正当的理由;如果您受到防火墙等限制,或者您想保护两台机器之间的流量(如 SSH 程序),这是将某些流量中继到在不同端口上工作的内部服务器的好方法。

希望这可以帮助。

编辑

在 UNIX SO https://unix.stackexchange.com/questions/46235/how-does-reverse-ssh-tunneling-work 上找到了这个,很多答案对你需要的东西有非常清晰(和图片)的解释!


riv*_*ver -11

阅读手册页,特别是 -L、-R 和 -D 选项。我认为有人重写这个并可能引入错误是没有用的。如果您不明白,您可以提出更具体的问题。

-D 提供 SOCKS 代理,这是 ssh 隧道的另一个有用的应用。

  • 最糟糕的答案之一是:阅读手册页或阅读本书。目前 Ubuntu 10.10.10 上的手册页有 888 行长,5704 个单词 (18认同)
  • @anm...您知道您可以回答 StackOverflow 上的每一个问题:阅读手册页,或阅读《编程 [Ruby]》一书。 (17认同)
  • 实际上,这是手册页中写得很好的部分,它用几行内容对 -D 进行了完整而清晰的解释。你要明白,这些不是如何使用洗衣机的手册,你需要了解一些技术术语,比如套接字、应用程序级、绑定地址。如果你想学习这个工具,那么你就不能偷懒,要实际学习并做所需的研究。 (3认同)