Linux-SSH反向连接(内网穿透,打洞)

本文介绍了如何在外网访问内网的两种方法,特别是通过SSH反向连接的方式。详细步骤包括内网主机如何连接外网服务器以建立端口映射,并使用`autossh`来保持连接的稳定。此外,还提供了在Ubuntu系统下设置`autossh`开机自动启动的方法,确保服务的可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


场景


对于外网来说,公司内部的是内网,中间隔了个防火墙,如果想从外网去访问公司内部网络,正常情况下是不可行的,也无法做到端口转发(除非在公司防火墙上打个洞),一般场景有外网访问公司内网,外网访问学校的内网。

理论


外网无法访问到内网,归根结底就是因为内网对于外网不可见,一般要实现外网访问到内网,有两种方法:一种是端口映射,就相当于将内网主机的某个端口在防火墙上开放出来,这样一来就相当于是两台外网主机的通信了;另一种就是SSH反向连接,就是内网是可以访问到外网的,那么内网主机先主动连接外网主机,这样一来就建立了连接,然后外网主机就可以ssh登录到内网主机了,这就是所谓的反向连接。但是这种连接是不稳定的,可能会断掉,但也有方法解决。

操作


  1. 首先做以下假设,A要连接B
    A-外网服务器172.16.32.11 ssh端口为88
    B-内网主机192.168.137.110 ssh端口为22
  2. B先主动连接A
    ssh -NfR 1234:localhost:22 user1@172.16.32.11 -p 88
    -f 后台执行ssh指令
    -N 不执行远程指令
    -R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
    -p 指定远程主机的端口
    1234是远程主机A的端口,就是外网服务器A的1234端口与内网B的22端口绑定,相当于是端口映射。
  3. 查看服务器A的1234端口
    执行完步骤2后,这时候可以在远程服务器A上查看端口1234
    ss -ant |grep 1234
    输出为:
    LISTEN 0 128 127.0.0.1:1234 *:*
    这是1234端口已经和22端口绑定了,A上监听着
  4. 在远程服务器A上ssh登录内网主机B
    ssh username@localhost -p 1234
    记得要指定端口为1234,这样子就能访问到内网了,实现了ssh反向连接。

解决断开连接


前面说过这种反向连接不稳定,可能随时会断开,这时候又得重复上面步骤去打通,而当你无法登陆上内网主机去操作以上的步骤时候,那就没法玩了。
这时可以使用autossh来解决这个随时断开的问题。
具体指令为:
autossh -M 2000 -NfR 1234:localhost:22 user1@172.16.32.11 -p 88
解释:

  1. autossh和ssh在指令上的区别就是多了一个-M参数,这个参数指定一个端口,这个端口是外网的A用来接收内网主机B的信息,如果隧道不正常则返回给内网主机B让他实现重新连接
  2. 简单来说就是多指定了一个端口,用于监听ssh反向连接是否断开。

开机自动启动autossh


ubuntu下设置autossh开机自动启动

  1. 编写service文件
    vi /lib/systemd/system/autossh.service
    写入以下内容
[Unit]
Description=Robust SSH Reverse Tunnel and Port Forward
After=network.target
[Service]
User=ubuntu
ExecStart=/usr/bin/autossh -M 2000 -fNR 1234:localhost:22 -i /home/ubuntu/.ssh/id_rsa  172.16.32.11
KillMode=process
[Install]
WantedBy=multi-user.target
Alias=autossh.service

然后执行

sudo systemctl daemon-reload
sudo systemctl start autossh.service
sudo systemctl enable autossh.service

注意:

ssh的配置文件中要把GatewayPorts修改为yes

### 什么是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] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值