📜  如何在 Linux 中创建 SSH 隧道或端口转发?

📅  最后修改于: 2022-05-13 01:57:29.971000             🧑  作者: Mango

如何在 Linux 中创建 SSH 隧道或端口转发?

SSH 是适用于 Linux 的安全 shell标准客户端实用程序。它用于建立与远程(甚至本地)ssh 服务器的安全连接。但是有些程序的设计不够灵活,无法通过 ssh 简单的方式处理:程序只能使用本地连接,或者一些相关的网络地址很难用代码定义。这就是为什么 SSH 包含多个选项来重定向安全流量以匹配此类用例。让我们逐个案例来看看它是如何工作的。

本地主机上的转发端口

第一种情况:我们有一个经过硬编码的应用程序,可以通过指定的端口连接到 localhost 服务器。我们的目标是使用带有另一个端口的远程服务器。这里还有一点是:传输数据的安全(加密)方式。接下来是来自客户端和服务器端的 localhost 测试代码。

本地重定向概述:

重定向模式

在这种模式下,服务器在远程主机的 9000 端口上运行。但我们的客户端应用程序只希望它在 localhost 端口 5000 上运行。让我们期待它硬编码的应用内代码。

在 localhost 脚本正文中转发端口:

#!/usr/bin/env bash
nc -l 9000 &
PID0=$!
ssh alexey@localhost -L 5000:localhost:9000 sleep 4 &
PID1=$!
sleep 1
echo done | nc -N localhost 5000
sleep 1
kill -9 $PID0 $PID1 2> /dev/null

在本地主机脚本执行控制台转发端口:

黄色矩形中的脚本主体区域,矩形旁边的输出

在第一个字符串中,我们在后台模式下的端口9000上创建了一个 TCP 服务器(看看该命令以 '&' 符号结尾)。接下来,我们将服务器PID (进程标识)存储在局部变量PID0中。然后,我们使用选项将传入本地端口5000的连接重定向到远程主机9000对我们自己的主机运行 ssh 会话。 -L选项语法: -L :: localhost port> 。我们在后台模式下使用“sleep 4”命令运行会话以打开重定向 4 秒,然后结束会话。接下来,我们将 ssh 会话的PID存储到PID1变量中。下一行我们休眠 1 秒以确保服务器启动并且 ssh 会话启动。下一行,我们使用 nc 命令将“完成”文本发送到端口5000 ,并使用 -N 关闭会话。接下来,我们休眠 1 秒以通过安全隧道处理流量重定向,并在输出端“完成”。然后运行服务器和 ssh 隧道会话的 sanity kill 随之而来。如您所见,可以在此脚本中针对 使用任何 - 以便能够以安全的方式使用远程服务器。即使客户端应用程序不是为使用它而设计的。

远程主机的转发端口

如果远程服务器没有“白色”地址并且通过 NAT(网络地址转换)工作,我们仍然需要一个安全的隧道。但是在这种情况下无法检测到远程目的地。相反,可以安排与知名中央主机的安全连接。并重定向中央主机上的端口,以供这些客户端通过 NAT 连接对等方。不同之处在于使远程主机上的端口 5000 可用于重定向到我们主机上的本地端口 9000。

重定向模式

远程主机脚本主体的转发端口:

#!/usr/bin/env bash
nc -l 9000 &
PID0=$!
ssh alexey@localhost -L 5000:localhost:9000 sleep 4 &
PID1=$!
sleep 1
echo done | nc -N localhost 5000
sleep 1
kill -9 $PID0 $PID1 2> /dev/null

在远程主机脚本执行控制台转发端口:

黄色矩形中的脚本主体区域,矩形旁边的输出

脚本中的所有操作都与前一种情况相同。但是重定向的含义是不同的。我们将远程主机端口 5000 重定向到本地主机端口 9000,并创建一个安全隧道以将连接从远程主机端口 5000 传递到本地主机端口 9000。这使得它可以以安全的方式工作,即使是通过 NAT 的主机。

SSH 接口隧道

安全应用互连描述

使用 ssh 的另一个选项是通过使用 at ssh 的隧道接口公开安全连接的对等方的 IP 地址。我们通过 localhost 的tun接口公开 IP 地址,以便与远程主机上的服务器一起使用。接下来的示例将发现细节。

SSH 接口隧道脚本:

#!/usr/bin/env bash
(ssh -tt root@192.168.144.207 -w 2:2 << EOF
ifconfig tun2 10.1.1.1/24 pointopoint 10.1.1.2 up
nc -l 10.1.1.1 9000
EOF
) 2>/dev/null | grep ok &
PID=$!
sleep 1
ifconfig tun2 10.1.1.2/24 pointopoint 10.1.1.1 up
echo ok | nc -N 10.1.1.1 9000

SSH接口隧道脚本执行控制台:

黄色矩形中的脚本主体区域,矩形旁边的输出

在第一个字符串中,我们创建了一个到远程主机的 ssh 连接。以 root 身份运行脚本非常重要:它将在系统中创建虚拟隧道 ( tun)接口。只有root才能使其合法。选项-w具有以下语法: -w localhost , tun interface index on remote port> 。这些特定的接口以安全的方式相互映射——会话到达端口的 localhost tun 接口被安全地重定向到同一端口的远程主机映射的 tun 接口。下一个字符串,我们使用 ifconfig 实用程序为远程tun-s设置一些内部地址并将其打开。第二个地址 ( pointopoint ) 指向要在隧道中使用的对等 ip。下一个字符串,我们在端口9000上启动nc TCP 服务器。请注意服务器的ip地址:与对应tun接口的地址匹配。下一个字符串我们忽略错误并仅选择包含消息的ok (如果有)。其余的脚本字符串在本地端使用。我们睡 1 秒钟以确保隧道的完整性。接下来,我们为本地tun接口设置 IP 地址以匹配对等 IP 地址参数(第一个和第二个地址在对等和本地主机上匹配)。我们打开界面的命令相同。下一条命令启动 tcp 客户端,该客户端在特定端口上建立与本地 tun 接口的连接并发送“ok”消息。正如我们所记得的——服务器在同一端口的另一台主机上启动。脚本的最后一个字符串:我们用隧道和服务器杀死 ssh。如果您在同一个地址上拥有多台服务器——这种方法可能很有用,因为它只需为多个端口设置一次。