如何在 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
远程主机的转发端口
如果远程服务器没有“白色”地址并且通过 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