计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
弹性伸缩 AS
镜像服务 IMS
专属主机 DeH
函数工作流 FunctionGraph
云手机服务器 CPH
Huawei Cloud EulerOS
网络
虚拟私有云 VPC
弹性公网IP EIP
虚拟专用网络 VPN
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
VPC终端节点 VPCEP
云连接 CC
企业路由器 ER
企业交换机 ESW
全球加速 GA
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
边缘安全 EdgeSec
威胁检测服务 MTD
CDN与智能边缘
内容分发网络 CDN
CloudPond云服务
智能边缘云 IEC
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
云搜索服务 CSS
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
数据可视化 DLV
数据湖工厂 DLF
湖仓构建 LakeFormation
企业应用
云桌面 Workspace
应用与数据集成平台 ROMA Connect
云解析服务 DNS
专属云
专属计算集群 DCC
IoT物联网
IoT物联网
设备接入 IoTDA
智能边缘平台 IEF
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
国际站常见问题
ICP备案
我的凭证
支持计划
客户运营能力
合作伙伴支持计划
专业服务
区块链
区块链服务 BCS
Web3节点引擎服务 NES
解决方案
SAP
高性能计算 HPC
视频
视频直播 Live
视频点播 VOD
媒体处理 MPC
实时音视频 SparkRTC
数字内容生产线 MetaStudio
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
存储容灾服务 SDRS
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
专属分布式存储服务 DSS
容器
云容器引擎 CCE
容器镜像服务 SWR
应用服务网格 ASM
华为云UCS
云容器实例 CCI
管理与监管
云监控服务 CES
统一身份认证服务 IAM
资源编排服务 RFS
云审计服务 CTS
标签管理服务 TMS
云日志服务 LTS
配置审计 Config
资源访问管理 RAM
消息通知服务 SMN
应用运维管理 AOM
应用性能管理 APM
组织 Organizations
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
应用身份管理服务 OneAccess
数据库
云数据库 RDS
文档数据库服务 DDS
数据管理服务 DAS
数据复制服务 DRS
云数据库 GeminiDB
云数据库 GaussDB
分布式数据库中间件 DDM
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
人脸识别服务 FRS
图引擎服务 GES
图像识别 Image
内容审核 Moderation
文字识别 OCR
AI开发平台ModelArts
图像搜索 ImageSearch
对话机器人服务 CBS
华为HiLens
视频智能分析服务 VIAS
语音交互服务 SIS
应用中间件
分布式缓存服务 DCS
API网关 APIG
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
多活高可用服务 MAS
事件网格 EG
企业协同
华为云会议 Meeting
云通信
消息&短信 MSGSMS
云生态
合作伙伴中心
云商店
开发者工具
SDK开发指南
API签名指南
Terraform
华为云命令行工具服务 KooCLI
其他
产品价格详情
系统权限
管理控制台
客户关联华为云合作伙伴须知
消息中心
公共问题
开发与运维
应用管理与运维平台 ServiceStage
软件开发生产线 CodeArts
需求管理 CodeArts Req
部署 CodeArts Deploy
性能测试 CodeArts PerfTest
编译构建 CodeArts Build
流水线 CodeArts Pipeline
制品仓库 CodeArts Artifact
测试计划 CodeArts TestPlan
代码检查 CodeArts Check
代码托管 CodeArts Repo
云应用引擎 CAE
开天aPaaS
云消息服务 KooMessage
云手机服务 KooPhone
云空间服务 KooDrive

QingTian Enclave网络代理工具

更新时间:2024-12-31 GMT+08:00

QingTian Enclave网络代理工具(qproxy)概述

qproxy(QingTian Enclave proxy)是QingTian Enclave的网络代理工具。借助此工具,您可以无需任何改动,直接将部署在基于QingTian架构虚拟机中的网络业务移植到QingTian Enclave中,实现传统网络业务的无感迁移。

qproxy是一个可执行的二进制文件,需要在父虚拟机和QingTian Enclave中通过不同的命令运行:

  • 在父虚拟机中,通过执行“/path/to/qproxy host --config=/path/to/config_qproxy.toml <cid>”命令启用qproxy。
  • 在QingTian Enclave中,通过执行“/path/to/qproxy enclave --config=/path/to/config_qproxy.toml”命令启用qproxy。

以一个简单的网络服务为例,网络服务直接部署在虚拟机中,负责处理来自最终用户的请求。最终用户通过该服务暴露的端口,发起网络请求,等待服务响应。在将该网络服务迁移至QingTian Enclave之后,通过qproxy代理,可以提供和原本网络服务相同的服务。

使用同一个qproxy二进制文件,通过qlog hostqlog enclave命令,使其分别运行在父虚拟机和QingTian Enclave中,两者会建立基于local vsock的通信链路。父虚拟机中的qproxy组件会监听5050端口,接收用户请求,并通过local vsock将收到的请求转发给QingTian Enclave中的qproxy组件。该组件会将请求发送到QingTian Enclave中监听的5050端口。网络服务处理完成之后,响应数据会原路返回。

图1 网络服务无感迁移至QingTian Enclave

本文介绍qproxy的操作步骤。

前提条件

  1. 获取qproxy源码。

    克隆QingTian Enclave代码仓。

    git clone https://gitee.com/HuaweiCloudDeveloper/huawei-qingtian.git
  2. 获取cargo工具链。
    1. 执行以下命令安装rustup。
      curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    2. 安装完成后执行以下命令加载rustup。
      source $HOME/.cargo/env
    3. 执行以下命令验证rustc和cargo安装成功。
      rustc -V
      cargo -V
  3. qproxy的前置依赖。
    表1 前置依赖

    依赖项

    最低测试版本

    cargo

    1.77.0

    libcbor

    0.10.2

    libssl (libcrypto)

    3.0.0

    libcurl

    4.0.0

  4. QingTian Enclave的环境准备。
    1. 安装qt CLI工具和其他必要rpm包。
    2. 安装Docker。
    3. 安装python3以及几个必要的python module : docker和knack。

    详细内容,请参考快速入门安装qt CLI

操作步骤

  1. 构建qproxy

    生成的qproxy程序在目录qingtian-tools/qproxy/target/release下。

  2. 创建工作目录

    新建工作目录workspace,将qproxy程序拷贝到workspace下,后续创建的文件都放在workspace中。

  1. 配置config_qproxy.toml

    在workspace目录中创建config_qproxy.toml文件,内容如下:

    [[inbound_connections]]
    host_port = 5050 
    enclave_port = 5050 
    vsock_port = 9995  
    
    [[inbound_connections]]
    host_port = 5443 
    enclave_port = 5443 
    vsock_port = 9994  
    
    [log_location]
    host_log = "host.log" # qproxy host log name, e.g./var/log/qproxy/host.log
    enclave_log = "enclave.log" # qproxy enclave log name, e.g./var/log/qproxy/enclave.log
    log_level = "info" # qproxy logger level, e.g. "off", "info", "warn", "error", "debug", "trace"
    host_log_dir = "/var/log/qproxy" # qproxy host log dir, and its default value is "/var/log/qproxy"
    enclave_log_dir = "/var/log/qproxy" # qproxy enclave log dir, and its default value is "/var/log/qproxy"

  2. 制作含qproxy的QingTian Enclave镜像

    1. 在workspace目录中创建http请求测试脚本app.sh:
      #!/bin/bash 
      
      PORT=5050 
      
      while true; do    
           echo -e "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHello world!" | nc -l 127.0.0.1  $PORT
      done
    2. 赋予app.sh执行权限,在workspace目录中执行以下命令:
      chmod +x app.sh
    3. 在workspace目录中创建start.sh脚本:
      #!/bin/bash
      ip link set lo up 
      /root/qproxy enclave --config=/root/config_qproxy.toml &
      /root/app.sh
    4. 赋予start.sh执行权限,在workspace目录中执行以下命令:
      chmod +x start.sh
    5. 在workspace目录中创建Dockerfile文件:
      FROM ubuntu:latest 
      COPY ./qproxy /root/qproxy 
      COPY ./config_qproxy.toml /root/config_qproxy.toml 
      COPY ./start.sh /root/start.sh 
      COPY ./app.sh /root/app.sh 
      RUN apt-get update && \    
          apt-get install -y netcat-openbsd && \    
          apt-get install -y iproute2 
      CMD "/root/start.sh"
    6. 制作docker镜像,在workspace目录中运行以下命令:
      docker build -f Dockerfile -t test_qproxy_enclave .
    7. 制作QingTian Enclave镜像,在workspace目录中运行以下命令:
      qt enclave make-img --docker-uri test_qproxy_enclave --eif test_qproxy_enclave.eif

  3. 启动qproxy

    1. 启动一台QingTian Enclave,在workspace目录中运行以下命令:
      qt enclave start --cpus 2 --mem 1024 --cid 4 --eif test_qproxy_enclave.eif
    2. 启动父虚拟机中的qproxy,在workspace目录中运行以下命令:
      ./qproxy host --config=./config_qproxy.toml 4 &
    3. 父虚拟机中执行curl命令:
      curl localhost:5050

      可以看到终端输出"Hello world!"。

  4. qproxy环境变量设置

    qproxy包含两部分子命令,一部分在QingTian Enclave(qproxy enclave)中运行,另一部分在父虚拟机(qproxy host)中运行。

    通过设置环境变量RUST_LOG可以控制二进制文件的日志输出信息等级。

    • 设置RUST_LOG=OFF,日志信息会全部关闭不显示。
    • 设置RUST_LOG=info,日志信息会显示info,warn和error三个级别的信息。
    • 默认情况下,只会显示warn和error两个级别的日志信息。
    • 可以通过查看EnvFilter文档获取更多信息。

qproxy帮助信息

qproxy help

$ qproxy --help
Usage: qproxy <COMMAND> 

Commands:   
   host          The part of qproxy that runs outside the enclave   
   enclave       The part of qproxy that runs inside the enclave   
   check-config  Check the qproxy configuration file  
   help          Print this message or the help of the given subcommand(s) 

Options:   
   -h, --help     Print help  
   -V, --version  Print version

qproxy enclave help

$ qproxy enclave --help
The part of qproxy that runs inside the enclave  

Usage: qproxy enclave [OPTIONS] 

Options:       
      --parent-cid <PARENT_CID>          
          The CID of the parent VM of this enclave                      

          [env: QPROXY_PARENT_CID=]          
          [default: 3]       

      --config <CONFIG>          
           Path to the configuration file   

  -t, --threads <THREADS>          
           Number of threads the async runtime is allowed to use                      

           [env: TOKIO_WORKER_THREADS=]       

       --control-port <CONTROL_PORT>          
            The port where to listen for control messages from the enclave                      

            Leave at default value unless you know what you are doing                      

            [env: QPROXY_CONTROL_PORT=]          
            [default: 6666]          
            [0..=65535]   

  -h, --help          
            Print help (see a summary with '-h')

qproxy host help

$ qproxy host --help
The part of qproxy that runs outside the enclave  

Usage: qproxy host [OPTIONS] <CID> 

Arguments:   
  <CID>          
           The CID of the enclave                      

           [env: QPROXY_LISTEN_CID=] 

Options:       
        --config <CONFIG>          
             Path to the configuration file   

  -t, --threads <THREADS>          
             Number of threads the async runtime is allowed to use                      

             [env: TOKIO_WORKER_THREADS=]       

      --ipv4          
          Only resolve IPv4 addresses        

      --ipv6          
          Only resolve IPv6 addresses        

      --control-port <CONTROL_PORT>          
          The port where to listen for control messages from the enclave                      

          Leave at default value unless you know what you are doing                      

          [env: QPROXY_CONTROL_PORT=]          
          [default: 6666]          
          [0..=65535]   

  -h, --help          
          Print help (see a summary with '-h')

配置信息(Config)

配置参数解释

  • outbound_connections:配置转发QingTian Enclave外发流量到外部特定服务(hostname/IP)及其端口。
  • inbound_connections:配置转发父虚拟机指定端口收到的流量到QingTian Enclave中。
表2 配置参数解释

Bound

Variable

Type

Description

outbound_connections

hostname

String

用于转发流量的主机名(hostname),可以是IP地址,例如:hostname = "api.myservice.com"。

vsock_port

u32

QingTian Enclave内vsock要使用的端口,必须唯一,并且不能和qproxy端口冲突。

tcp_port

u32

服务器转发流量的端口(将连接到hostname:port),不能和qproxy端口冲突(默认是8080)。

inbound_connections

host_port

u32

主机端(host)qproxy将会监听的端口,如host_port = 80,主机端qproxy将会监听0.0.0.0:80。

enclave_port

u32

QingTian Enclave端qproxy将会监听的端口,如enclave_port = 80,QingTian Enclave端qproxy将会监听127.0.0.1:80。

vsock_port

u32

QingTian Enclave内vsock要使用的端口,必须唯一,并且不能和qproxy端口冲突。

日志文件配置

表3 日志文件配置

Variable

Type

Description

host_log

String

qproxy在主机端(host)日志文件名称, 例如:host_log = "host.log"表示主机端(host)qproxy日志文件名为host.log。

enclave_log

String

qproxy在QingTian Enclave端日志文件名称,例如:enclave_log = "enclave.log"表示QingTian Enclave中qproxy日志文件名为enclave.log。

log_level

String

qproxy日志级别, 例如:log_level = "info"表示显示信息,警告和错误。全部级别有 "off", "info", "warn", "error", "debug", "trace"。

host_log_dir

String

qproxy在主机端(host)日志目录,默认是 "/var/log/qproxy"

enclave_log_dir

String

qproxy在QingTian Enclave端日志目录,默认是 "/var/log/qproxy"

配置文件参考

[[outbound_connections]]
hostname = "api.myservice.com" 
vsock_port = 7777 
tcp_port = 443  

[[outbound_connections]]
hostname = "another.api.com" 
vsock_port = 7778 
tcp_port = 5555  

[[inbound_connections]]
host_port = 80  
enclave_port = 80  
vsock_port = 9000   

[[inbound_connections]]
host_port = 443 
enclave_port = 443 
vsock_port = 9001  

[log_location]
host_log = "host.log"  
enclave_log = "enclave.log"  
log_level = "info"  
host_log_dir = "/var/log/qproxy"  
enclave_log_dir = "/var/log/qproxy"

我们使用cookie来确保您的高速浏览体验。继续浏览本站,即表示您同意我们使用cookie。 详情

文档反馈

文档反馈

意见反馈

0/500

标记内容

同时提交标记内容