外行术语中的 SSH 隧道

Rah*_*ora 3 ssh ssh-tunnel

SSH隧道到底是什么?术语之间有什么区别:SSH 隧道和端口转发?不同类型的 SSH 隧道方法之间的确切区别是什么?

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

可以使用每种类型的理想场景是什么?

har*_*ymc 7

通俗地说,Secure Shell 或 SSH 是在两个计算机程序之间建立的:

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

客户端和服务器之间的连接使用加密,因此在不安全的网络上建立有效的安全通道。术语“安全外壳”来自服务器在服务器计算机上运行本地外壳的能力,允许客户端执行命令并查看其结果。但是 SSH 也可以用于许多其他目的。

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

图片

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

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

执行远程命令

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

$ ssh host command
Run Code Online (Sandbox Code Playgroud)

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

$ ssh host df
Run Code Online (Sandbox Code Playgroud)

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

$ dd if=/dev/dsp | ssh -C user@host dd of=/dev/dsp
Run Code Online (Sandbox Code Playgroud)

使用 ssh 复制文件

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

可以使用命令 cat 进行复制。如果您尝试复制进程的输出而不是文件,这当然是一条合理的路线:

$ cat file | ssh -e none remote-host 'cat > file'
Run Code Online (Sandbox Code Playgroud)

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

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

$ scp .bash_profile matt@example.com:~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

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

本地端口转发

SSH 允许安全的端口转发。

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

从 A,运行:

A$ ssh C -L localport:B:remoteport
Run Code Online (Sandbox Code Playgroud)

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

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

例如,假设您的作品禁止了 reddit.com。运行这个:

# ssh yourserver -L 80:reddit.com:80
Run Code Online (Sandbox Code Playgroud)

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

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

Host redditfw
HostName yourserver
LocalForward 80 reddit.com:80
Run Code Online (Sandbox Code Playgroud)

远程端口转发

或者,假设您希望通过安全地通过本地计算机 C 来授予远程计算机 B 访问另一台计算机 A 的权限。

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

C$ ssh B -R remoteport:A:targetport
Run Code Online (Sandbox Code Playgroud)

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

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

GatewayPorts yes
Run Code Online (Sandbox Code Playgroud)

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

Host exportme
HostName B
RemoteForward remoteport A:targetport
Run Code Online (Sandbox Code Playgroud)

SSH 作为文件系统:sshfs

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

安装完成后,运行:

$ sshfs remote-host: local-mount-directory
Run Code Online (Sandbox Code Playgroud)

来源