SSH反向隧道

SSH反向隧道是一种通过SSH协议将内网服务暴露到公网的技术,尤其适用于内网主机没有公网IP的情况。以下是详细的讲解:

1. 基本概念

  • 反向隧道(Reverse Tunnel):与传统SSH隧道(内网主机作为客户端连接外网)不同,反向隧道由内网主机主动发起连接,将本地端口映射到外网服务器,使外网能够访问内网服务。
  • 核心参数:使用SSH的 -R 选项实现远程端口转发。

2. 工作原理

  1. 内网主机主动连接外网服务器:内网主机通过SSH连接到外网服务器,并建立反向隧道。
  2. 端口绑定:将外网服务器的指定端口转发到内网主机的本地端口。
  3. 数据转发:外部请求访问外网服务器的指定端口时,数据通过SSH隧道转发到内网主机。

3. 命令格式

ssh -R <远程端口>:localhost:<本地端口> <外网用户>@<外网服务器> -Nf
  • 示例:将内网的80端口映射到外网服务器的8080端口:
    ssh -R 8080:localhost:80 user@example.com -Nf
    
  • 参数说明
    • -R:远程端口转发。
    • -N:不执行远程命令。
    • -f:后台运行。

4. 外网服务器配置

  • 修改sshd_config:确保允许远程端口绑定。
    # 在/etc/ssh/sshd_config中添加:
    GatewayPorts yes
    
  • 重启SSH服务
    sudo systemctl restart sshd
    

5. 保持连接稳定

  • Autossh工具:自动重连断开的SSH会话。
    autossh -M 0 -R 8080:localhost:80 user@example.com -Nf
    
  • Cron定时任务:定期检查连接状态。

6. 典型应用场景

  • 访问内网Web服务:将内网Web服务器的80端口映射到外网。
  • 远程SSH到内网主机:映射内网主机的22端口到外网服务器,通过外网SSH接入内网。
    ssh -R 2222:localhost:22 user@example.com
    
    外网用户连接:
    ssh -p 2222 localhost
    

7. 安全注意事项

  • 最小化暴露端口:仅转发必要端口。
  • 使用密钥认证:避免密码泄露,配置SSH密钥对。
  • 防火墙规则:限制外网端口访问的IP范围。

8. 测试与验证

  • 检查端口监听
    netstat -tuln | grep 8080  # 外网服务器执行
    
  • 访问测试
    curl http://example.com:8080  # 应返回内网服务的响应
    

9. 进阶配置

  • 多端口转发:多个 -R 参数或动态转发(-D)。
  • 通过反向隧道建立VPN:结合 sshuttle 等工具实现更全面的网络访问。

10. 与VPN的区别

  • SSH反向隧道:轻量级,适合单个服务或临时访问。
  • VPN:全局网络访问,适合长期或复杂需求。

总结

SSH反向隧道通过内网主机主动建立连接,解决了NAT穿透问题,是临时暴露内网服务的有效方案。正确配置sshd、使用autossh保持连接、严格的安全措施是其稳定运行的关键。


autossh (推荐)

使用 autossh 可以更稳定地维持 SSH 反向隧道(即从内网穿透到公网服务器),尤其适合需要长期保持连接的场景。以下是详细步骤:


1. 安装 autossh

在本地机器(需要穿透的内网机器)上安装 autossh

sudo apt update && sudo apt install autossh  # Ubuntu/Debian
sudo yum install autossh                    # CentOS/RHEL

2. 生成 SSH 密钥对并配置免密登录

确保本地机器可以通过密钥登录到公网服务器(目标跳板机):

ssh-keygen -t ed25519  # 生成密钥对
ssh-copy-id user@remote-server.com  # 将公钥复制到公网服务器

3. 建立反向隧道

使用以下命令创建反向隧道:

autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -N -R 2222:localhost:22 user@remote-server.com
参数解释
  • -M 0: 禁用 autossh 的默认监控端口(适用于新版本)。
  • -o ServerAliveInterval 30: 每 30 秒发送一次心跳包,保持连接。
  • -o ServerAliveCountMax 3: 如果连续 3 次心跳无响应,则断开并重连。
  • -N: 不执行远程命令(仅建立隧道)。
  • -R 2222:localhost:22: 将远程服务器的 2222 端口转发到本地的 22 端口。

4. 验证隧道是否成功

在公网服务器上检查是否监听了 2222 端口:

ss -tuln | grep 2222

输出类似:

LISTEN 0  128  127.0.0.1:2222  0.0.0.0:*

5. 通过反向隧道访问内网服务

从公网服务器通过本地端口访问内网机器的 SSH 服务:

ssh -p 2222 localuser@localhost

其中 localuser 是内网机器的用户名。


6. 配置为后台服务(开机自启)

创建 systemd 服务文件(如 /etc/systemd/system/autossh-tunnel.service):

[Unit]
Description=AutoSSH Reverse Tunnel
After=network.target[Service]
User=your_local_username
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -N -R 2222:localhost:22 user@remote-server.com
Restart=always
RestartSec=10[Install]
WantedBy=multi-user.target

启动并启用服务:

sudo systemctl daemon-reload
sudo systemctl start autossh-tunnel
sudo systemctl enable autossh-tunnel

7. 其他场景示例

转发 HTTP 服务

将内网的 80 端口转发到公网服务器的 8080 端口:

autossh -M 0 -N -R 8080:localhost:80 user@remote-server.com
转发数据库服务

将内网 MySQL(3306 端口)转发到公网服务器:

autossh -M 0 -N -R 3306:localhost:3306 user@remote-server.com

注意事项

  1. 防火墙配置

    • 确保公网服务器允许入站流量访问转发的端口(如 2222)。
    • 内网机器的 SSH 配置需允许端口转发(检查 /etc/ssh/sshd_configAllowTcpForwarding yes)。
  2. 安全性

    • 使用非默认端口(如 2222)降低被扫描的风险。
    • 结合 -L-R 实现双向隧道(如果需要)。
  3. 调试命令

    • 查看 autossh 日志:journalctl -u autossh-tunnel
    • 手动调试时添加 -v 参数:autossh -v ...

通过以上步骤,你可以建立一个稳定的 SSH 反向隧道,并通过公网服务器安全访问内网服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35039.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于VMware的虚拟机集群搭建

本文作者&#xff1a; slience_me 文章目录 基于VMware的虚拟机集群搭建1. 安装Vmware2. 构建虚拟机3. 安装Linux4. 网络配置5. 开始克隆6. 初始化系统6.1 开放root账户6.2 SSH服务6.3 设置静态IP6.4 镜像源 host 主机名 基于VMware的虚拟机集群搭建 该集群采用镜像ubuntu-20.0…

windows平台搭建python环境

python语言 Python 是一种高级、解释型、跨平台的编程语言&#xff0c;由Guido van Rossum于1991年设计&#xff0c;并发展成为全球最受欢迎的编程语言之一。它以简单易读的语法、灵活的特性和丰富的标准库闻名&#xff0c;适合初学者和经验丰富的开发者。 Python 支持多种编…

【系统架构设计师】操作系统 - 文件管理 ② ( 位示图 | 空闲区域 管理 | 位号 | 字号 )

文章目录 一、空闲区域 管理1、空闲区域分配2、空闲区域 管理方式 简介 二、位示图 简介1、位示图 表示2、位示图 字号3、位示图 位号4、位示图 中 比特位 分组管理 三、位示图 考点1、计算磁盘 位示图 的大小2、位示图 位置计算 一、空闲区域 管理 1、空闲区域分配 在 索引文件…

SpringData Redis:RedisTemplate配置与数据操作

文章目录 引言一、Redis概述与环境准备二、RedisTemplate基础配置三、连接属性配置四、操作String类型数据五、操作Hash类型数据六、操作List类型数据七、操作Set类型数据八、操作ZSet类型数据九、事务与管道操作总结 引言 Redis作为高性能的NoSQL数据库&#xff0c;在分布式系…

串口烧录出现频繁回复乱码 频繁回复一个数字且烧录失败 字节混乱

这是因为你的芯片没有处于系统存储区启动一直未进入bootloader 解决办法是检查boot引脚接正确没&#xff0c;要在系统存储器启动

共享经济再中介化进程中的技术创新与模式重构研究——以“开源AI智能名片链动2+1模式S2B2C商城小程序“为例

摘要 本文基于共享经济中介化演进的双重逻辑&#xff0c;通过案例研究与技术解构&#xff0c;探讨"开源AI智能名片链动21分销机制S2B2C商城小程序"集成系统如何重构数字经济时代的价值网络。研究发现&#xff0c;该技术生态通过三维需求匹配、动态价值分配与智能风险…

【linux】虚拟机执行sudo yum isntall perl报错 could not retrieve mirrorlist htt:

项目场景&#xff1a; 提示&#xff1a;虚拟机安装拓展包&#xff0c;sudo yum install perl Virtualbox 在不安装增强功能扩展的情况下, 无法自适应分辨率和共享剪切板等操作 问题描述 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; 出现这个错误是因…

网络编程知识预备阶段

1. OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能&#xff0c;从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时&#xff0c;更好地理解和…

我的Gitee

算法与数据结构: 浙海大小趴菜的一些记录 后续也会更新一些项目&#xff0c;小趴菜以后也会变得很厉害

Collection合集(单列集合)

Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。Collection实际上是一个泛型接口 Collection集合常用API&#xff1a; 代码实现&#xff1a; Collection集合遍历 遍历方式一&#xff1a;迭代器 迭代器是用来遍历集合的专用方式&#…

旅游类小程序界面设计

产品概述 艾啦游是一款互联网旅游类小程序&#xff0c;致力于国内精品旅游&#xff0c;以及拥有自由行、专属热榜单、出行攻略等诸多功能&#xff0c;汇聚了许多国内的人气景点&#xff0c;与诸多城市的酒店也保持合作&#xff0c;打造一体式旅行服务&#xff0c;更有不断上新…

移动端开发基础与常见布局

一、移动端基础 1.浏览器现状 ⑴.PC端常见浏览器 360浏览器、谷歌浏览器、火狐浏览器、QQ浏览 器、百度浏览器、搜狗浏览器、IE浏览器。 ⑵.移动端常见浏览器 UC浏览器&#xff0c;QQ浏览器&#xff0c;欧朋浏览器&#xff0c; 百度手机浏览器&#xff0c;360安全浏览器&am…

[算法] 贪心--矩阵消除游戏

文章目录 1. 题意2. 思路贪心思路1思路1并不正确思路1为什么是错误的?这道题该如何求解?枚举思路是超时的!枚举 贪心 3. 编码 今天咱们来分享一道基础的贪心题目 -> 矩阵消除游戏 对于贪心算法的题目, 我感觉是对于初学者没必要太注重证明过程, 因为这玩意的变数比较大, …

数学——A. K-divisible Sum + D. Exam in MAC

A. K-divisible Sum 题目&#xff1a; 思路&#xff1a; 以下 “[xxx]” 符号均代表向上取整 我们假设总和是sum&#xff0c;那么就有sum k * cnt 要想最大值最小&#xff0c;肯定是要让sum尽可能小&#xff0c;这样每个元素都能变小 最小情况是 sum 恰好等于 n 时&#…

Docker 》》Docker Compose 》》network 网络 compose

docker 默认的网络 三种模式 # 列出所有当前主机上或Swarm集群上的网络 docker network ls#查看网络详情 docker network inspect network名称# 清除未使用的docker网络 docker network prune -f# 创建网络 ocker network create -d bridge 网络名称 docker network create –s…

RabbitMQ延迟消息

文章目录 延迟消息死信交换机延迟消息延迟消息应用场景 延迟消息 生产者在发送消息的时候指定一个时间&#xff0c;消费者不会立即收到该消息&#xff0c;而是在指定时间之后才收到消息&#xff0c;这就是延迟消息。 比如说这么一个场景&#xff0c;用户下单后将商品库存进行…

phpstudy+phpstorm+xdebug【学习笔记】

配置PHPStudy 配置PHPSTORM phpstorm选择PHP版本 配置DEBUG 设置服务器 编辑配置 学习参考链接&#xff1a;&#xff1a;https://blog.csdn.net/m0_60571842/article/details/133246064

58.Harmonyos NEXT 图片预览组件架构设计与实现原理

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; Harmonyos NEXT 图片预览组件架构设计与实现原理 文章目录 Harmonyos NEXT 图片预览组件架构设计与实现原理效果预览一、组件架构概述1. 核心组件层…

Android 手机启动过程

梳理 为了梳理思路&#xff0c;笔者画了一幅关于 Android 手机启动的过程图片内容纯属个人见解&#xff0c;如有错误&#xff0c;欢迎各位指正

Chat-TTS-UI:文字转语音 - 本地部署方案

Chat-TTS-UI 是一个基于 ChatTTS 模型的本地网页界面,专为满足用户在信息过载时代轻松获取大量文字信息的需求而设计。它支持中英文混合输入、多种音色选择,并提供 API 接口,方便开发者集成到其他应用中。其简洁易用的网页界面、细粒度控制以及 GPU 加速等高级功能,使其广泛…