华为USG系列防火墙 RESTCONF NAT配置 Python实现

目录

前言

文档下载 

开启RESTCONF接口

Python 实现SNAT增删改查

查看nat映射列表

查看私网地址池

查看源地址池(公网)

查看nat映射规则

创建nat映射规则

创建私网地址池

创建源地址池

创建nat映射规则

修改NAT映射规则

删除NAT映射规则

补充


前言

一般的NAT规则要在Web界面或console控制台配置,都是手动的操作,想实现自动化或接入业务,可通过华为提供的RESTCONF接口实现。本文章适合有NAT基础的人群观看,主要讲解SNAT的自动化接口配置,补充部分也有一些NAT技术的资料参考。

文档下载 

先找到对应型号的RESTCONF文档,下面是官方链接。

华为 USG12000, USG9500, USG6000F, USG6000F-S, USG6000E, USG6000E-S, USG6000系列防火墙 | 配置手册、产品文档、PDF - 华为

开启RESTCONF接口

登录Web界面进行配置

Python 实现SNAT增删改查

创建一条NAT规则,需要配置源转换地址池(公网段),创建私网地址池(内网段),创建nat映射规则。代码上没有太多可讲的,注意参数的配置即可。特别删改操作,建议做鉴权功能,防止滥用,下面直接贴代码。

查看nat映射列表

代码只贴一份,替换下url即可,注意请求方式为GET

import ssl  
import requests  
from requests.adapters import HTTPAdapter, PoolManager  
from requests.auth import HTTPBasicAuth  
from urllib3.exceptions import InsecureRequestWarning  
from urllib3 import disable_warnings  

HOST = "xxx" #填自己的ip
USER = "xxx" 
PASSWD = "xxx"
vsys = "public"
name = "xxxx"

class MyAdapter(HTTPAdapter):  
    def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):  
        self.poolmanager = PoolManager(num_pools=connections,  
                                       maxsize=maxsize,  
                                       block=block,  
                                       ssl_version=ssl.PROTOCOL_TLSv1_2)


url = f'https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys},{name}'  #查看私网地址
url = f'https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group={name},{vsys}'  #查看源地址池
url = f'https://{HOST}/restconf/data/huawei-nat-policy:nat-policy/vsys={vsys}/rule={rule}'  #查看nat映射规则


header = {  
    'Host': HOST,  
    'Accept': '*/*',
}  

disable_warnings(InsecureRequestWarning) 

basic = HTTPBasicAuth(USER, PASSWD)  
s = requests.Session()  
s.mount('https://', MyAdapter())  

r = s.get(url=url, headers=header, auth=basic, verify=False)  

print(r.request.headers)  
print(r.status_code)  
print(r.text)  
s.close()

三个查看点:

  1. 查看私网地址池
  2. 查看源地址
  3. 查看nat映射规则

查看私网地址池

  • 查看全部:GET  https://{HOST}/restconf/data/huawei-address-set:address-set
  • 查看具体:https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys},{name}GET 查看具体:https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys},{name}

一个地址组的格式形如下,<vsys>表示地址组名,<name>地址名,<elements>元素集,<elem-id>元素id,<address-ipv4>元素地址

<address-set>

<addr-object>

<vsys>public</vsys>

<name>xxx</name>

<elements>

<elem-id>0</elem-id>

<address-ipv4>10.10.10.1/24</address-ipv4>

</elements>

<elements><elem-id>1</elem-id>

<address-ipv4>10.10.10.2/24</address-ipv4>

</elements>

</addr-object>

</address-set>

查看源地址池(公网)

url

  • 查看全部 GET https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group
  • 查看某个 GET https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group={name},{vsys}

一个地址组的格式形如下,

<vsys>表示地址组名,<name>地址名,

<mode>表示地址类型(如全锥型、对称型、端口受限锥形、地址受限锥形),

<address-zone>地址区域(默认全局),

<no-reverse>配置不带no-reverse参数的nat server后,当公网用户访问服务器时,设备能将服务器的公网地址转换成私网地址;同时,当服务器主动访问公网时,设备也能将服务器的私网地址转换成公网地址配置参数no-reverse后,设备只将公网地址转换成私网地址,不能将私网地址转换成公网地址。当内部服务器主动访问外部网络时需要执行outbound的nat策略

<elements>元素集,<id>元素id,

<start-ip>起始地址,<end-ip>结束地址(注意可以是多个或一个,如开始210.50.46.123,结束210.50.46.123,则只有一个地址,否则可以连续,如210.50.46.123,210.50.46.250,地址从x.123-x.250

<nat-address-group>
<name>nat_ippool</name>
<vsys>public</vsys>
<mode>full-cone</mode>
<mode-pattern>
<address-zone>global</address-zone>
<no-reverse>false</no-reverse>
</mode-pattern>
<section>
<id>0</id>
<start-ip>210.50.46.123</start-ip>
<end-ip>210.50.46.125</end-ip>
</section>
</nat-address-group>

查看nat映射规则

url

  • 查看所有 GET https://{HOST}/restconf/data/huawei-nat-policy:nat-policy
  • 查看单个 GET  https://{HOST}/restconf/data/huawei-nat-policy:nat-policy/vsys={vsys}/rule={rule}

<vsys><name> 表示地址组名,<name>地址名

<rule><name>规则名

<source-zone> 源地址区域 trust(信任区,一般为内网地址或端口) untrust(不守信区,一般为外网地址或端口)

<address-set> 对应私网地址池的<name>名

<enable> 是否打开 

<nat-address-group> 对应源地址池的<name>

<vsys>

<name>public</name>

<rule>

<name>xxx</name>

<source-zone>trust</source-zone>

<destination-zone>untrust</destination-zone>

<source-ip>

<address-set>10.10.10.1/24</address-set>

</source-ip>

<enable>true</enable>

<action>nat-address-group</action>

<nat-address-group>210.50.46.123</nat-address-group>

<nat-type>nat</nat-type>

</rule>

</vsys>

创建nat映射规则

注意:HTTP方法可以是POST、PUT或者PATCH,依次对应NETCONF协议中的create动作、replace动作和merge动作。如果是PUT方法,服务端如果已存在对应配置则会被直接覆盖为此次下发的内容。

建议不要使用PUT方法,可能会替换为目前已有规则,如果是POST,则会报重名的错误,避免了替换规则。

注:以下案例中得body内没有<name>,地址池或规则名称都嵌到URL请求链接中了

创建私网地址池

POST https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys},{name}

url请求中申明了地址池name,所以body中就无需添加了,基本格式如下,希望添加得地址放到<elem>中即可(默认id从0起)

<addr-object>
<elements>
<elem-id>0</elem-id>
<address-ipv4>10.10.10.1/24</address-ipv4>
</elements>
<elements>
<elem-id>1</elem-id>
<address-ipv4>10.10.10.2/24</address-ipv4>
</elements>
<elements>
</addr-object>

import ssl  
import requests  
from requests.adapters import HTTPAdapter, PoolManager  
from requests.auth import HTTPBasicAuth  
from urllib3.exceptions import InsecureRequestWarning  
from urllib3 import disable_warnings  

HOST = "xxx"
USER = "xxx" 
PASSWD = "xxx"
vsys = "xxx"
name = "xxx"


class MyAdapter(HTTPAdapter):  
    def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):  
        self.poolmanager = PoolManager(num_pools=connections,  
                                       maxsize=maxsize,  
                                       block=block,  
                                       ssl_version=ssl.PROTOCOL_TLSv1_2)


url = f'https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys },{name }'
header = {  
    'Host': HOST,  
    'Accept': '*/*',
}  

body = """
<addr-object>
<elements>
<elem-id>0</elem-id>
<address-ipv4>10.10.10.1/24</address-ipv4>
</elements>
<elements>
<elem-id>1</elem-id>
<address-ipv4>10.10.10.2/24</address-ipv4>
</elements>
<elements>
</addr-object>
"""

disable_warnings(InsecureRequestWarning) 

basic = HTTPBasicAuth(USER, PASSWD)  
s = requests.Session()  
s.mount('https://', MyAdapter())  

r = s.post(url=url, headers=header, data=body, auth=basic, verify=False)  

print(r.request.headers)  
print(r.status_code)  
print(r.text)  
s.close()

调用成功返回201

创建源地址池

POST https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group={name},{vsys}}

一下默认开放了全部端口,地址范围是 210.50.46.123 -210.50.46.125 ,nat类型是全锥(三元组)

<nat-address-group>
<mode>full-cone</mode>
<mode-pattern>
<address-zone>global</address-zone>
<no-reverse>false</no-reverse>
</mode-pattern>
<section>
<id>0</id>
<start-ip>210.50.46.123</start-ip>
<end-ip>210.50.46.125</end-ip>
</section>
</nat-address-group>

import ssl  
import requests  
from requests.adapters import HTTPAdapter, PoolManager  
from requests.auth import HTTPBasicAuth  
from urllib3.exceptions import InsecureRequestWarning  
from urllib3 import disable_warnings  

HOST = "xxx"
USER = "xxx" 
PASSWD = "xxx"
vsys = "xxx"
name = "xxx"

class MyAdapter(HTTPAdapter):  
    def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):  
        self.poolmanager = PoolManager(num_pools=connections,  
                                       maxsize=maxsize,  
                                       block=block,  
                                       ssl_version=ssl.PROTOCOL_TLSv1_2)


url = f'https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group={name},{vsys}'
header = {  
    'Host': HOST,  
    'Accept': '*/*',
}  

body = """
<nat-address-group>
<mode>full-cone</mode>
<mode-pattern>
<address-zone>global</address-zone>
<no-reverse>false</no-reverse>
</mode-pattern>
<section>
<id>0</id>
<start-ip>210.50.46.123</start-ip>
<end-ip>210.50.46.125</end-ip>
</section>
</nat-address-group>
"""

disable_warnings(InsecureRequestWarning) 

basic = HTTPBasicAuth(USER, PASSWD)  
s = requests.Session()  
s.mount('https://', MyAdapter())  

r = s.post(url=url, headers=header, data=body, auth=basic, verify=False)  

print(r.request.headers)  
print(r.status_code)  
print(r.text)  
s.close()

创建nat映射规则

POST https://{HOST}/restconf/data/huawei-nat-policy:nat-policy/vsys={vsys}/rule={name}

<address-set></address-set> 写私有地址池得<name>

<nat-address-group></nat-address-group>  写源地址池(公网)得<name>

<rule>
<source-zone>trust</source-zone>
<destination-zone>untrust</destination-zone>
<source-ip>
<address-set>private_add</address-set>
</source-ip>
<enable>true</enable>
<action>nat-address-group</action>
<nat-address-group>public_add</nat-address-group>
<nat-type>nat</nat-type>
</rule>

import ssl  
import requests  
from requests.adapters import HTTPAdapter, PoolManager  
from requests.auth import HTTPBasicAuth  
from urllib3.exceptions import InsecureRequestWarning  
from urllib3 import disable_warnings  

HOST = "xxx"
USER = "xxx" 
PASSWD = "xxx"
vsys = "xxx"
name = "xxx"

class MyAdapter(HTTPAdapter):  
    def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):  
        self.poolmanager = PoolManager(num_pools=connections,  
                                       maxsize=maxsize,  
                                       block=block,  
                                       ssl_version=ssl.PROTOCOL_TLSv1_2)


url = f'https://{HOST}/restconf/data/huawei-nat-policy:nat-policy/vsys={vsys}/rule={name}'
header = {  
    'Host': HOST,  
    'Accept': '*/*',
}  

body = """
<rule>
<source-zone>trust</source-zone>
<destination-zone>untrust</destination-zone>
<source-ip>
<address-set>fortest</address-set>
</source-ip>
<enable>true</enable>
<action>nat-address-group</action>
<nat-address-group>justfortest</nat-address-group>
<nat-type>nat</nat-type>
</rule>
"""

disable_warnings(InsecureRequestWarning) 

basic = HTTPBasicAuth(USER, PASSWD)  
s = requests.Session()  
s.mount('https://', MyAdapter())  

r = s.post(url=url, headers=header, data=body, auth=basic, verify=False)  

print(r.request.headers)  
print(r.status_code)  
print(r.text)  
s.close()

修改NAT映射规则

修改(如在原地址池得基础上加一个地址段),大致思路就是获取老的结构体,加入新得ip段并构造一个新的结构体,再使用PUT请求替换。华为原文档提供得方法是使用PUT请求覆盖,但覆盖前先得获取原本结构得信息,不建议用原文档得方式。

修改一条NAT规则,主要就是对私网地址池做修改,或对源地址池(公网)做修改,比如增加或删除一个地址段,参考代码如下(增加一个ip段)

代码流程思路:

  1. 获取对应名<name>得xml结构体
  2. 通过结构体获取ip列表
  3. 将新的ip加入到ip列表
  4. 重构结构体并上报
def build_new_request_body(ip_addresses,newip):
    """
    模板
    <addr-object>
    <elements>
    <elem-id>0</elem-id>
    <address-ipv4>10.10.10.1/32</address-ipv4>
    </elements>
    </addr-object>
    """
    #构造老的地址
    fragments = ['<addr-object>']
    num=0
    for count, ip in enumerate(ip_addresses):
        elements = f"<elements><elem-id>{count}</elem-id><address-ipv4>{ip}</address-ipv4></elements>"
        fragments.append(elements)
        num+=1
    
    #加入新的instanceIP
    new_instanceIP = f"<elements><elem-id>{num}</elem-id><address-ipv4>{newip}</address-ipv4></elements>"
    fragments.append(new_instanceIP)

    #拼接
    fragments.append("</addr-object>")
    addr_object = ''.join(fragments)

    return addr_object


#构建新的请求体,获取现有地址列表
def get_request_body(existing_xml):
    try:        
        # 解析XML
        root = etree.fromstring(existing_xml)
        
        # 定义命名空间
        ns = {
            'ns0': 'urn:ietf:params:xml:ns:netconf:base:1.0',
            'ns1': 'urn:huawei:params:xml:ns:yang:huawei-address-set'
        }
        
        # 查找所有<address-ipv4>元素
        ipv4_elements = root.findall('.//ns1:address-ipv4', ns) + root.findall('.//address-ipv4')
        
        # 提取IP地址
        ip_addresses = [elem.text for elem in ipv4_elements]
        
        logger.info("提取的IP地址:", ip_addresses)
        return ip_addresses
    
    except etree.XMLSyntaxError as e:
        logger.error(f"XML解析错误: {e}")
    except Exception as e:
        logger.error(f"发生错误: {e}")
    
    return None

def get_existing_addr_object(addName):
    vsys = "public"
    addr_object_url = f"{base_url}/data/huawei-address-set:address-set/addr-object={vsys},{addName}"
    response = requests.get(addr_object_url, headers=headers, auth=HTTPBasicAuth(username, password), verify=False)
    logger.info(response)
    if response.status_code == 200:
        return response.text
    else:
        raise Exception(f"Failed to get address object: {response.status_code}, {response.text}")

def addInstanceIP(addName,newip):
    # 获取现有XML数据
    existing_xml = get_existing_addr_object(addName)

    ip_addresses = get_request_body(existing_xml)

    # 构造新的add结构
    addr_object = build_new_request_body(ip_addresses,newip)

    # 请求防火墙
    status_code = send_restconf_request(addName,addr_object)

    return status_code



addInstanceIP("fortest","10.10.10.1/24")

删除NAT映射规则

删除规则比较简单,调用DELETE进行删除即可,分为全部和单个

  • 删除所有 DELETE /restconf/data/huawei-nat-address-group:nat-address-group
  • 删除某个 DELETE /restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group=test,public

修改和删除得逻辑相似,都不建议直接调用原生接口,因为大多数得时候并不希望删除整个规则,而是希望删除某个具体得地址段,可以参考修改NAT映射规则,加一个地址判断逻辑,在构造新的结构体时不加入新段即可。

def build_new_request_body(ip_addresses,deleteIP):
    """
    模板
    <addr-object>
    <elements>
    <elem-id>0</elem-id>
    <address-ipv4>10.10.10.1/32</address-ipv4>
    </elements>
    </addr-object>
    """
    #构造老的地址
    fragments = ['<addr-object>']
    num=0
    for count, ip in enumerate(ip_addresses):
        if not deleteIP:
            elements = f"<elements><elem-id>{count}</elem-id><address-ipv4>{ip}</address-ipv4></elements>"
            fragments.append(elements)
            num+=1
    
    #拼接
    fragments.append("</addr-object>")
    addr_object = ''.join(fragments)

    return addr_object

补充

网络技术:NAT 网络地址转换 - 乌漆WhiteMoon - 博客园

NAT(网络地址转换) - eiSouthBoy - 博客园

42张图详解 NAT : 换个马甲就能上网-腾讯云开发者社区-腾讯云

网络地址转换:DNAT和SNAT有啥区别?分别用于什么场景?-腾讯云开发者社区-腾讯云

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

token失效重新存储发起请求

import axios from axios import { MessageBox, Message } from element-ui import store from /store import Router from /router import { getCookie, setToken, setCookie } from ./auth// 因为后端环境区分v1 v2 剔除测试盛传的环境配置&#xff0c;并添加统一前缀 const …

HTML综合

一.HTML的初始结构 <!DOCTYPE html> <html lang"en"><head><!-- 设置文本字符 --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 设置网页…

【合作原创】使用Termux搭建可以使用的生产力环境(六)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境&#xff08;五&#xff09;-CSDN博客我们讲到了如何美化xfce4桌面&#xff0c;达到类似于Windows的效果&#xff0c;这一篇将继续在上一篇桌面的基础上给我们的系统装上必要的软件&#xff0c;让它做到真正可以使…

python3中幂怎么表示

首先导入math模块&#xff0c;然后调用pow()函数&#xff0c;即可实现幂运算&#xff0c;示例如下&#xff1a; import math math.pow(2&#xff0c;3) 结果如下&#xff1a; 8

AES笔记整理

文章目录 1. 简介2. 密钥加法层2. 字节代换层3. 行位移 - ShiftRows4. 列混淆 - MixColumn5. 其他5.1列混淆矩阵乘法运算5.2 AES密钥生成 6. 参考资料 以下内容为信息安全开发过程中&#xff0c;AES对称加密算法的笔记&#xff0c;大部分内容转载其他文章&#xff0c;若描述不清…

elementUI修改table样式

在Vue项目中&#xff0c;如果使用的是单文件组件&#xff08;.vue&#xff09;&#xff0c;并且样式是通过<style>标签定义的&#xff0c;vue2可以使用/deep/&#xff0c;vue3可以使用::v-deep选择器来修改ElementUI组件的样式。 1.修改表头背景色 /deep/.el-table__head…

【WiFi】WiFi中RSSI、SNR、NF之间关系及说明

RSSI&#xff08;接收信号强度指示&#xff09; 定义&#xff1a; RSSI 是一个相对值&#xff0c;用于表示接收到的无线信号的强度。它通常由无线设备的硬件&#xff08;如无线网卡或无线芯片&#xff09;直接提供。 计算&#xff1a; RSSI 的计算通常是由设备的无线芯片完成的…

爬虫基础知识点

最近看了看爬虫相关知识点&#xff0c;做了记录&#xff0c;具体代码放到了仓库&#xff0c;本文仅学习使用&#xff0c;如有违规请联系博主删除。 这个流程图是我使用在线AI工具infography生成的&#xff0c;这个网站可以根据url或者文本等数据自动生成流程图&#xff0c;挺…

路由引入问题(双点双向路由回馈问题)

简介 总所周知&#xff0c;路由引入import又称路由重分发redistribute&#xff0c;为了解决不同路由协议进程间路由信息不互通而使用的技术&#xff0c;由于不同路由协议的算法、机制、开销等因素的差异&#xff0c;它们之间无法直接交换路由信息。因此&#xff0c;路由引入技…

LAVE——基于大语言模型的新型代理辅助视频编辑工具允许用户根据自己的编辑风格进行调整

概述 论文地址&#xff1a;https://arxiv.org/abs/2402.10294 视频是一种非常强大的交流和讲述故事的媒介。随着社交媒体和视频共享平台的出现&#xff0c;视频的受欢迎程度直线上升&#xff0c;许多人都在制作和分享自己的内容。然而&#xff0c;对于初学者来说&#xff0c;视…

Java安全—SpringBootActuator监控泄露Swagger自动化

前言 今天依旧是SpringBoot框架&#xff0c;估计还要一篇文章才能把它写完&#xff0c;没办法&#xff0c;Java安全的内容太多了。 Actuator SpringBoot Actuator模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP跟踪…

docker快速实现ELK的安装和使用

目录 一、ELK功能原理 二、项目功能展示​ 三、日志查询展示​ 四、ELK安装步骤 1、创建elasticsearch、kibana、filebeat相关data、log、conf目录 2、进入/usr/local/elk目录&#xff0c;并创建一个docker网络 3、启动 elasticsearch容器 4、运行kibana容器 5、启动f…

【Spark】Spark Join类型及Join实现方式

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…

从YOLOv5到训练实战:易用性和扩展性的加强

文章目录 前言一、模型介绍二、YOLOv5网络结构1.Input&#xff08;输入端&#xff09;&#xff1a;智能预处理与优化策略2.Backbone&#xff08;骨干网络&#xff09;&#xff1a;高效特征提取3.NECK&#xff08;颈部&#xff09;&#xff1a;特征增强与多尺度融合4.Prediction…

Java爬虫设计:淘宝商品详情接口数据获取

1. 概述 淘宝商品详情接口&#xff08;如Taobao.item_get&#xff09;允许开发者通过编程方式&#xff0c;以JSON格式实时获取淘宝商品的详细信息&#xff0c;包括商品标题、价格、销量等。本文档将介绍如何设计一个Java爬虫来获取这些数据。 2. 准备工作 在开始之前&#x…

AIGC 013-CoT用思维链挖掘自回归语言模型的潜在能力

AIGC 013-CoT用思维链挖掘自回归语言模型的潜在能力 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 纯自回归式语言模型&#xff0c;本来并不具备优秀推理能力&#xff0c;特别是在数学问题的推理。但是现在的生成模型是能实现一些数学的推理的。研究者认为当模型足够大…

上传文件时获取音视频文件时长和文本文件字数

获取音视频文件时长和文本文件字数 一、获取音视频文件时长二、计算文本文件字数 最近有个需求&#xff0c;要求上传文件时获取音视频文件时长和文本文件字数&#x1f436;。 发现这样的冷门资料不多&#xff0c;特做个记录。本文忽略文件上传功能&#xff0c;只封装核心的工具…

ue5.2 数字孪生(11)——Web_UI插件网页通信

Web_UI插件下载安装&#xff1a; https://github.com/tracerinteractive/UnrealEngine/releases 下载对应Ue版本的Web_UI插件以及相关的Json、Http库&#xff1b; 将插件安装到引擎根目录 Ue链接Web&#xff1a; 在项目中启用插件并重启项目&#xff1b; 创建基于Web的用户…

postman可以通的请求,前端通不了(前端添加Content-type,后端收不到请求)

接口完成之后,自己使用postman测试了一下,没有问题; 可是在和小组前端调试接口的时候,他却说访问不了; 信息如下:(我自己写的一个打印请求信息的拦截器) 发现报错信息是: Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported 也就是说…

EFAK kafka可视化管理工具部署使用

简介&#xff1a;EFAK是开源的可视化和管理软件。它允许您查询、可视化、提醒和探索您的指标&#xff0c;无论它们存储在何处。简单来说&#xff0c;它为您提供了将 Kafka 集群数据转换为漂亮的图形和可视化效果的工具。 环境&#xff1a;①操作系统&#xff1a;CentOS7.6&…