SSH隧道与内网穿透

SSH参数解释

  • -L port:host:hostPort
    • 解释:将本地机器某个端口转发到远端指定机器的指定端口
    • 原理:本地机器分配了一个socket监听port端口,一旦端口上有了连接,该连接就经过安全通道转发出去,同时远程主机和host的hostPort端口建立连接。可以在配置文件中指定端口的转发。只有root才能转发特权端口。
  • -R port:host:hostPort
    • 解释:将远程主机的某个端口转发到本地端指定机器的指定端口。即反向隧道代理
    • 原理:远程主机上分配了一个socket监听port端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,同时本地主机和host的hostPort端口建立连接。可以在配置文件中指定端口的转发。只有root才能转发特权端口
  • -D port
    • 解释:指定一个本地机器动态的应用程序端口转发。即动态代理
    • 原理:本地机器上分配一个socket监听port端口,一旦这个端口上有了连接,该连接就会经过安全通道转发出去。根据应用程序的协议可以判断出远程主机将和哪里连接。可以在配置文件中指定端口的转发。只有root才能转发特权端口
  • -N
    • 解释:不执行远程登录命令,用于转发端口。若转发端口的命令未携带-N则会直接登录到远程机器内
  • -f
    • 解释:要求ssh命令在后台执行命令。
  • -g
    • 解释:允许远程主机连接本地转发的端口

本地转发

功能解释

在A服务器执行ssh命令登录B服务器启用ssh隧道,实现通过访问A服务器的转发端口,达到实际访问B服务器的目标端口的目的。
Replaced by Image Uploder

使用场景

出于各种网络或安全等原因,客户端服务直接访问B服务器的端口,因此只要A服务器可以访问到B服务器的ssh端口,就可以通过建立ssh隧道,实现客户端访问A服务器的转发端口间接访问到B服务器的指定端口

命令示例(以下命令均在A主机执行)
SSH登录后启用ssh隧道,但仅监听A主机127.0.0.1地址,退出ssh登录后隧道断开

ssh -L A转发port:B主机IP:B目的端口 root@B主机

SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭A主机终端后隧道断开

ssh -N -L A转发port:B主机IP:B目的端口 root@B主机

SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭A主机终端后隧道不会断开

ssh -f -N -L A转发port:B主机IP:B目的端口 root@B主机

指定A主机中ssh隧道转发端口绑定的网卡

ssh -f -N -L A主机IP:A转发port:B主机IP:B目的端口 root@B主机

将转发端口绑定至A主机所有网卡

ssh -g -f -N -L A转发port:B主机:B目的端口 root@B主机

远程转发

功能解释

远程转发即在B服务器执行ssh命令登录A服务器来启用SSH隧道,以实现通过访问A服务器的转发端口,达到实际访问为B服务器的目标端口的目的。它和本地转发的区别在于具体是在哪个服务器上使用的ssh命令建立隧道来访问的目标服务器端口。
Replaced by Image Uploder

使用场景

远程转发使用场景较为广泛且实用。

如果我们在家庭电脑上跑了一个tomcat服务并想提供到互联网访问,由于家庭电脑一般是通过路由器来访问互联网的(即在nat网络中),我们需要在家庭路由器中进行端口映射来实现。

如果我们是公共路由器没有权限怎么办?又或者在权限管控严格的公司中我们没有权限怎么办?

巧合的是,我们手上还有一台拥有公网IP的主机(如阿里云主机等),我们的家庭电脑是可以访问到互联网的(即可以SSH访问到拥有公网IP的主机),直接使用SSH隧道就可以解决以上问题。

命令示例(以下命令均在B主机执行)
SSH命令后不登录A主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭B主机终端后隧道不会断开

ssh -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机

看到这里,你一定会联想到以下两条指令来实现绑定到非lookback地址:

ssh -f -N -R A主机IP:A主机转发端口:B主机IP:B目的端口 root@A主机

ssh -g -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机

将远程转发绑定到网卡

上面我们尝试建立远程转发隧道后,仅监听127.0.0.1地址,这是因为在SSH服务的配置文件/etc/ssh/sshd_config中有这样一个配置

注:windows下user/.ssh/文件夹下没有config配置文件,可以手动创建一个config文件来实现对应的配置
GatewayPorts 是否允许远程主机连接本地的转发端口,默认值为 no。

将此项配置为yes并重启SSH服务后,再次执行命令

ssh -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机

这时远程转发的转发端口会设置在A主机的所有网卡上,即0.0.0.0

当然除了这种方法,我们还可以使用其他技术手段来实现允许其他主机访问A主机127.0.0.1地址的转发端口,例如在A主机用其他程序去反向代理127.0.0.1的转发端口(nginx反向代理)

动态转发

功能解释

动态转发即通过配置一个本地端口,将通过隧道的数据转发到目标端地址网络。

如下图所示,动态转发不像本地转发与远程转发一样转发端口与目标端口是一对一的,动态转发中的转发端口对应的目标是目标主机所在的整个网络。不过使用动态转发访问目标主机所在网络时需要应用程序本身支持代理配置或者使用socket代理工具。

使用场景

同样如上图所示,如果存在一个子网1与子网2之间设有防火墙,主机A只能访问到主机B的ssh端口,这时如果主机A或者外部客户端想要访问子网2中的任意IP的任意端口时,可以使用动态转发隧道实现。

命令示例(以下命令均在A主机执行)
SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭A主机终端后隧道不会断开

ssh -f -N -D A主机转发端口 root@A主机

SSH命令后不登录B主机,仅启用ssh隧道,监听A主机指定网卡IP地址,关闭A主机终端后隧道不会断开

ssh -f -N -D A主机IP地址:A主机转发端口 root@A主机

客户端代理配置

当动态代理隧道创建好之后我们还需要通过代理客户端进行设置后才能使用隧道。如果应用程序支持配置,直接配置即可。如果是不支持配置代理的应用程序则需要使用socket代理工具来搭配使用,常用的客户端代理工具有proxifier

建立稳定的代理隧道

通常我们ssh为了保证安全,当我们一段时间没有使用之后就会自动断开连接,这样非常不方便。因此我们需要一些手段来保证我们的ssh隧道更加稳定,不会中途断开

Putty

Putty是对Telnet、SSH、rlogin、纯TCP以及串行接口建立连接的软件。早期仅支持windows平台,最近逐渐开始支持其它平台

我们可以通过使用putty来创建一个ssh代理隧道建立一个稳定的连接

Autossh

Autossh是linux平台下建立稳定ssh代理隧道的工具

本文参考《SSH隧道详解与使用AutoSSH实现稳定的内网穿透》

### 什么是SSH内网穿透 SSH内网穿透是一种技术手段,允许外部网络访问位于内部局域网中的设备和服务。这种技术通常用于远程管理和数据传输场景下,解决因防火墙或路由器限制而导致无法直接访问目标主机的问题。 --- ### 使用Cpolar实现Linux系统的SSH内网穿透 对于基于Linux的操作系统,可以利用Cpolar工具快速完成SSH内网穿透配置。以下是具体说明: #### 安装Cpolar并创建公网SSH连接地址 在Linux环境中安装Cpolar后,可以通过其内置功能生成一个可被外网访问的SSH连接地址[^1]。此过程涉及启动Cpolar客户端并服务器建立隧道连接。 #### JuiceSSH进行公网远程连接 JuiceSSH是一款适用于Android平台的SSH客户端软件,在完成了上述步骤之后,用户能够借助该应用经由所生成的公有IP端口组合来登录到自己的Linux机器上。 #### 固定SSH公网地址及测试 为了保障每次重启服务或者更换会话时仍能保持一致性的接入路径,则需进一步设置固定的映射关系,并执行必要的功能性验证操作以确认一切正常运作。 --- ### Windows环境下SSH内网穿透方案 同样地,在微软Windows操作系统里也可以达成相似效果——即让外界得以穿越NAT层抵达个人计算机上的资源位置处。 #### 启用检验本地SSH服务能力 先要确保本机已开启支持OpenSSH协议的服务组件;接着运用标准命令行界面来进行初步的功能性检测,比如尝试ping回环地址localhost(127.0.0.1),以此判断当前状态是否满足预期需求[^2]。 #### Cpolar部署于Winows之上 紧接着按照官方指引下载对应版本号的exe文件包,依照提示完成整个安装配对流程直至成功上线运行为止。此时应该可以看到一条新的tcp类型的转发记录显示出来代表已经建立了通往互联网的大门入口通道。 #### 测试来自远方地点发起的安全shell请求能否顺利到达指定的目标节点那里去。 最后一步就是实际动手去做一下完整的端到端贯通实验啦! 只需要用任意一款兼容posix接口规范定义下的图形化前端程序像Putty那样东西就可以轻松搞定全部事情咯. --- ### 利用Autossh增强稳定性 考虑到长时间维持稳定可靠的链接可能存在挑战, 推荐采用autossh替代普通的ssh指令下达形式来做同样的工作内容. 它具备自动重连机制以及心跳探测特性等功能优势可以帮助我们更好地应对可能出现的各种异常状况. 命令样例如下所示: ```bash autossh -M 0 -L 443:127.0.0.1:332 root@[ssh_server] -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" ``` 这里设置了每隔三十秒钟发送一次探针信号给远端伙伴告知自己还活着; 如果连续三次都没有收到回应就会触发重新构建关联动作直到恢复正常通讯联系为止.[^3] --- ### Frp作为另一种选择 Frp (Fast Reverse Proxy) 是另一个非常流行且高效的反向代理解决方案之一, 特别适合用来处理复杂的多业务场景下的流量调度问题. 它的架构设计清晰明了易于理解和掌握, 并提供了丰富的参数选项让用户可以根据实际情况灵活调整优化性能表现. ![frp_http_and_ssh](https://example.com/frp-http-and-ssh.png) 以上图片展示了http和ssh两种模式下的基本原理框架图解说明文档资料来源出处标记如下:[^4] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值