执行远程命令

执行远程命令

SSH 隧道到底是什么?SSH 隧道和端口转发这两个术语有什么区别?不同类型的 SSH 隧道方法之间究竟有什么区别?

本地端口转发 vs 反向端口转发 vs 动态隧道

每种类型适用的理想场景有哪些?

答案1

通俗地说,安全外壳或 SSH 是在两个计算机程序之间建立的:

  1. 在服务器端:守护进程(系统服务)监听 TCP/IP 端口并接受连接。它接收并执行多种类型的加密包。
  2. 客户端:连接服务器并传输命令的客户端。

客户端和服务器之间的连接使用加密,因此实际上是在不安全的网络上建立了一个安全通道。术语“安全 Shell”源于服务器在服务器计算机上运行本地 Shell 的能力,允许客户端执行命令并查看其结果。但 SSH 还可以用于许多其他用途。

服务器和客户端都使用已知协议进行通信,这意味着它们的消息格式已知。但是,SSH 还可以进行隧道传输,这意味着在消息中传输消息或在协议中传输协议。在这种情况下,服务器充当交换机或代理,在客户端和其目标之间来回传输消息,例如避开本地防火墙:

图像

来自内部协议的消息以这种方式加密并封装在 SSH 协议内部。

下面详细介绍了 SSH 的一些用途,但绝不是全部。

执行远程命令

要在未登录的情况下在远程系统上运行命令,请在登录信息后指定该命令:

$ ssh host command

例如,检查远程磁盘空间:

$ ssh host df

Linux 的另一个示例是将麦克风从一台机器传输到另一台机器的扬声器:

$ dd if=/dev/dsp | ssh -C user@host dd of=/dev/dsp

使用 ssh 复制文件

对于通过 SSH 复制数据和文件,有几个选项。

可以使用 cat 命令进行复制。如果您尝试复制进程的输出而不是文件,这无疑是一种合理的途径:

$ cat file | ssh -e none remote-host 'cat > file'

如果这些文件很大,您可能需要使用 -C 标志来启用压缩。

对于复制文件,程序 scp 的工作方式与 cp 类似,但它还接受远程目的地:

$ scp .bash_profile [email protected]:~/.bash_profile

对于用于复制文件的类似 FTP 的界面,请使用程序 sftp。

本地端口转发

SSH 允许安全端口转发。

例如,假设您想从客户端 A 连接到服务器 B,但通过服务器 C 安全地路由流量。这对于逃避防火墙很有用。

从 A 运行:

A$ ssh C -L localport:B:remoteport

然后,要连接到 B:remoteport,请连接到 localhost:localport。

如果使用 add -g,则任何可以到达 A 的人都可以通过 A:localport 连接到 B:remoteport。

例如,假设你的工作禁止了 reddit.com。运行以下命令:

# ssh yourserver -L 80:reddit.com:80

然后在 /etc/hosts 中将 reddit.com 和 www.reddit.com 的地址设置为 127.0.0.1(您还需要禁用任何本地 Web 服务器)。现在,它将通过您的服务器秘密访问 reddit.com。

如果您经常这样做,您可能需要添加一个特殊主机:

Host redditfw
HostName yourserver
LocalForward 80 reddit.com:80

远程端口转发

或者,假设您想通过安全的方式通过本地机器 C 让远程机器 B 访问另一台机器 A。

然后,在 C 上,您可以运行:

C$ ssh B -R remoteport:A:targetport

此时B上的本地用户可以通过localhost:remoteport连接到A:targetport。

如果要让非本地用户能够通过localhost:remoteport连接A:targetport,则在sshd_config文件中设置:

GatewayPorts yes

如果您经常这样做,请在 ~/.ssh/config 中设置一个特殊的主机:

Host exportme
HostName B
RemoteForward remoteport A:targetport

SSH 作为文件系统:sshfs

使用带有 sshfs 的 FUSE 项目,可以通过 SSH 挂载远程文件系统。在 Mac 上,使用 Fuse4x。

安装完成后,运行:

$ sshfs remote-host: local-mount-directory

来源

答案2

在这种情况下,SSH 隧道与端口转发相同,尽管 SSH 文档和配置参数通常指的是后者。

通过隧道或转发端口,您可以将 TCP 流量封装在 SSH 连接中。这可用于

  • 使用 SSH 连接加密流量。
  • 连接到 SSH 连接另一端的任何机器,就好像它们是本地端口一样。

本地端口转发是指在客户端建立 LISTEN 端口。即您在机器上打开本地端口 80,连接到服务器端的其他地方:80。

反向端口转发是在服务器端建立 LISTEN 端口。即在服务器上打开远程端口 8080,连接到 your_proxy:8080

动态充当 SOCKS 代理。

示例场景:

  • 您需要在远程服务器上操作 GUI。X 未加密,需要您在中间的所有防火墙中打开从服务器到客户端的端口。隧道消除了不安全性和防火墙规则的需要。
  • 您需要连接到无法从客户端直接访问的第三台服务器。您可以通过命令行在服务器上使用客户端应用程序,或通过隧道在 PC 上使用图形客户端应用程序。
  • 如果您在 SSH 服务器上有一个只监听本地主机的服务,则可以使用隧道从您的 PC 进行连接。即,可以通过 PC 上的图形应用程序管理 mysql 服务器,而无需在防火墙上打开端口或将服务暴露给整个网络。
  • 将其用作代理以绕过 HTTP 检查。有些公司确实在 PC 上使用代理,但服务器通常不会。

答案3

假设您在计算机 A 上,然后连接到计算机 B,因此 A 发起与 B 的连接。假设它是 Web,因此是 HTTP 连接。那里没有代理,也没有加密。没有 SSH,没有使用 SSH 命令。您可以通过 SSH 运行该连接,这将涉及隧道和端口转发,当然也会获得加密的好处,但隧道(顺便说一句,它总是使用端口转发)不是 SSH 最简单的用法。

您可以使用 SSH 而无需任何“隧道”,即无需在其中封装协议,例如,假设您在计算机 A 上,并且想要访问计算机 B 上的命令行。SSH 协议可以做到这一点。事实上,我见过 ssh -X,启用它来查看计算机 B 上的 GUI,其中计算机 B 运行 Linux。因此,即使没有隧道,SSH 也可以做很多事情。而且,只要使用 SSH,您就会获得 SSH 的加密。

您还可以做的是,假设您想从网吧浏览网页。您可以从计算机 A 到计算机 B 建立 SSH 连接,建立的连接是 SSH 隧道,它将封装另一个协议,例如对 HTTP 代理的请求。在计算机 B 上,Web 代理将采取行动,获取网页并将其发送到计算机 A。网吧的人看到的只是 A 和 B 之间的加密 ssh 连接。动态端口转发将在 B 上创建 SOCKS 代理,SOCKS 代理可以充当 Web 代理。

您可以使用 VNC 从 A 到 B,但通过 SSH 连接进行。因此,这是通过 SSH 连接隧道化/封装 VNC 连接。

SSH 中有一个概念,即本地端口转发和远程端口转发(反向隧道)。即哪一方监听,哪一方转发。本地是典型的情况。例如。ssh 隧道的情况涉及这些元素。ssh.exe(启动 ssh 连接,即 ssh 客户端)。sshd.exe(ssh 服务器,监听 ssh.exe 以连接到它)。以及封装协议的客户端和服务器。例如 VNC 客户端和 VNC 服务器。并且您拥有运行这些程序的计算机。

假设你的计算机是 A、B、C、D

A-runs VNC client
B runs SSH client
C runs SSH server
D runs VNC server

B 连接到 C。

A 连接到 B,然后 C 将其转发给 D。

B和C之间的一切都是加密的。

A 和 B 或 C 和 D 之间的任何内容均未加密。

SSH 隧道位于 B 和 C 之间。

A 和 B 之间以及 C 和 D 之间是封装的协议 - 在本例中为 VNC。

我们经常只用两台计算机进行 SSH 和隧道传输。例如,A 运行 VNC 客户端和 SSH 客户端。B 运行 VNC 服务器和 SSH 服务器。

现在我将了解反向隧道是什么以及它很有用。

假设 A 位于 NAT 路由器后面,B 位于 NAT 路由器后面。如果 A 想要连接到 B 上的 VNC,那么 B 必须在其路由器上进行端口转发。(即使没有 SSH)。另一种方法是,如果 B 可以发起与 A 的连接,使 A 能够查看 B。因此,您(技术人员)向 joe bloggs 发送一个可执行文件,然后运行它,您就可以查看他们的计算机。PChelpWare 就是这样做的 - 使您能够创建这样的可执行文件。但是,B 可以连接到您的过程可以通过 SSH 完成。

例如在本地 ssh 隧道场景中,您可能有

CompA, runs VNC client and SSH client
CompB, runs VNC server and SSH server

因此隧道和 VNC 连接朝着同一个方向。

A 将其 SSH 客户端 (ssh.exe) 连接到 B 的 SSH 服务器 (sshd.exe)。(需要 B 在其路由器上进行端口转发)。A 上的 ssh.exe 随后在 A(它正在运行的计算机)上创建一个端口,该端口监听 VNC 连接。这是隧道的监听端。此外,在构建隧道时,确定 B 应该转发到任何 IP:PORT,在本例中为 B。这是 VNC 服务器所在的位置。

CompA/PersonA 将 VNC 客户端连接到 ssh.exe 在 A 上打开的端口。然后转发到 B。

但是,使用本地 ssh 隧道存在一个问题。假设 B 不知道如何在路由器上进行端口转发。

然后 A 无法将其 SSH.EXE(其 ssh 客户端)连接到 B 的 SSHD.EXE(B 的 ssh 服务器)。

嗯,他们可以建立一个反向 SSH 隧道

A runs the SSH SERVER and VNC Client
B runs the SSH CLIENT and VNC Server..  

B 连接到 A.. 使用命令指示创建反向隧道。因此,监听不是在运行 SSH.EXE 的本地(即 B)进行的,而是在 A 上打开监听端口,即使 B 运行了 ssh.exe,因此 B 连接到 A 并建立 SSH 连接。A 现在监听封装的协议。

然后,A 将他的 VNC 客户端连接到 A 上打开的端口,并查看 B。

B 无需在路由器上进行端口转发。因为 B 只需发起连接即可。没有传入到 B 的连接。这就是 SSH 隧道可以做的事情。

(请注意,现在当 A 想要查看 B 时,他们通常使用 teamviewer 之类的解决方案,这可能涉及建立传出连接)

但无论如何,这是反向 ssh 隧道的使用。

因此,是否使用本地 ssh 隧道或反向 ssh 隧道取决于哪一端阻止传入,或者哪一端位于您无法控制的阻止传入的设备后面,例如您无法控制的 NAT 路由器或防火墙。

动态隧道是指 A 通过 SSH 连接到 B,并在 B 处创建 SOCKS 代理。SOCKS 代理就像一个通用代理……它可以模仿一堆不同类型的代理。因此它可以充当 Web 代理。因此,如果您在网吧……您可以使用动态隧道。连接到 CompB,这就是经营网吧的人所看到的一切。Web 代理的问题在于它不会只转发到一台计算机,否则您只能获得一个网站。它会转发到您请求的任何 Web 服务器,使您能够浏览 Web。

要使用 -L 执行 SSH,请在本地端进行监听,并在远程端进行端口转发,因此使用 SSH -L,您需要SSH -L PORT:IP:PORT user@sshserver -p 22 执行 PORT:IP:PORT 中的第一个“端口”是 ssh.exe 将在本地为您的例如 VNC 客户端创建的要连接的端口。而 IP:PORT 是例如 VNC 服务器的 IP:PORT。然后你有 sshserver -p 22 sshserver 是您要连接的 ssh 服务器的 IP,-p 22 表示通过端口 22 连接到它。您实际上可以不使用 PORT:IP:PORT,而是说 IP:PORT:IP:PORT,其中第一个 IP 是 0.0.0.0 或 *,这意味着任何计算机都可以连接。

SSH 但使用反向 ssh 隧道,在远程端进行侦听,并在本地进行端口转发。因此,您执行 SSH -R PORT:IP:PORT,其中第一个 PORT 是侦听的 sshd.exe 端的端口。而 IP:PORT 是 VNC 服务器的 IP:PORT,即 CompA(即运行 ssh.exe 的公司)将转发到的服务器。它也是SSH -R PORT:IP:PORT user@sshserver -p 22

动态 SSH 的形式如下ssh -D 8080 <username>@192.168.1.1

有人做了一个反向版本..反向 SSH -D。https://web.archive.org/web/20200618074454/https://stackoverflow.com/questions/842021/ssh-d-port-usernameserver-com-but-in-reverse 他运行了一个 SSH 服务器,并希望他的朋友能够访问他的 SSH 代理。因此,他的朋友会运行 ssh -D[电子邮件保护]但他不想让他的朋友也拥有 SSH 控制台。毫无疑问,有更好的方法来防止这种情况发生,但他所做的或要求做的是他与朋友建立 SSH 连接,然后让他的朋友访问他的 SSH SOCKS 代理。所以他的朋友有一个代理来访问他的 SOCKS 代理!所以他(个人 A- 设置他的计算机以便他的朋友可以访问他(A)的代理)将输入ssh -R 24680:localhost:12345 remotehost 然后执行ssh -D 12345 localhost ssh -R,意味着第一个指定端口(24680)将在 CompB 上打开。并且在该端口(B 连接其 Web 浏览器的地方)上收到的任何内容都将发送到 A 并转发到端口 12345,这是 A 运行其 SOCKS 代理的地方。SOCKS 代理的设置方式(即如何使用 SSH 设置 SOCKS 代理)的有趣之处在于它需要自己的 ssh 连接。这不是通过 SSH 隧道传输 SSH。SOCKS 请求是通过 SSH 隧道传输的。但是,建立 SOCKS 代理的 ssh 连接是来自 A 连接到其自己的 ssh 服务器端口 22 的单独连接。(除了 A 正在与 B 建立的 SSH 连接之外)。最后一个例子,反向 ssh -D 是 SSH 的一个非常复杂的用法!其他用法(本地、反向和正常 -D)仍然很复杂,但没有反向 -D 示例那么复杂。我只是为了更完整而添加它。

另请参阅我的回答从 LAN 外部通过 VNC 控制树莓派:没有端口转发如何实现?

相关内容