mirror of
https://github.com/netcccyun/dnsmgr.git
synced 2026-06-23 00:13:58 +08:00
1b1605400d
feat(cloudflare): 添加 Cloudflare Tunnels 和增强功能支持 - 在 .gitignore 中添加 .ace-tool/ 忽略规则 - 更新 Cloudflare 配置项,添加详细的使用说明和 API 令牌认证支持 - 新增 Account ID 配置字段用于 Cloudflare Tunnels 功能 - 在账户管理页面添加 Tunnels 功能入口按钮 - 实现智能账户名称自动生成逻辑,优先使用关键认证字段 - 添加 Cloudflare 增强功能菜单项,仅对管理员可见 - 定义完整的 Cloudflare 相关路由,包括 hostnames、tunnels 等功能模块 ```
689 lines
23 KiB
PHP
689 lines
23 KiB
PHP
<?php
|
|
|
|
namespace app\lib;
|
|
|
|
use think\facade\Db;
|
|
|
|
class DnsHelper
|
|
{
|
|
public static $dns_config = [
|
|
'aliyun' => [
|
|
'name' => '阿里云',
|
|
'icon' => 'aliyun.png',
|
|
'note' => '',
|
|
'config' => [
|
|
'AccessKeyId' => [
|
|
'name' => 'AccessKeyId',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'AccessKeySecret' => [
|
|
'name' => 'AccessKeySecret',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 1, //是否支持备注,1单独设置备注,2和记录一起设置
|
|
'status' => true, //是否支持启用暂停
|
|
'redirect' => true, //是否支持域名转发
|
|
'log' => true, //是否支持查看日志
|
|
'weight' => false, //是否支持权重
|
|
'page' => false, //是否客户端分页
|
|
'add' => true, //是否支持添加域名
|
|
],
|
|
'dnspod' => [
|
|
'name' => '腾讯云',
|
|
'icon' => 'dnspod.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'SecretId' => [
|
|
'name' => 'SecretId',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'SecretKey' => [
|
|
'name' => 'SecretKey',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 1,
|
|
'status' => true,
|
|
'redirect' => true,
|
|
'log' => true,
|
|
'weight' => true,
|
|
'page' => false,
|
|
'add' => true,
|
|
],
|
|
'huawei' => [
|
|
'name' => '华为云',
|
|
'icon' => 'huawei.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'AccessKeyId' => [
|
|
'name' => 'AccessKeyId',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'SecretAccessKey' => [
|
|
'name' => 'SecretAccessKey',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 2,
|
|
'status' => true,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => true,
|
|
'page' => false,
|
|
'add' => true,
|
|
],
|
|
'baidu' => [
|
|
'name' => '百度云',
|
|
'icon' => 'baidu.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'AccessKeyId' => [
|
|
'name' => 'AccessKeyId',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'SecretAccessKey' => [
|
|
'name' => 'SecretAccessKey',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 2,
|
|
'status' => false,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => false,
|
|
'page' => true,
|
|
'add' => true,
|
|
],
|
|
'west' => [
|
|
'name' => '西部数码',
|
|
'icon' => 'west.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'username' => [
|
|
'name' => '用户名',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'api_password' => [
|
|
'name' => 'API密码',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 0,
|
|
'status' => true,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => false,
|
|
'page' => false,
|
|
'add' => false,
|
|
],
|
|
'huoshan' => [
|
|
'name' => '火山引擎',
|
|
'icon' => 'huoshan.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'AccessKeyId' => [
|
|
'name' => 'AccessKeyId',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'SecretAccessKey' => [
|
|
'name' => 'SecretAccessKey',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 2,
|
|
'status' => true,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => true,
|
|
'page' => false,
|
|
'add' => true,
|
|
],
|
|
'jdcloud' => [
|
|
'name' => '京东云',
|
|
'icon' => 'jdcloud.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'AccessKeyId' => [
|
|
'name' => 'AccessKeyId',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'AccessKeySecret' => [
|
|
'name' => 'AccessKeySecret',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 0,
|
|
'status' => true,
|
|
'redirect' => true,
|
|
'log' => false,
|
|
'weight' => true,
|
|
'page' => false,
|
|
'add' => true,
|
|
],
|
|
'dnsla' => [
|
|
'name' => 'DNSLA',
|
|
'icon' => 'dnsla.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'apiid' => [
|
|
'name' => 'APIID',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'apisecret' => [
|
|
'name' => 'API密钥',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 0,
|
|
'status' => true,
|
|
'redirect' => true,
|
|
'log' => false,
|
|
'weight' => true,
|
|
'page' => false,
|
|
'add' => true,
|
|
],
|
|
'qingcloud' => [
|
|
'name' => '青云',
|
|
'icon' => 'qingcloud.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'access_key_id' => [
|
|
'name' => 'Access Key ID',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'secret_access_key' => [
|
|
'name' => 'Secret Access Key',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 0,
|
|
'status' => true,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => true,
|
|
'page' => false,
|
|
'add' => false,
|
|
],
|
|
'bt' => [
|
|
'name' => '宝塔域名',
|
|
'icon' => 'bt.png',
|
|
'note' => '',
|
|
'config' => [
|
|
'AccessKey' => [
|
|
'name' => 'Access Key',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'SecretKey' => [
|
|
'name' => 'Secret Key',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'AccountID' => [
|
|
'name' => 'Account ID',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 2,
|
|
'status' => true,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => true,
|
|
'page' => false,
|
|
'add' => true,
|
|
],
|
|
'cloudflare' => [
|
|
'name' => 'Cloudflare',
|
|
'icon' => 'cloudflare.ico',
|
|
'note' => '如需使用 Cloudflare 增强与 Tunnels,建议使用 <b>API令牌</b> 认证,并补充 <b>Account ID</b>。Fallback Origin / 自定义主机名还要求目标 Zone 已开通 Cloudflare for SaaS 能力。',
|
|
'config' => [
|
|
'email' => [
|
|
'name' => '邮箱地址',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
'show' => 'auth=="0"',
|
|
],
|
|
'apikey' => [
|
|
'name' => 'API密钥/令牌',
|
|
'type' => 'input',
|
|
'placeholder' => '建议填写 Cloudflare API Token',
|
|
'required' => true,
|
|
],
|
|
'auth' => [
|
|
'name' => '认证方式',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => 'API密钥',
|
|
'1' => 'API令牌',
|
|
],
|
|
'value' => '1'
|
|
],
|
|
'account_id' => [
|
|
'name' => 'Account ID',
|
|
'type' => 'input',
|
|
'placeholder' => '可留空,首次进入 Tunnels 时会尝试自动探测',
|
|
'required' => false,
|
|
'show' => 'auth=="1"',
|
|
'note' => 'Cloudflare Tunnels 是账户级能力,建议填写 Account ID;留空时系统会尝试自动探测。'
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 2,
|
|
'status' => true,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => false,
|
|
'page' => false,
|
|
'add' => true,
|
|
],
|
|
'namesilo' => [
|
|
'name' => 'NameSilo',
|
|
'icon' => 'namesilo.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'username' => [
|
|
'name' => '账户名',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'apikey' => [
|
|
'name' => 'API Key',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 0,
|
|
'status' => false,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => false,
|
|
'page' => true,
|
|
'add' => false,
|
|
],
|
|
'spaceship' => [
|
|
'name' => 'Spaceship',
|
|
'icon' => 'spaceship.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'apikey' => [
|
|
'name' => 'API Key',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'apisecret' => [
|
|
'name' => 'API Secret',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 0,
|
|
'status' => false,
|
|
'redirect' => true,
|
|
'log' => false,
|
|
'weight' => false,
|
|
'page' => false,
|
|
'add' => false,
|
|
],
|
|
'powerdns' => [
|
|
'name' => 'PowerDNS',
|
|
'icon' => 'powerdns.ico',
|
|
'note' => '',
|
|
'config' => [
|
|
'ip' => [
|
|
'name' => 'IP地址',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'port' => [
|
|
'name' => '端口',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'apikey' => [
|
|
'name' => 'API KEY',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 2,
|
|
'status' => true,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => false,
|
|
'page' => true,
|
|
'add' => true,
|
|
],
|
|
'aliyunesa' => [
|
|
'name' => '阿里云ESA',
|
|
'icon' => 'aliyun.png',
|
|
'note' => '仅支持以NS方式接入阿里云ESA的域名',
|
|
'config' => [
|
|
'AccessKeyId' => [
|
|
'name' => 'AccessKeyId',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'AccessKeySecret' => [
|
|
'name' => 'AccessKeySecret',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'region' => [
|
|
'name' => 'API接入点',
|
|
'type' => 'select',
|
|
'options' => [
|
|
['value' => 'cn-hangzhou', 'label' => '中国内地'],
|
|
['value' => 'ap-southeast-1', 'label' => '非中国内地'],
|
|
],
|
|
'value' => 'cn-hangzhou',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 2,
|
|
'status' => false,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => false,
|
|
'page' => false,
|
|
'add' => false,
|
|
],
|
|
'tencenteo' => [
|
|
'name' => '腾讯云EO',
|
|
'icon' => 'tencent.png',
|
|
'note' => '仅支持以NS方式接入腾讯云EO的域名',
|
|
'config' => [
|
|
'SecretId' => [
|
|
'name' => 'SecretId',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'SecretKey' => [
|
|
'name' => 'SecretKey',
|
|
'type' => 'input',
|
|
'placeholder' => '',
|
|
'required' => true,
|
|
],
|
|
'site_type' => [
|
|
'name' => 'API接入点',
|
|
'type' => 'select',
|
|
'options' => [
|
|
['value' => 'cn', 'label' => '中国内地'],
|
|
['value' => 'intl', 'label' => '非中国内地'],
|
|
],
|
|
'value' => 'cn',
|
|
'required' => true,
|
|
],
|
|
'proxy' => [
|
|
'name' => '使用代理服务器',
|
|
'type' => 'radio',
|
|
'options' => [
|
|
'0' => '否',
|
|
'1' => '是',
|
|
],
|
|
'value' => '0'
|
|
],
|
|
],
|
|
'remark' => 0,
|
|
'status' => true,
|
|
'redirect' => false,
|
|
'log' => false,
|
|
'weight' => true,
|
|
'page' => false,
|
|
'add' => false,
|
|
],
|
|
];
|
|
|
|
public static $line_name = [
|
|
'aliyun' => ['DEF' => 'default', 'CT' => 'telecom', 'CU' => 'unicom', 'CM' => 'mobile', 'AB' => 'oversea'],
|
|
'dnspod' => ['DEF' => '0', 'CT' => '10=0', 'CU' => '10=1', 'CM' => '10=3', 'AB' => '3=0'],
|
|
'huawei' => ['DEF' => 'default_view', 'CT' => 'Dianxin', 'CU' => 'Liantong', 'CM' => 'Yidong', 'AB' => 'Abroad'],
|
|
'west' => ['DEF' => '', 'CT' => 'LTEL', 'CU' => 'LCNC', 'CM' => 'LMOB', 'AB' => 'LFOR'],
|
|
'dnsla' => ['DEF' => '', 'CT' => '84613316902921216', 'CU' => '84613316923892736', 'CM' => '84613316953252864', 'AB' => ''],
|
|
'huoshan' => ['DEF' => 'default', 'CT' => 'telecom', 'CU' => 'unicom', 'CM' => 'mobile', 'AB' => 'oversea'],
|
|
'baidu' => ['DEF' => 'default', 'CT' => 'ct', 'CU' => 'cnc', 'CM' => 'cmnet', 'AB' => ''],
|
|
'jdcloud' => ['DEF' => '-1', 'CT' => '1', 'CU' => '2', 'CM' => '3', 'AB' => '4'],
|
|
'bt' => ['DEF' => '0', 'CT' => '285344768', 'CU' => '285345792', 'CM' => '285346816'],
|
|
'qingcloud' => ['DEF' => '0', 'CT' => '2', 'CU' => '3', 'CM' => '4', 'AB' => '8'],
|
|
'cloudflare' => ['DEF' => '0'],
|
|
'namesilo' => ['DEF' => 'default'],
|
|
'powerdns' => ['DEF' => 'default'],
|
|
'spaceship' => ['DEF' => 'default'],
|
|
'aliyunesa' => ['DEF' => '0'],
|
|
'tencenteo' => ['DEF' => 'Default'],
|
|
];
|
|
|
|
public static function getList()
|
|
{
|
|
return self::$dns_config;
|
|
}
|
|
|
|
private static function getConfig($aid)
|
|
{
|
|
$account = Db::name('account')->where('id', $aid)->find();
|
|
if (!$account) return false;
|
|
return $account;
|
|
}
|
|
|
|
/**
|
|
* @return DnsInterface|bool
|
|
*/
|
|
public static function getModel($aid, $domain = null, $domainid = null)
|
|
{
|
|
$account = self::getConfig($aid);
|
|
if (!$account) return false;
|
|
$dnstype = $account['type'];
|
|
$class = "\\app\\lib\\dns\\{$dnstype}";
|
|
if (class_exists($class)) {
|
|
$config = json_decode($account['config'], true);
|
|
$config['domain'] = $domain;
|
|
$config['domainid'] = $domainid;
|
|
$model = new $class($config);
|
|
return $model;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @return DnsInterface|bool
|
|
*/
|
|
public static function getModel2($account)
|
|
{
|
|
$dnstype = $account['type'];
|
|
$class = "\\app\\lib\\dns\\{$dnstype}";
|
|
if (class_exists($class)) {
|
|
$config = json_decode($account['config'], true);
|
|
$config['domain'] = $account['name'];
|
|
$config['domainid'] = $account['thirdid'];
|
|
$model = new $class($config);
|
|
return $model;
|
|
}
|
|
return false;
|
|
}
|
|
}
|