测试SSH端口转发

要查看端口转发是否正常工作,我们可以使用 netcat 命令。
在客户端计算机(我们运行 ssh -L 命令的系统)上,使用以下语法键入 netcat 命令:

$ nc -v remote_ip port_number

如果端口被转发并且数据能够成功通过连接,Netcat 将返回一条成功消息,如果它不工作,连接将超时。

如果我们在使端口转发工作时遇到问题,请确保我们能够正常 ssh 进入远程服务器并且我们已正确配置端口。
此外,请确认连接未被防火墙阻止。

持久 SSH 隧道(使用 Autossh)

Autossh 是一种可用于创建持久 SSH 隧道的工具。
唯一的准备工作是我们需要在系统之间配置公钥身份验证,除非我们希望每次连接断开并重新建立时都提示我们输入密码。

Autossh 可能不会默认安装在系统上,但我们可以使用 apt、yum 或者发行版使用的任何包管理器快速安装它。

$ sudo apt-get install autossh

autossh 命令看起来与我们之前运行的 ssh 命令非常相似。

$ autossh -L 80:example1.com:80 example2.com

Autossh 将确保自动重新建立隧道,以防它们因不活动、远程机器重新启动、网络连接丢失等而关闭。

远程转发

远程端口转发用于让远程机器访问系统。
例如,如果我们希望专用网络上的系统可以访问本地计算机上的服务,我们可以配置远程端口转发来实现这一点。

要进行设置,请使用以下语法发出 ssh 命令:

$ ssh -R remote_port:local_ip:local_port jack@onitroad

如果计算机上有本地 Web 服务器并希望授予从远程网络访问它的权限,我们可以将远程系统上的端口 8080(通用 http 替代端口)转发到本地系统上的端口 80(http 端口)。

$ ssh -R 8080:localhost:80 jack@onitroad

本地转发

本地转发涉及将端口从客户端系统转发到服务器。
它允许我们在系统上配置一个端口,以便通过 SSH 隧道转发到该端口的所有连接。

在 ssh 命令中使用 -L 开关来指定本地端口转发。
命令的一般语法是这样的:

$ ssh -L local_port:remote_ip:remote_port jack@onitroad

看看下面的例子:

$ ssh -L 80:example1.com:80 example2.com

此命令会将所有对 example1.com 的请求转发到 example2.com。
此系统上的任何用户打开 Web 浏览器并尝试导航到 example1.com,都会在后台将他们的请求发送到 example2.com 并显示不同的网站。

在配置对内部网或者其他专用网络资源的外部访问时,此类命令很有用。

为什么要使用 SSH 端口转发?

由于 SSH 创建加密连接,如果应用程序以明文形式传输数据或者使用未加密的协议,则这是一个理想的解决方案。
对于遗留应用程序尤其如此。

使用它从外部连接到本地网络也很流行——例如,员工使用 SSH 隧道连接到的内部网。

我们可能认为这听起来像 VPN。
两者相似,但创建 ssh 隧道是针对特定流量的,而 VPN 则更多地用于建立一般连接。

SSH 端口转发将允许我们通过建立 SSH 隧道来访问远程资源。
唯一的要求是我们可以通过 SSH 访问远程系统,并且最好为无密码 SSH 配置公钥身份验证。

低延迟

SSH 端口转发出现的唯一真正问题是通常会有一点延迟。
如果你在做一些小事,比如访问文本文件或者小型数据库,你可能不会注意到这个问题。

在进行网络密集型活动时,问题变得更加明显,尤其是当我们将端口转发设置为 SOCKS 代理服务器时。

延迟的原因是因为 SSH 通过 TCP 隧道传输 TCP。
这是一种非常低效的数据传输方式,会导致网络速度变慢。

我们可以使用 VPN 来防止该问题,但如果我们决定坚持使用 SSH 隧道,则有一个名为 sshuttle 的程序可以解决该问题。
基于 Ubuntu 和 Debian 的发行版可以使用 apt-get 安装它:

$ sudo apt-get install sshuttle

如果发行版上的包管理器在其存储库中没有 sshuttle,我们可以从 GitHub 克隆它:

$ git clone https://github.com/sshuttle/sshuttle.git
$ cd sshuttle
$ ./setup.py install

使用 sshuttle 设置隧道与普通的 ssh 命令不同。
要设置转发所有流量的隧道(类似于 VPN):

$ sudo sshuttle -r jack@onitroad_ip -x remote_ip 0/0 -vv

在终端中使用 ctrl+c 组合键断开连接。
或者,要将 sshuttle 命令作为守护程序运行,请将 -D 开关添加到命令中。

Linux 中的 SSH 端口转发(隧道)

在本教程中,我们将介绍 Linux 中的 SSH 端口转发。
这是 Linux 管理员用来跨不同系统创建加密和安全中继的 SSH 实用程序的一项功能。

我们可以使用 SSH 端口转发(SSH 隧道)在两个或者多个系统之间创建安全连接。
然后应用程序可以使用这些隧道传输数据。

列出端口转发

我们可以使用 lsof 命令查看当前建立的 SSH 隧道。

$ lsof -i | egrep '\<ssh\>'

在此屏幕截图中,我们可以看到建立了 3 个 SSH 隧道。
添加 -n 标志以列出 IP 地址而不是解析主机名。

$ lsof -i -n | egrep '\<ssh\>'

多重转发

对于本地端口转发,如果你想设置多个端口转发到远程主机,你只需要每次用一个新的 -L 开关指定每个规则。
命令语法是这样的:

$ ssh -L local_port_1:remote_ip:remote_port_1 -L local_port_2:remote_ip:remote_port2 jack@onitroad

例如,如果要将端口 8080 和 4430 分别转发到 192.168.1.1 端口 80 和 443(HTTP 和 HTTPS),则可以使用以下命令:

$ ssh -L 8080:192.168.1.1:80 -L 4430:192.168.1.1:443 jack@onitroad

对于远程端口转发,我们可以通过使用 -R 开关指定每个新规则来设置要转发的多个端口。
命令语法是这样的:

$ ssh -R remote_port1:local_ip:local_port1 remote_port2:local_ip:local_port2 jack@onitroad

动态转发

SSH 动态端口转发将使 SSH 充当 SOCKS 代理服务器。
这不是在特定端口上转发流量(本地和远程端口转发的方式),而是跨一系列端口转发流量。

如果我们曾经使用代理服务器访问被阻止的网站或者查看受位置限制的内容(例如在 Netflix 上查看我们所在国家/地区不可用的内容),那么我们可能使用了 SOCKS 服务器。

它还提供隐私,因为我们可以通过具有动态端口转发的 SOCKS 服务器路由流量,并防止任何人窥探日志文件以查看网络流量(访问的网站等)。

要设置动态端口转发,请使用具有以下语法的 ssh 命令:

$ ssh -D local_port jack@onitroad

因此,如果我们想将端口 1234 上的流量转发到我们的 SSH 服务器:

$ ssh -D 1234 jack@onitroad

建立此连接后,我们可以配置应用程序以通过它路由流量。
例如,在网络浏览器上:

输入环回地址 (127.0.0.1) 和我们为动态端口转发配置的端口,所有流量将通过 SSH 隧道转发到远程主机(在我们的示例中,onitroad.com SSH 服务器)。

可能有多少个会话?

从技术上讲,我们可以根据需要指定任意数量的端口转发会话。
网络使用 65,535 个不同的端口,我们可以根据需要转发其中的任何一个。

转发流量时,请注意使用某些端口的服务。
例如,端口 80 是为 HTTP 保留的。

因此,如果我们打算转发 Web 请求,我们只想转发端口 80 上的流量。

我们在本地系统上转发的端口不必与远程服务器的端口相匹配。
例如,我们可以将本地主机上的端口 8080 转发到远程主机上的端口 80。

如果我们不关心在本地系统上使用的端口,请选择 2,000 到 10,000 之间的一个,因为这些端口很少使用。
较小的数字通常是为某些协议保留的。

限制转发

默认情况下,SSH 端口转发是非常开放的。
我们可以随意创建本地、远程和动态端口转发。

但是,如果我们不信任系统上的某些 SSH 用户,或者我们只是想增强总体安全性,则可以对 SSH 端口转发进行一些限制。

我们可以在 sshd_config 文件中配置几个不同的设置来限制端口转发。
要配置此文件,请使用 vi、nano 或者我们喜欢的文本编辑器对其进行编辑:

$ sudo vi /etc/ssh/sshd_config

PermitOpen 可用于指定允许端口转发的目的地。
如果我们只想允许转发到某些 IP 地址或者主机名,请使用此指令。
语法如下:

PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port

AllowTCPForwarding 可用于打开或者关闭 SSH 端口转发或者指定允许的 SSH 端口转发类型。
可能的配置是:

AllowTCPForwarding yes #default setting
AllowTCPForwarding no #prevent all SSH port forwarding
AllowTCPForwarding local #allow only local SSH port forwarding
AllowTCPForwarding remote #allow only remote SSH port forwarding

要查看有关这些选项的更多信息,我们可以查看手册页:

$ man sshd_config

什么是SSH端口转发?

简而言之,SSH 端口转发涉及在两个或者多个系统之间建立 SSH 隧道,然后将系统配置为通过该连接传输指定类型的流量。

你可以用它做一些不同的事情:本地转发、远程转发和动态端口转发。
每个配置都需要自己的设置步骤,因此我们将在本教程的后面部分逐一介绍。

本地端口转发用于使本地网络上的外部资源可用。
建立到远程系统的 SSH 隧道,来自本地网络的流量可以使用该隧道来回传输数据,访问远程系统和网络,就好像它是本地网络的一部分。

远程端口转发正好相反。
建立了 SSH 隧道,但远程系统能够访问本地网络。

动态端口转发设置 SOCKS 代理服务器。
我们可以配置应用程序以连接到代理并通过它传输所有数据。
最常见的用途是用于私有网页浏览或者使连接看似来自不同的国家或者地区。

我们可以使用 SSH 端口转发来设置虚拟专用网络 (VPN)。
为此,我们需要一个名为 sshuttle 的另外程序。
我们将在本教程后面介绍详细信息。

日期:2020-07-15 11:16:33 来源:oir作者:oir