SSH端口转发(port forwarding)基础知识

1.介绍

我们知道SSH的一个重要作用就是连接远程机器(比如一台服务器)来实现对远程机器的操作。

但是除此之外,SSH还可以用于构建机器之间的通信中介

举个简单的例子,我们有时会在本地(localhost)运行某些程序或应用,而每个程序或者应用都会运行在一个指定的端口下(port), 我们可以直接通过监听(listen)该端口来查看其他用户向该应用发出的请求(request)并做出响应(response)。但是如果我们希望对本地端口的请求,由远程机器来进行响应,换句话说,我们希望能将发送给本地端口的请求转发给远程机器,又该怎么做呢?一种做法就是使用SSH端口转发(也叫做SSH隧道)。

事实上上面我描述的这种端口转发是本地转发(local port forwarding),也就是说我希望发送给我本地端口的请求转发到远程机器上。那么反过来,另外一种转发方式就是(remote port forwarding),也就是说远程机器监听请求并将请求转发给本地机器来做出响应。下面我来具体介绍一下这两种转发方式。

2.本地转发

本地转发(local port forwarding)概念

 首先先放一张图,此图来源是StackOverflow的某个帖子,觉得很棒就直接搬运过来了。

在本地转发的情况下,本地机器(上图中的your host)是ssh的客户端,同时也是应用的客户端(监听请求),而隧道另一头的远程机器既是ssh的服务端,也是应用的服务端(上图的情况1)或跳板机(情况2)。

关于如何具体建立本地转发的终端指令,上图中也非常清楚的展示了,这里再做一个简单说明。

1.如果目标机器(希望获得响应的host)就是我们SSH隧道的终点机器的话,就对应着上图中的第一部分。

$ ssh -L 123:localhost:456 remote-host

这里的L代表 Local的形式,而123代表本机的123端口(监听请求), localhost:456代表的是远程机器的456端口,这里要注意的是localhost并不是指我们的本地主机,而是远程机器的localhost. 最后一部分就是登录远程机器的信息。

2.如果目标机器(希望获得响应的host)并不是我们SSH隧道的终点,我们建立SSH隧道的终点只是一个SSH跳板机时,就对应着上图中的第二部分。

$ ssh -L 123:target-host:456 remote-host

本地转发(local port forwarding)应用

相对来说本地转发是比较常见的一种情况,比如我们在做一些机器学习或者深度学习任务时,当我们想要获取更快的训练速度时,会希望使用性能更好的远程服务器而不是本地主机来运行代码。比如我们使用jupyter notebook编写代码时,就可以将Jupyter notebook运行在服务器上,然后本地来进行操作。

这个时候,我们就可以使用local forwarding来实现了,假设我们已经在服务器上开启了Jupyter Notebook应用,端口号为8888,这个时候我们希望从本地主机的9999端口来建立隧道。就可以使用如下命令。

$ ssh -L 9999:localhost:8888 user@remote_server

当然,最后一部分的user@remote_server就是指定服务器的账户。接下来我们就可以在本机上进入localhost:9999来进行代码的编写了,而运行任务会转发给远程服务器。

除此之外,另一个简单的应用就是vpn,我们可以借助本地转发来实现一个穷人版的vpn假如我们想访问某个内网的服务器,端口号为80,443,但是内网的服务器无法从外网直接访问,但是如果网络管理者为我们开放了一个bastion host提供ssh服务,那么我们就可以借助它作为我们的跳板机访问内部服务器。

$ ssh -L 8080:internal-server:80 -L 8443:internal-server:443 bastion-host -N

其中8080和8443分别为本机端口。

OK,接下来我们来进入远程转发的介绍。

3.远程转发

远程转发(remote port forwarding)概念

同样的,先上图。

在远程转发的情况下,本地主机(your host)同样作为ssh的客户端,远程主机(remotehost)同样是ssh的服务端,但是与本地转发不同的是,这时远程主机才是应用的监听端,将请求转发给本地主机,本地主机是应用的服务端。

关于具体的终端指令,上图中有清晰的说明,同时逻辑与本地转发十分类似,这里就不再重复说明了。这里主要来介绍一下远程转发的的应用例子。

远程转发(remote port forwarding)应用

事实上,远程转发主要针对的是内网的情况。通常情况下,当我们的本地主机处于外网,而目标机器或者目标机器与SSH的跳板机均位于内网中。那么我们是无法简单通过本地转发连接到内网中的目标主机的。这时我们只能反过来通过SSH跳板机来发起隧道,即让远端的机器(我们的本地主机)来进行端口转发。假设我的本地主机端口为2080,内网中的服务端口为80,此时在SSH跳板机应该输入如下指令

$ ssh -R 2080:target-server:80 local-host

此时,本地机器lcoal-host作为ssh的服务端,必须要安装SSH服务器,才能接受跳板机的远程登录。

4.小总结与额外补充

事实上,本地转发与远程转发的核心区别就在于发起转发请求的host究竟需要扮演什么角色。对于本地转发而言,发起转发请求的host就是服务的监听端,本身却不是服务端响应端,而对于远程转发而言,发起转发请求的host就是真正的服务响应端(除非如上面的例子,作为SSH跳板机)。

同时我们在进行转发命令时,通常会有一些基本的选项,比如-N和-f.

-N:代表这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道。

-f:后台运行SSH隧道,即使我们关闭了创建隧道时所使用的SSH会话,对应的SSH隧道也不会消失。

OK,以上就是这篇文章的全部内容,谢谢大家的阅读。

参考:

1.SSH端口转发

2.An Illustrated Guide to SSH Tunnels

3.ssh端口转发:ssh隧道

4.MIT-Missing Semester-Command_line_environment

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Cisco NAT是一种网络地址转换技术,用于将一个内部网络的私有IP地址转换为外部网络的公共IP地址,从而实现互联网访问。如果我们想通过外网SSH登录内部网络设备,我们可以使用Cisco NAT来实现此功能。 首先,我们需要在内部网络设备上配置SSH服务,并分配一个SSH端口号。然后,我们需要在Cisco NAT设备上进行以下配置: 1. 配置访问控制列表(ACL):我们需要创建一个ACL来允许外部网络的SSH连接通过NAT设备访问内部网络设备。ACL应该包括外部IP地址和允许的SSH端口号。 2. 配置静态NAT:我们需要为内部网络设备创建一个静态NAT映射,将其内部IP地址映射到外部网络的公共IP地址。这样,外部网络的SSH请求才能正确地转发到内部网络设备。 3. 配置端口转发:如果我们有多个内部网络设备需要通过SSH访问,我们可以配置端口转发来将外部网络的不同SSH端口号转发到内部网络的不同设备。这样,我们可以使用不同的SSH端口号访问不同的设备。 最后,我们可以通过外网使用SSH客户端工具来连接内网设备。在SSH客户端中,我们需要输入NAT设备的外部公共IP地址和配置的SSH端口号。当我们连接时,NAT设备将自动将SSH请求转发到正确的内部网络设备上,从而允许我们通过外网SSH登录到内部网络设备。 使用Cisco NAT技术可以实现外网SSH登录内网设备的安全访问,但我们还应该采取其他安全措施,例如使用强密码、启用SSH加密等,以确保网络的安全性。 ### 回答2: Cisco NAT 是一种网络地址转换技术,通过它可以实现在外网通过 SSH 登录内网设备。 在使用 Cisco NAT 进行外网 SSH 登录内网设备时,我们需要进行以下配置: 1. 在边界设备上配置静态 NAT:通过在边界设备上配置静态 NAT,将外部 IP 地址映射到内网设备的 IP 地址。例如,我们可以将外部 IP 地址映射到内网设备上的 SSH 端口(默认为端口22)。 2. 在边界设备上配置访问控制列表(ACL):为了保证安全性,在配置 NAT 的同时,我们需要配置 ACL,限制允许进行 SSH 登录的 IP 地址范围。只有在 ACL 允许的 IP 地址下,才能够使用该外网 IP 地址进行 SSH 登录。 3. 配置 SSH:在内网设备上,我们需要配置 SSH 服务。可以指定允许进行 SSH 登录的用户名和密码,或者使用密钥进行身份验证。 4. 配置路由:在边界设备上配置路由,确保外网数据包可以正确地转发到内网设备。 配置完成后,我们可以通过在外网使用指定的公共 IP 地址和指定的 SSH 端口,连接到内网设备。例如,如果我们将外部 IP 地址映射到内网设备的 SSH 端口上,我们可以使用类似于 "ssh username@外部IP地址 -p port" 的命令,在外网通过 SSH 登录到内网设备。 总结来说,通过 Cisco NAT 技术可以方便地实现从外网通过 SSH 登录内网设备。但在配置 NAT 时,需要同时考虑安全性,通过限制 ACL、配置 SSH 和路由等方式来保障网络安全。 ### 回答3: 在使用Cisco NAT技术实现从外网通过SSH登录内网设备时,需要进行以下步骤: 1. 配置源地址转换(PAT):在NAT设备上设置NAT转换规则,将内网设备的IP地址转换为NAT设备的公网IP地址。这样,内网设备发送的SSH数据包会经过NAT设备并被转换为公网IP地址。 2. 开启SSH访问:确保内网设备已启用SSH远程访问功能,并在其配置中设置SSH登录所需的用户名和密码。也可以配置密钥认证机制,提高安全性。 3. 配置访问控制列表(ACL):在NAT设备上创建ACL,并将SSH连接的源IP地址添加到允许访问的列表中。这样,只有在ACL中指定的IP地址才能建立到内网设备的SSH连接。 4. 配置端口转发Port Forwarding):在NAT设备上设置端口转发规则,将外部设备的SSH请求转发到内网设备的SSH服务端口上。这样,当外网设备通过指定的NAT设备的公网IP地址和端口号连接时,请求会被转发到相应内网设备上。 5. 防火墙配置:如果在内网中存在防火墙,需要相应地配置防火墙规则,允许对内网设备的SSH连接。确保防火墙未阻止SSH连接。 通过以上步骤的配置,就可以从外网通过SSH连接NAT设备,并远程登录到内网设备。这样,可以实现对内网设备的远程管理和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值