diff --git a/internal/db/models/node_cluster_dao.go b/internal/db/models/node_cluster_dao.go index 611ecd9c..cabbb019 100644 --- a/internal/db/models/node_cluster_dao.go +++ b/internal/db/models/node_cluster_dao.go @@ -1021,7 +1021,7 @@ func (this *NodeClusterDAO) FindClusterBasicInfo(tx *dbs.Tx, clusterId int64, ca cluster, err := this.Query(tx). Pk(clusterId). State(NodeClusterStateEnabled). - Result("id", "name", "timeZone", "nodeMaxThreads", "cachePolicyId", "httpFirewallPolicyId", "autoOpenPorts", "webp", "uam", "cc", "httpPages", "http3", "isOn", "ddosProtection", "clock", "globalServerConfig", "autoInstallNftables", "autoSystemTuning"). + Result("id", "name", "timeZone", "nodeMaxThreads", "cachePolicyId", "httpFirewallPolicyId", "autoOpenPorts", "webp", "uam", "cc", "httpPages", "http3", "isOn", "ddosProtection", "clock", "globalServerConfig", "autoInstallNftables", "autoSystemTuning", "networkSecurity"). Find() if err != nil || cluster == nil { return nil, err @@ -1269,6 +1269,57 @@ func (this *NodeClusterDAO) FindClusterHTTP3Policy(tx *dbs.Tx, clusterId int64, return policy, nil } +// UpdateClusterNetworkSecurityPolicy 修改网络安全策略设置 +func (this *NodeClusterDAO) UpdateClusterNetworkSecurityPolicy(tx *dbs.Tx, clusterId int64, networkSecurityPolicy *nodeconfigs.NetworkSecurityPolicy) error { + if networkSecurityPolicy == nil { + networkSecurityPolicy = nodeconfigs.NewNetworkSecurityPolicy() + } + + networkSecurityPolicyJSON, err := json.Marshal(networkSecurityPolicy) + if err != nil { + return err + } + err = this.Query(tx). + Pk(clusterId). + Set("networkSecurity", networkSecurityPolicyJSON). + UpdateQuickly() + if err != nil { + return err + } + + return this.NotifyNetworkSecurityUpdate(tx, clusterId) +} + +// FindClusterNetworkSecurityPolicy 查询网络安全策略设置 +func (this *NodeClusterDAO) FindClusterNetworkSecurityPolicy(tx *dbs.Tx, clusterId int64, cacheMap *utils.CacheMap) (*nodeconfigs.NetworkSecurityPolicy, error) { + var cacheKey = this.Table + ":FindClusterNetworkSecurityPolicy:" + types.String(clusterId) + if cacheMap != nil { + cache, ok := cacheMap.Get(cacheKey) + if ok { + return cache.(*nodeconfigs.NetworkSecurityPolicy), nil + } + } + + networkSecurityPolicyJSON, err := this.Query(tx). + Pk(clusterId). + Result("networkSecurity"). + FindJSONCol() + if err != nil { + return nil, err + } + + if IsNull(networkSecurityPolicyJSON) { + return nodeconfigs.NewNetworkSecurityPolicy(), nil + } + + var policy = nodeconfigs.NewNetworkSecurityPolicy() + err = json.Unmarshal(networkSecurityPolicyJSON, policy) + if err != nil { + return nil, err + } + return policy, nil +} + // UpdateClusterHTTPPagesPolicy 修改自定义页面设置 func (this *NodeClusterDAO) UpdateClusterHTTPPagesPolicy(tx *dbs.Tx, clusterId int64, httpPagesPolicy *nodeconfigs.HTTPPagesPolicy) error { if httpPagesPolicy == nil { @@ -1452,6 +1503,11 @@ func (this *NodeClusterDAO) NotifyHTTP3Update(tx *dbs.Tx, clusterId int64) error return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeHTTP3PolicyChanged) } +// NotifyNetworkSecurityUpdate 通知网络安全策略更新 +func (this *NodeClusterDAO) NotifyNetworkSecurityUpdate(tx *dbs.Tx, clusterId int64) error { + return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeNetworkSecurityPolicyChanged) +} + // NotifyHTTPPagesPolicyUpdate 通知HTTP Pages更新 func (this *NodeClusterDAO) NotifyHTTPPagesPolicyUpdate(tx *dbs.Tx, clusterId int64) error { return SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleNode, clusterId, 0, 0, NodeTaskTypeHTTPPagesPolicyChanged) diff --git a/internal/db/models/node_cluster_model.go b/internal/db/models/node_cluster_model.go index e24f1c46..498519b6 100644 --- a/internal/db/models/node_cluster_model.go +++ b/internal/db/models/node_cluster_model.go @@ -44,6 +44,7 @@ const ( NodeClusterField_Cc dbs.FieldName = "cc" // CC设置 NodeClusterField_Http3 dbs.FieldName = "http3" // HTTP3设置 NodeClusterField_AutoSystemTuning dbs.FieldName = "autoSystemTuning" // 是否自动调整系统参数 + NodeClusterField_NetworkSecurity dbs.FieldName = "networkSecurity" // 网络安全策略 ) // NodeCluster 节点集群 @@ -89,6 +90,7 @@ type NodeCluster struct { Cc dbs.JSON `field:"cc"` // CC设置 Http3 dbs.JSON `field:"http3"` // HTTP3设置 AutoSystemTuning bool `field:"autoSystemTuning"` // 是否自动调整系统参数 + NetworkSecurity dbs.JSON `field:"networkSecurity"` // 网络安全策略 } type NodeClusterOperator struct { @@ -133,6 +135,7 @@ type NodeClusterOperator struct { Cc any // CC设置 Http3 any // HTTP3设置 AutoSystemTuning any // 是否自动调整系统参数 + NetworkSecurity any // 网络安全策略 } func NewNodeClusterOperator() *NodeClusterOperator { diff --git a/internal/db/models/node_cluster_model_ext.go b/internal/db/models/node_cluster_model_ext.go index 2b24a304..e69eaa79 100644 --- a/internal/db/models/node_cluster_model_ext.go +++ b/internal/db/models/node_cluster_model_ext.go @@ -37,7 +37,7 @@ func (this *NodeCluster) DecodeDDoSProtection() *ddosconfigs.ProtectionConfig { return result } -// HasDDoSProtection 检查是否有DDOS设置 +// HasDDoSProtection 检查是否有DDoS设置 func (this *NodeCluster) HasDDoSProtection() bool { var config = this.DecodeDDoSProtection() if config != nil { @@ -46,6 +46,27 @@ func (this *NodeCluster) HasDDoSProtection() bool { return false } +// HasNetworkSecurityPolicy 检查是否有安全策略设置 +func (this *NodeCluster) HasNetworkSecurityPolicy() bool { + var policy = this.DecodeNetworkSecurityPolicy() + if policy != nil { + return policy.IsOn() + } + return false +} + +// DecodeNetworkSecurityPolicy 解析安全策略设置 +func (this *NodeCluster) DecodeNetworkSecurityPolicy() *nodeconfigs.NetworkSecurityPolicy { + var policy = nodeconfigs.NewNetworkSecurityPolicy() + if IsNotNull(this.NetworkSecurity) { + err := json.Unmarshal(this.NetworkSecurity, policy) + if err != nil { + remotelogs.Error("NodeCluster.DecodeNetworkSecurityPolicy()", err.Error()) + } + } + return policy +} + // DecodeClock 解析时钟配置 func (this *NodeCluster) DecodeClock() *nodeconfigs.ClockConfig { var clock = nodeconfigs.DefaultClockConfig() diff --git a/internal/db/models/node_dao.go b/internal/db/models/node_dao.go index 6bd4747b..42ceff28 100644 --- a/internal/db/models/node_dao.go +++ b/internal/db/models/node_dao.go @@ -1221,6 +1221,11 @@ func (this *NodeDAO) ComposeNodeConfig(tx *dbs.Tx, nodeId int64, dataMap *shared config.AutoSystemTuning = nodeCluster.AutoSystemTuning } + // 安全设置 + if clusterIndex == 0 { + config.NetworkSecurityPolicy = nodeCluster.DecodeNetworkSecurityPolicy() + } + clusterIndex++ } diff --git a/internal/db/models/node_task_dao.go b/internal/db/models/node_task_dao.go index 80ebd5a9..15ef6912 100644 --- a/internal/db/models/node_task_dao.go +++ b/internal/db/models/node_task_dao.go @@ -17,21 +17,22 @@ type NodeTaskType = string const ( // CDN相关 - NodeTaskTypeConfigChanged NodeTaskType = "configChanged" // 节点整体配置变化 - NodeTaskTypeDDosProtectionChanged NodeTaskType = "ddosProtectionChanged" // 节点DDoS配置变更 - NodeTaskTypeGlobalServerConfigChanged NodeTaskType = "globalServerConfigChanged" // 全局服务设置变化 - NodeTaskTypeIPListDeleted NodeTaskType = "ipListDeleted" // IPList被删除 - NodeTaskTypeIPItemChanged NodeTaskType = "ipItemChanged" // IP条目变更 - NodeTaskTypeNodeVersionChanged NodeTaskType = "nodeVersionChanged" // 节点版本变化 - NodeTaskTypeScriptsChanged NodeTaskType = "scriptsChanged" // 脚本配置变化 - NodeTaskTypeNodeLevelChanged NodeTaskType = "nodeLevelChanged" // 节点级别变化 - NodeTaskTypeUserServersStateChanged NodeTaskType = "userServersStateChanged" // 用户服务状态变化 - NodeTaskTypeUAMPolicyChanged NodeTaskType = "uamPolicyChanged" // UAM策略变化 - NodeTaskTypeHTTPPagesPolicyChanged NodeTaskType = "httpPagesPolicyChanged" // 自定义页面变化 - NodeTaskTypeHTTPCCPolicyChanged NodeTaskType = "httpCCPolicyChanged" // CC策略变化 - NodeTaskTypeHTTP3PolicyChanged NodeTaskType = "http3PolicyChanged" // HTTP3策略变化 - NodeTaskTypeUpdatingServers NodeTaskType = "updatingServers" // 更新一组服务 - NodeTaskTypeTOAChanged NodeTaskType = "toaChanged" // TOA配置变化 + NodeTaskTypeConfigChanged NodeTaskType = "configChanged" // 节点整体配置变化 + NodeTaskTypeDDosProtectionChanged NodeTaskType = "ddosProtectionChanged" // 节点DDoS配置变更 + NodeTaskTypeGlobalServerConfigChanged NodeTaskType = "globalServerConfigChanged" // 全局服务设置变化 + NodeTaskTypeIPListDeleted NodeTaskType = "ipListDeleted" // IPList被删除 + NodeTaskTypeIPItemChanged NodeTaskType = "ipItemChanged" // IP条目变更 + NodeTaskTypeNodeVersionChanged NodeTaskType = "nodeVersionChanged" // 节点版本变化 + NodeTaskTypeScriptsChanged NodeTaskType = "scriptsChanged" // 脚本配置变化 + NodeTaskTypeNodeLevelChanged NodeTaskType = "nodeLevelChanged" // 节点级别变化 + NodeTaskTypeUserServersStateChanged NodeTaskType = "userServersStateChanged" // 用户服务状态变化 + NodeTaskTypeUAMPolicyChanged NodeTaskType = "uamPolicyChanged" // UAM策略变化 + NodeTaskTypeHTTPPagesPolicyChanged NodeTaskType = "httpPagesPolicyChanged" // 自定义页面变化 + NodeTaskTypeHTTPCCPolicyChanged NodeTaskType = "httpCCPolicyChanged" // CC策略变化 + NodeTaskTypeHTTP3PolicyChanged NodeTaskType = "http3PolicyChanged" // HTTP3策略变化 + NodeTaskTypeNetworkSecurityPolicyChanged NodeTaskType = "networkSecurityPolicyChanged" // 网络安全策略变化 + NodeTaskTypeUpdatingServers NodeTaskType = "updatingServers" // 更新一组服务 + NodeTaskTypeTOAChanged NodeTaskType = "toaChanged" // TOA配置变化 // NS相关 diff --git a/internal/rpc/services/service_node_cluster.go b/internal/rpc/services/service_node_cluster.go index 6752125d..2abfcc93 100644 --- a/internal/rpc/services/service_node_cluster.go +++ b/internal/rpc/services/service_node_cluster.go @@ -1197,6 +1197,9 @@ func (this *NodeClusterService) FindEnabledNodeClusterConfigInfo(ctx context.Con result.Http3IsOn = http3Policy.IsOn } + // 网络安全策略 + result.HasNetworkSecurityPolicy = cluster.HasNetworkSecurityPolicy() + return result, nil } diff --git a/internal/rpc/services/service_node_cluster_ext.go b/internal/rpc/services/service_node_cluster_ext.go index ef780283..74616dbc 100644 --- a/internal/rpc/services/service_node_cluster_ext.go +++ b/internal/rpc/services/service_node_cluster_ext.go @@ -11,3 +11,13 @@ import ( func (this *NodeClusterService) FindNodeClusterHTTP3Policy(ctx context.Context, req *pb.FindNodeClusterHTTP3PolicyRequest) (*pb.FindNodeClusterHTTP3PolicyResponse, error) { return nil, this.NotImplementedYet() } + +// FindNodeClusterNetworkSecurityPolicy 获取集群的网络安全策略 +func (this *NodeClusterService) FindNodeClusterNetworkSecurityPolicy(ctx context.Context, req *pb.FindNodeClusterNetworkSecurityPolicyRequest) (*pb.FindNodeClusterNetworkSecurityPolicyResponse, error) { + return nil, this.NotImplementedYet() +} + +// UpdateNodeClusterNetworkSecurityPolicy 修改集群的网络安全策略 +func (this *NodeClusterService) UpdateNodeClusterNetworkSecurityPolicy(ctx context.Context, req *pb.UpdateNodeClusterNetworkSecurityPolicyRequest) (*pb.RPCSuccess, error) { + return nil, this.NotImplementedYet() +} diff --git a/internal/rpc/services/service_node_ext.go b/internal/rpc/services/service_node_ext.go index e0b84a02..d3fc5271 100644 --- a/internal/rpc/services/service_node_ext.go +++ b/internal/rpc/services/service_node_ext.go @@ -52,3 +52,8 @@ func (this *NodeService) CopyNodeActionsToNodeCluster(ctx context.Context, req * func (this *NodeService) FindNodeTOAConfig(ctx context.Context, req *pb.FindNodeTOAConfigRequest) (*pb.FindNodeTOAConfigResponse, error) { return nil, this.NotImplementedYet() } + +// FindNodeNetworkSecurityPolicy 查找节点的网络安全策略 +func (this *NodeService) FindNodeNetworkSecurityPolicy(ctx context.Context, req *pb.FindNodeNetworkSecurityPolicyRequest) (*pb.FindNodeNetworkSecurityPolicyResponse, error) { + return nil, this.NotImplementedYet() +} diff --git a/internal/rpc/services/service_server_stat_board.go b/internal/rpc/services/service_server_stat_board.go index 32a315e3..e7c2065d 100644 --- a/internal/rpc/services/service_server_stat_board.go +++ b/internal/rpc/services/service_server_stat_board.go @@ -414,6 +414,17 @@ func (this *ServerStatBoardService) ComposeServerStatNodeBoard(ctx context.Conte }) } + networkPacketsValues, err := models.SharedNodeValueDAO.ListValues(tx, "node", req.NodeId, nodeconfigs.NodeValueItemNetworkPackets, nodeconfigs.NodeValueRangeMinute) + if err != nil { + return nil, err + } + for _, v := range networkPacketsValues { + result.NetworkPacketsValues = append(result.NetworkPacketsValues, &pb.NodeValue{ + ValueJSON: v.Value, + CreatedAt: int64(v.CreatedAt), + }) + } + cacheDirValues, err := models.SharedNodeValueDAO.ListValues(tx, "node", req.NodeId, nodeconfigs.NodeValueItemCacheDir, nodeconfigs.NodeValueRangeMinute) if err != nil { return nil, err diff --git a/internal/setup/sql.json b/internal/setup/sql.json index 57ce64ef..0300c176 100644 --- a/internal/setup/sql.json +++ b/internal/setup/sql.json @@ -109840,7 +109840,7 @@ "name": "edgeNodeClusters", "engine": "InnoDB", "charset": "utf8mb4_general_ci", - "definition": "CREATE TABLE `edgeNodeClusters` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `name` varchar(255) DEFAULT NULL COMMENT '名称',\n `useAllAPINodes` tinyint(1) unsigned DEFAULT '1' COMMENT '是否使用所有API节点',\n `apiNodes` json DEFAULT NULL COMMENT '使用的API节点',\n `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录',\n `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `grantId` int(11) unsigned DEFAULT '0' COMMENT '默认认证方式',\n `sshParams` json DEFAULT NULL COMMENT 'SSH默认参数',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `autoRegister` tinyint(1) unsigned DEFAULT '1' COMMENT '是否开启自动注册',\n `uniqueId` varchar(32) DEFAULT NULL COMMENT '唯一ID',\n `secret` varchar(32) DEFAULT NULL COMMENT '密钥',\n `healthCheck` json DEFAULT NULL COMMENT '健康检查',\n `dnsName` varchar(255) DEFAULT NULL COMMENT 'DNS名称',\n `dnsDomainId` int(11) unsigned DEFAULT '0' COMMENT '域名ID',\n `dns` json DEFAULT NULL COMMENT 'DNS配置',\n `toa` json DEFAULT NULL COMMENT 'TOA配置',\n `cachePolicyId` int(11) unsigned DEFAULT '0' COMMENT '缓存策略ID',\n `httpFirewallPolicyId` int(11) unsigned DEFAULT '0' COMMENT 'WAF策略ID',\n `accessLog` json DEFAULT NULL COMMENT '访问日志设置',\n `systemServices` json DEFAULT NULL COMMENT '系统服务设置',\n `timeZone` varchar(64) DEFAULT NULL COMMENT '时区',\n `nodeMaxThreads` int(11) unsigned DEFAULT '0' COMMENT '节点最大线程数',\n `ddosProtection` json DEFAULT NULL COMMENT 'DDoS防护设置',\n `autoOpenPorts` tinyint(1) unsigned DEFAULT '1' COMMENT '是否自动尝试开放端口',\n `isPinned` tinyint(1) unsigned DEFAULT '0' COMMENT '是否置顶',\n `webp` json DEFAULT NULL COMMENT 'WebP设置',\n `uam` json DEFAULT NULL COMMENT 'UAM设置',\n `clock` json DEFAULT NULL COMMENT '时钟配置',\n `globalServerConfig` json DEFAULT NULL COMMENT '全局服务配置',\n `autoRemoteStart` tinyint(1) unsigned DEFAULT '1' COMMENT '自动远程启动',\n `autoInstallNftables` tinyint(1) unsigned DEFAULT '0' COMMENT '自动安装nftables',\n `isAD` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为高防集群',\n `httpPages` json DEFAULT NULL COMMENT '自定义页面设置',\n `cc` json DEFAULT NULL COMMENT 'CC设置',\n `http3` json DEFAULT NULL COMMENT 'HTTP3设置',\n `autoSystemTuning` tinyint(1) unsigned DEFAULT '1' COMMENT '是否自动调整系统参数',\n PRIMARY KEY (`id`),\n KEY `uniqueId` (`uniqueId`),\n KEY `grantId` (`grantId`),\n KEY `dnsDomainId` (`dnsDomainId`),\n KEY `cachePolicyId` (`cachePolicyId`),\n KEY `httpFirewallPolicyId` (`httpFirewallPolicyId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点集群'", + "definition": "CREATE TABLE `edgeNodeClusters` (\n `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n `name` varchar(255) DEFAULT NULL COMMENT '名称',\n `useAllAPINodes` tinyint(1) unsigned DEFAULT '1' COMMENT '是否使用所有API节点',\n `apiNodes` json DEFAULT NULL COMMENT '使用的API节点',\n `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录',\n `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n `grantId` int(11) unsigned DEFAULT '0' COMMENT '默认认证方式',\n `sshParams` json DEFAULT NULL COMMENT 'SSH默认参数',\n `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n `autoRegister` tinyint(1) unsigned DEFAULT '1' COMMENT '是否开启自动注册',\n `uniqueId` varchar(32) DEFAULT NULL COMMENT '唯一ID',\n `secret` varchar(32) DEFAULT NULL COMMENT '密钥',\n `healthCheck` json DEFAULT NULL COMMENT '健康检查',\n `dnsName` varchar(255) DEFAULT NULL COMMENT 'DNS名称',\n `dnsDomainId` int(11) unsigned DEFAULT '0' COMMENT '域名ID',\n `dns` json DEFAULT NULL COMMENT 'DNS配置',\n `toa` json DEFAULT NULL COMMENT 'TOA配置',\n `cachePolicyId` int(11) unsigned DEFAULT '0' COMMENT '缓存策略ID',\n `httpFirewallPolicyId` int(11) unsigned DEFAULT '0' COMMENT 'WAF策略ID',\n `accessLog` json DEFAULT NULL COMMENT '访问日志设置',\n `systemServices` json DEFAULT NULL COMMENT '系统服务设置',\n `timeZone` varchar(64) DEFAULT NULL COMMENT '时区',\n `nodeMaxThreads` int(11) unsigned DEFAULT '0' COMMENT '节点最大线程数',\n `ddosProtection` json DEFAULT NULL COMMENT 'DDoS防护设置',\n `autoOpenPorts` tinyint(1) unsigned DEFAULT '1' COMMENT '是否自动尝试开放端口',\n `isPinned` tinyint(1) unsigned DEFAULT '0' COMMENT '是否置顶',\n `webp` json DEFAULT NULL COMMENT 'WebP设置',\n `uam` json DEFAULT NULL COMMENT 'UAM设置',\n `clock` json DEFAULT NULL COMMENT '时钟配置',\n `globalServerConfig` json DEFAULT NULL COMMENT '全局服务配置',\n `autoRemoteStart` tinyint(1) unsigned DEFAULT '1' COMMENT '自动远程启动',\n `autoInstallNftables` tinyint(1) unsigned DEFAULT '0' COMMENT '自动安装nftables',\n `isAD` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为高防集群',\n `httpPages` json DEFAULT NULL COMMENT '自定义页面设置',\n `cc` json DEFAULT NULL COMMENT 'CC设置',\n `http3` json DEFAULT NULL COMMENT 'HTTP3设置',\n `autoSystemTuning` tinyint(1) unsigned DEFAULT '1' COMMENT '是否自动调整系统参数',\n `networkSecurity` json DEFAULT NULL COMMENT '网络安全策略',\n PRIMARY KEY (`id`),\n KEY `uniqueId` (`uniqueId`),\n KEY `grantId` (`grantId`),\n KEY `dnsDomainId` (`dnsDomainId`),\n KEY `cachePolicyId` (`cachePolicyId`),\n KEY `httpFirewallPolicyId` (`httpFirewallPolicyId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点集群'", "fields": [ { "name": "id", @@ -110005,6 +110005,10 @@ { "name": "autoSystemTuning", "definition": "tinyint(1) unsigned DEFAULT '1' COMMENT '是否自动调整系统参数'" + }, + { + "name": "networkSecurity", + "definition": "json COMMENT '网络安全策略'" } ], "indexes": [