Unreal:如何在UE中实现SSH隧道,安全访问远程服务

news/2025/10/25 16:06:26/文章来源:https://www.cnblogs.com/mengzhishanghun/p/19165541

前言

在UE项目开发中,经常需要访问远程服务器上的数据库、API或内网服务。直接暴露这些服务到公网存在安全风险,而SSH隧道(SSH Tunnel)提供了一种安全的解决方案:通过SSH加密通道转发本地端口到远程服务,既保证了数据传输的安全性,又避免了服务直接暴露。

本文将介绍SSH隧道的工作原理,以及如何在UE中实现这一功能。


SSH隧道的实现方式

调用系统SSH客户端

我们先来实现最简单的方式,那就是借助系统自带的SSH客户端:

Windows (使用OpenSSH客户端):

#include "GenericPlatform/GenericPlatformProcess.h"void CreateSSHTunnelByCommand(const FString& SSHHost,int32 SSHPort,const FString& Username,const FString& Password,int32 LocalPort,const FString& RemoteHost,int32 RemotePort)
{// 构建SSH命令// ssh -L LocalPort:RemoteHost:RemotePort Username@SSHHost -p SSHPortFString Command = FString::Printf(TEXT("ssh -L %d:%s:%d %s@%s -p %d -N"),LocalPort, *RemoteHost, RemotePort,*Username, *SSHHost, SSHPort);// 使用UE的进程管理启动SSHFProcHandle ProcHandle = FPlatformProcess::CreateProc(TEXT("C:/Windows/System32/OpenSSH/ssh.exe"),*Command,true,   // bLaunchDetachedfalse,  // bLaunchHiddenfalse,  // bLaunchReallyHiddennullptr,0,nullptr,nullptr);// 保存进程句柄用于后续关闭if (ProcHandle.IsValid()){UE_LOG(LogTemp, Log, TEXT("SSH隧道已启动"));}
}// 关闭SSH隧道
void CloseSSHTunnel(FProcHandle& ProcHandle)
{if (ProcHandle.IsValid()){FPlatformProcess::TerminateProc(ProcHandle);FPlatformProcess::CloseProc(ProcHandle);}
}

这种方式的优缺点:

优点:

  • 实现简单,几行代码就能完成
  • 无需集成第三方库
  • 利用系统自带SSH客户端

缺点:

  • 依赖系统环境(需要预装SSH客户端)
  • 无法在代码中输入密码(需要配置密钥或手动输入)
  • 进程管理复杂,难以获取连接状态
  • 跨平台兼容性差(Windows/Linux/Mac路径不同)
  • 无法获取详细的错误信息
  • 不适合打包发布(用户环境不可控)

集成SSH库

更可靠的方式是集成专业的SSH库。

这里选用开源的libssh2+OpenSSL的组合,需要两个关键库:

libssh2 — SSH协议实现

  • 负责SSH连接建立
  • 用户认证(密码/密钥)
  • 端口转发功能
  • 🔗 开源地址: https://github.com/libssh2/libssh2
  • 📄 许可证: BSD 3-Clause

OpenSSL — 加密支持

  • 提供底层加密算法
  • 密钥交换
  • 数据加密/解密
  • 🔗 开源地址: https://github.com/openssl/openssl
  • 📄 许可证: Apache 2.0

如何使用这两个库

集成libssh2到UE项目的基本步骤:

1. 编译库文件

首先需要为目标平台编译libssh2和OpenSSL的静态库:

# Windows平台需要编译出
libssh2.lib / libssh2.dll
libcrypto.lib / libcrypto.dll
libssl.lib / libssl.dll

2. 在.Build.cs中添加依赖

// 添加头文件路径
PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "libssh2", "include"));
PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "openssl", "include"));// 链接静态库
PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "libssh2", "lib", "libssh2.lib"));
PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "openssl", "lib", "libcrypto.lib"));
PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "openssl", "lib", "libssl.lib"));// 运行时需要的DLL
RuntimeDependencies.Add("$(BinaryOutputDir)/libssh2.dll", Path.Combine(ThirdPartyPath, "libssh2", "bin", "libssh2.dll"));

3. 基本的libssh2使用流程

#include "libssh2.h"// 初始化libssh2
libssh2_init(0);// 创建会话
LIBSSH2_SESSION* session = libssh2_session_init();// 连接到SSH服务器(基于已有的Socket)
libssh2_session_handshake(session, socket);// 用户认证
libssh2_userauth_password(session, username, password);// 创建端口转发通道
LIBSSH2_CHANNEL* channel = libssh2_channel_direct_tcpip(session,remote_host,  // 远程目标地址remote_port   // 远程目标端口
);// 后续进行数据转发...// 清理资源
libssh2_channel_free(channel);
libssh2_session_disconnect(session, "Normal Shutdown");
libssh2_session_free(session);
libssh2_exit();

关键点:

  • libssh2需要配合Socket使用,UE中可以用FSocket
  • 端口转发需要在本地开启监听Socket接受连接
  • 数据转发需要在独立线程中循环处理,避免阻塞主线程
  • 所有libssh2操作都需要正确的错误处理和资源释放

两种方式对比

特性 调用系统SSH 集成SSH库
实现难度 简单 复杂
环境依赖 需要系统SSH客户端 无依赖
密码认证 不支持(需手动输入) 完全支持
状态监控 困难 完整支持
错误处理 无法获取详情 详细错误信息
跨平台 路径不一致 统一接口
打包发布 不可靠 可靠
适用场景 开发测试 生产环境

结论:

  • 如果只是临时测试,调用系统SSH是最快的方式
  • 如果要做成产品级功能,集成SSH库是唯一选择

一键解决方案

如果你需要开箱即用的SSH隧道功能,可以使用我开发的插件:

SimpleSSHTunnel — SSH隧道完整方案

  • 基于libssh2 + OpenSSL实现
  • 完整蓝图接口
  • 支持UE 5.2-5.5
  • 仅支持Windows平台(Linux/Mac可按需定制)

获取方式:
Epic Fab商城搜索 SimpleSSHTunnelmengzhishanghun


致谢与开源库

本技术方案基于以下优秀的开源项目:

libssh2 — 成熟的SSH2协议客户端库

  • 📦 项目地址: https://github.com/libssh2/libssh2
  • 📄 许可证: BSD 3-Clause License
  • 💡 功能: SSH连接、用户认证、端口转发
  • 🙏 感谢libssh2团队提供如此优秀的SSH实现

OpenSSL — 行业标准的加密库

  • 📦 项目地址: https://github.com/openssl/openssl
  • 📄 许可证: Apache 2.0 License
  • 💡 功能: SSL/TLS协议、加密算法
  • 🙏 感谢OpenSSL项目为网络安全做出的贡献

使用这些库时请遵守相应的开源协议,并在项目中注明来源。


如果在使用中遇到问题,或需要定制功能(如密钥认证、Linux平台支持等),欢迎通过邮箱联系我。

📧 技术交流: mengzhishanghun@outlook.com


本文技术方案已在实际项目中验证,适用于开发/测试环境。生产环境请根据实际安全需求调整。

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

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

相关文章

2025年货运车报警器实力厂家权威推荐榜单:环卫车报警器/电动汽车报警器(EVAS)/CAN通讯报警器源头厂家精选

随着商用车安全法规的加严和物流行业效率要求的提升,货运车报警器已从简单的警示装置升级为智能安全系统的重要组成部分。 在货运车安全领域,各种专业报警器正发挥着不可替代的作用。环卫车盲区报警器通过雷达或摄像…

2025 年建筑钢结构厂家最新推荐榜:聚焦不锈钢 / 网架 / 钢梁领域,权威精选,赋能建筑工地与厂房顶梁工程精准选型

引言 随着建筑钢结构行业步入高质量发展阶段,市场对优质品牌的需求愈发迫切。据中国建筑金属结构协会 2025 年度行业测评数据显示,当前钢结构市场合规品牌仅占总量的 68%,超三成企业存在资质不全、技术不达标等问题…

一个功能强大的控件,用于展示和编辑富文本内容,支持格式化文本(如粗体、斜体、颜色)、嵌入图像、超链接等就是在 WPF 中,`RichTextBox`

一个功能强大的控件,用于展示和编辑富文本内容,支持格式化文本(如粗体、斜体、颜色)、嵌入图像、超链接等就是在 WPF 中,`RichTextBox`2025-10-25 16:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-spac…

2025 年最新推荐煎饼机优质厂家榜单:涵盖全自动 / 半自动 / 仿手工 / 导热油等多类型,附中国食品机械协会测评权威结果

引言 当前煎饼机采购市场面临诸多选择难题,为帮助采购者精准筛选优质产品,中国食品机械协会联合行业专家开展 2025 年度煎饼机厂家测评工作。测评采用 “四维评估体系”,从技术实力、产品适配性、售后服务、市场口碑…

Day4表格的基本使用与表格结构标签(后者了解即可)

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

102302156 李子贤 数据采集第一次作业

作业1 用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。 (1)代码和运行结果点击查看代码 import urllib.request from…

梦熊CSPS模拟草稿

#include<bits/stdc++.h> using namespace std; #define int long long struct q{int x,xx,y,yy;int v; }s[100];void init(){s[1].v=1;s[2].v=1;for(int i=3;i<=90;i++){s[i].v=s[i-1].v+s[i-2].v;}s[1].x=-…

Unreal:遍历Actor所有属性进入Sequence记录

void AMyDrivingReplayActor::AddInterp(const UStruct* ObjectClass) {for (TFieldIterator<FProperty> It(ObjectClass); It; ++It){It->SetPropertyFlags(CPF_Interp);if (const FStructProperty* AsStruc…

docker 进入容器:

docker 进入容器:[root@localhost ~]# [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e40e729d2da2 centos:7 "/bin/bash" …

密码和验证码防止暴力破解 - 详解

密码和验证码防止暴力破解 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

2025 年商用直饮机租赁公司最新推荐排行榜:精选优质企业助力健康饮水,聚焦实力品牌广州/上海/南京/北京/济南/杭州直饮机租赁公司推荐

引言 当前商用净饮水市场需求持续攀升,各类企事业单位、公共场所对健康饮水的重视程度日益提高,但市场乱象却让不少需求方陷入选择困境。众多直饮机品牌混杂,部分品牌技术滞后导致净化效果不达标,难以适配不同场景…

2025年香油石磨机直销厂家权威推荐榜单:全自动香油石磨/电动香油石磨/香油石磨设备源头厂家精选

在追求健康饮食与传统风味回归的今天,香油石磨机以其低速低温的研磨特性,正成为保留食材天然营养与醇香的关键设备。 香油石磨机市场近年来保持稳定增长,其中全自动和电动型号的需求提升尤为明显,年增长率预计在10…

Paper: SALT: Step-level Advantage Assignment for Long-horizon Agents via Trajectory Graph

中文标题:SALT:通过轨迹图为长程智能体进行步级优势分配 作者机构:Jiazheng Li, et al. University of Connecticut, Amazon 论文地址:https://arxiv.org/pdf/2510.20022v1 论文贡献: 1)提出SALT,一个用于长程智…

Unreal:自定义配置DeveloperSettings

创建创建一个继承自UDeveloperSettings的类 类属性中Config=Game意思是在Game.ini中配置,加上DefaultConfig,就是DefaultGame.ini config=后面跟的就是配置文件名 所以这里是在DefaultVehicle.ini中配置 ini配置格式…

Unreal:无缝地图切换

原理 无缝地图切换有别于传统的流送地图,流送地图是在一个地图中放置子关卡,通过控制子关卡的加载和卸载来切换不同的地图 而无缝地图切换,是在切换地图的时候,先切换到一个简单的地图中,在后台加载地图,加载完成…

详细介绍:ACA云原生工程师认证知识点脑图

详细介绍:ACA云原生工程师认证知识点脑图2025-10-25 15:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

布尔函数/密码函数

布尔函数的表示方法、重要指标,walsh变换与蝴蝶变换布尔函数 定义 \(n \in N\) 由\(F_2^n\)到\(F_2\)函数称为n元布尔函数 n元布尔函数有\(2^{2^n}\)个,构成环 记全体集合为\(B_n\) 表示方法 真值表 \((x_1⋯x_n) \i…

深入解析:微服务架构:从单机到分布式的革命性升级

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Unreal:PixelStreaming 像素流送

什么是像素流送 UE5.4像素流送 怎么使用 启用插件开启PixelStreaming插件即可 添加启动参数-AudioMixer -PixelStreamingIP=127.0.0.1 -PixelStreamingPort=8888 -PixelStreamingEncoderCodec=VP9通过编辑器设置编辑器…

CRMEB后台密码忘记了怎么办

1. 终端输入命令 php -r "echo password_hash(123456, PASSWORD_BCRYPT), PHP_EOL;" 得到的密码 修改到数据表 eb_system_admin密码pdw字段中