你可能已经熟悉使用 ssh 命令访问远程系统。ssh
命令背后所使用的协议容许终端的输入和输出流经安全通道。可是你知道也可使用 ssh
来安全地发送和接收其余数据吗?一种方法是使用“端口转发”,它容许你在进行 ssh
会话时安全地链接网络端口。本文向你展现了它是如何工做的。linux
标准 Linux 系统已分配了一组网络端口,范围是 0 - 65535。系统会保留 0 - 1023 的端口以供系统使用。在许多系统中,你不能选择使用这些低端口号。一般有几个端口用于运行特定的服务。你能够在系统的 /etc/services
文件中找到这些定义。git
你能够认为网络端口是相似的物理端口或能够链接到电缆的插孔。端口能够链接到系统上的某种服务,相似物理插孔后面的接线。一个例子是 Apache Web 服务器(也称为 httpd
)。对于 HTTP 非安全链接,Web 服务器一般要求在主机系统上使用端口 80,对于 HTTPS 安全链接一般要求使用 443。github
当你链接到远程系统(例如,使用 Web 浏览器)时,你是将浏览器“链接”到你的主机上的端口。这一般是一个随机的高端口号,例如 54001。你的主机上的端口链接到远程主机上的端口(例如 443)来访问其安全的 Web 服务器。浏览器
那么,当你有这么多可用端口时,为何还要使用端口转发呢?这是 Web 开发人员生活中的几种常见状况。安全
想象一下,你正在名为 remote.example.com
的远程系统上进行 Web 开发。一般,你是经过 ssh
进入此系统的,可是它位于防火墙后面,并且该防火墙不多容许其余类型的访问,而且会阻塞大多数其余端口。要尝试你的网络应用,可以使用浏览器访问远程系统会颇有帮助。可是,因为使用了讨厌的防火墙,你没法经过在浏览器中输入 URL 的常规方法来访问它。ruby
本地转发使你能够经过 ssh
链接来创建可经过远程系统访问的端口。该端口在系统上显示为本地端口(于是称为“本地转发”)。bash
假设你的网络应用在 remote.example.com
的 8000 端口上运行。要将那个系统的 8000 端口本地转发到你系统上的 8000 端口,请在开始会话时将 -L
选项与 ssh
结合使用:服务器
$ ssh -L 8000:localhost:8000 remote.example.com
复制代码
等等,为何咱们使用 localhost
做为转发目标?这是由于从 remote.example.com
的角度来看,你是在要求主机使用其本身的端口 8000。(回想一下,任何主机一般能够经过网络链接 localhost
而链接到自身。)如今那个端口链接到你系统的 8000 端口了。ssh
会话准备就绪后,将其保持打开状态,而后能够在浏览器中键入 http://localhost:8000
来查看你的 Web 应用。如今,系统之间的流量能够经过 ssh
隧道安全地传输!网络
若是你有敏锐的眼睛,你可能已经注意到了一些东西。若是咱们要 remote.example.com
转发到与 localhost
不一样的主机名怎么办?若是它能够访问该网络上另外一个系统上的端口,那么一般能够一样轻松地转发该端口。例如,假设你想访问也在该远程网络中的 db.example.com
的 MariaDB 或 MySQL 服务。该服务一般在端口 3306 上运行。所以,即便你没法 ssh
到实际的 db.example.com
主机,你也可使用此命令将其转发:ssh
$ ssh -L 3306:db.example.com:3306 remote.example.com
复制代码
如今,你能够在 localhost
上运行 MariaDB 命令,而其实是在使用 db.example.com
主机。
远程转发让你能够进行相反操做。想象一下,你正在为办公室的朋友设计一个 Web 应用,并想向他们展现你的工做。不过,不幸的是,你在咖啡店里工做,而且因为网络设置,他们没法经过网络链接访问你的笔记本电脑。可是,你同时使用着办公室的 remote.example.com
系统,而且仍然可在这里登陆。你的 Web 应用彷佛在本地 5000 端口上运行良好。
远程端口转发使你能够经过 ssh
链接从本地系统创建端口的隧道,并使该端口在远程系统上可用。在开始 ssh
会话时,只需使用 -R
选项:
$ ssh -R 6000:localhost:5000 remote.example.com
复制代码
如今,当在公司防火墙内的朋友打开浏览器时,他们能够进入 http://remote.example.com:6000
查看你的工做。就像在本地端口转发示例中同样,通讯经过 ssh
会话安全地进行。
默认状况下,sshd
守护进程运行在设置的主机上,所以只有该主机能够链接它的远程转发端口。假设你的朋友但愿可以让其余 example.com
公司主机上的人看到你的工做,而他们不在 remote.example.com
上。你须要让 remote.example.com
主机的全部者将如下选项之一添加到 /etc/ssh/sshd_config
中:
GatewayPorts yes # 或
GatewayPorts clientspecified
复制代码
第一个选项意味着 remote.example.com
上的全部网络接口均可以使用远程转发的端口。第二个意味着创建隧道的客户端能够选择地址。默认状况下,此选项设置为 no
。
使用此选项,你做为 ssh
客户端仍必须指定能够共享你这边转发端口的接口。经过在本地端口以前添加网络地址范围来进行此操做。有几种方法能够作到,包括:
$ ssh -R *:6000:localhost:5000 # 全部网络
$ ssh -R 0.0.0.0:6000:localhost:5000 # 全部网络
$ ssh -R 192.168.1.15:6000:localhost:5000 # 单个网络
$ ssh -R remote.example.com:6000:localhost:5000 # 单个网络
复制代码
请注意,本地和远程系统上的端口号没必要相同。实际上,有时你甚至可能没法使用相同的端口。例如,普通用户可能不会在默认设置中转发到系统端口。
另外,能够限制主机上的转发。若是你须要在联网主机上更严格的安全性,那么这你来讲可能很重要。 sshd
守护程进程的 PermitOpen
选项控制是否以及哪些端口可用于 TCP 转发。默认设置为 any
,这让上面的全部示例都能正常工做。要禁止任何端口转发,请选择 none
,或仅容许的特定的“主机:端口”。有关更多信息,请在手册页中搜索 PermitOpen
来配置 sshd
守护进程:
$ man sshd_config
复制代码
最后,请记住,只有在 ssh
会话处于打开状态时才会端口转发。若是须要长时间保持转发活动,请尝试使用 -N
选项在后台运行会话。确保控制台已锁定,以防止在你离开控制台时其被篡夺。
via: fedoramagazine.org/using-ssh-p…
做者:Paul W. Frields 选题:lujun9972 译者:geekpi 校对:wxy