我有服务器之——自建DDNS
前言用花生壳很长时间了但是发现这两年越来越不好用了。1. 时不时的会解析到 127.0.0.2 上问客服说技术问题升级收费会好一些2. 响应慢更换ip地址后提交变更好久好久才能解析过来期间要不断在cmd里 ipconfig /flushdns 刷新然后ping 耽误事3. 之前的壳域名到期不让用了新的壳域名注册不下来合着就必须得买咯4. 登录要扫码要验证说原密码不安全等等就是不让好好登录5. 不时打电话推销一波他们的收费服务……艾玛这可不能忍了我就用你个DDNS服务你给我整这么多幺蛾子搞得我客户三天两头问我系统咋又访问不了了尤其是早上10点左右正是睡觉的好时候突然一个电话咋连不上ERP了咋打不开系统了不厌其烦。于是我想到我不是有域名和服务器嘛干嘛受这鸟气自己搭一套不就结了于是开始查资料、找方案受益于Ai的巨大能力还真让我给搞出来了以下是基本步骤说难不难一下午搞定。需要用到的文件https://download.csdn.net/download/hsnet/93170831步骤如下1. 准备域名、云服务器宝塔系统没有的去看看 使用阿里云服务器搭建网站环境 里的方法搞一个。2. 域名新增两条解析3. 服务器安装coredns 并配置4. 写个php脚本做好伪静态。一、域名解析1. 域名最好短一些的3个字母数字混拼的cn域名就不错挑个好记的2. 在解析后台新增一个 A 记录将一个域名解析到你的服务器域名可以是二级也可以是三级我这里用的三级3. 根据你的情况选择 二级 还是 三级 域名主机记录记录类型记录值备注dAxx.xx.xx.xx 你的服务器ip地址三级方式dNS你的域名如 j64.cn三级方式*Axx.xx.xx.xx 你的服务器ip地址二级方式可选*NS你的域名如 j64.cn二级方式可选二、建立网站1. 在宝塔中建立网站 ddns.j64.cn这里改成你自己的域名选 php8 及以上。2. 在根目录中建立文件hosts.conf 用于保存解析记录3. 建立目录ph 在 ph 目录建立 update.php 文件这里用这个是为了兼容花生壳4. 编写如下文件内容?php // 配置区 $hosts_file /www/wwwroot/ddns.j64.cn/hosts.conf; // 访问密钥 $access_token token; $input_token $_GET[token] ?? ; // // 1. 鉴权校验 token if ($input_token ! $access_token false) { exit(json_encode([ code 403, msg 访问令牌错误拒绝操作 ], JSON_UNESCAPED_UNICODE)); } // 2. 获取请求参数 $input_myip trim($_GET[myip] ?? ); $hostname trim($_GET[hostname] ?? ); // 3. hostname 非空校验 if (empty($hostname)) { exit(nohost); } // 4. 处理IP有传入则校验无传入取客户端真实IP if ($input_myip ! ) { // 校验传入IP是否合法IPv4 if (!filter_var($input_myip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { exit(iperr1); } $target_ip $input_myip; } else { // 自动获取客户端真实IP兼容反向代理 if (isset($_SERVER[HTTP_X_FORWARDED_FOR]) !empty($_SERVER[HTTP_X_FORWARDED_FOR])) { $ip_arr explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]); $target_ip trim($ip_arr[0]); } elseif (isset($_SERVER[HTTP_REAL_IP]) !empty($_SERVER[HTTP_REAL_IP])) { $target_ip trim($_SERVER[HTTP_REAL_IP]); } else { $target_ip $_SERVER[REMOTE_ADDR]; } // 校验自动获取的IP合法性 if (!filter_var($target_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { exit(iperr2); } } // 5. 读取 hosts.conf 文件内容 $file_content ; $old_line_ip ; $file_exists file_exists($hosts_file); if ($file_exists) { $file_content file_get_contents($hosts_file); if ($file_content false) { exit(fileerr); } // 正则匹配当前hostname对应的旧IP $pattern /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s . preg_quote($hostname, /) . $/m; if (preg_match($pattern, $file_content, $match)) { $old_line_ip $match[1]; } } // 6. 判断IP无变化直接退出不修改文件、不重载服务 if ($old_line_ip $target_ip) { exit(nochg); } // 7. 替换/新增hostname对应的IP行 $lines explode(PHP_EOL, $file_content); $found_match false; $new_lines []; foreach ($lines as $line) { $trim_line trim($line); // 匹配当前主机名的旧行替换IP if (preg_match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s . preg_quote($hostname, /) . $/, $trim_line)) { $new_lines[] $target_ip . . $hostname; $found_match true; } else { // 保留其他原有行不变 $new_lines[] $line; } } // 文件内无此hostname则追加新行 if (!$found_match) { $new_lines[] $target_ip . . $hostname; } // 组装新文件内容 $new_file_content implode(PHP_EOL, $new_lines); // 写入 hosts.conf $write_result file_put_contents($hosts_file, $new_file_content); if ($write_result false) { exit(fileerr2); } // 返回更新成功信息 exit(good);5. 需要兼容花生壳的还可以加上重写规则rewrite ^/ph/update$ /ph/update.php last;三、安装配置1. 打开 linux 终端输入下面命令#在终端中使用 下载coredns wget https://github.com/coredns/coredns/releases/download/v1.11.3/coredns_1.11.3_linux_amd64.tgz #在终端中解压程序 tar xzvf coredns_*.tgz sudo mv coredns /usr/local/bin/ #创建目录 sudo mkdir -p /etc/coredns2. 编辑配置文件/etc/coredns/Corefile 内容.:53 { log # 打印所有DNS请求日志 errors # 输出解析错误 reload 6s # 配置文件修改自动重载 cache 60 # 缓存解析结果60秒 loadbalance # A记录轮询负载均衡 hosts /www/wwwroot/ddns.j64.cn/hosts.conf { reload 6s ttl 300 fallthrough } forward . 223.5.5.5 223.6.6.6 { max_concurrent 1000 health_check 5s policy random } loop }四、安装服务1. 创建服务文件/etc/systemd/system/coredns.service[Unit] DescriptionCoreDNS DNS Server Afternetwork.target:ml-citation{ref20,22 appearanceaggregated datacitationList} [Service] ExecStart/usr/local/bin/coredns -conf /etc/coredns/Corefile Restarton-failure Userroot [Install] WantedBymulti-user.target2. 启动服务sudo systemctl daemon-reload sudo systemctl enable coredns sudo systemctl start coredns五、使用方法http://ddns.j64.cn/ph/update.php?tokentokenhostname主机名myipIP地址token token 作为验证字符可以自己修改主机名你设置的比如xx.d.j64.cnIP地址可以不填会自动用自己当前的地址