前言:
用花生壳很长时间了,但是发现这两年越来越不好用了。
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. 根据你的情况选择 二级 还是 三级 域名
| 主机记录 | 记录类型 | 记录值 | 备注 |
| d | A | xx.xx.xx.xx 你的服务器ip地址 | 三级方式 |
| d | NS | 你的域名:如 j64.cn | 三级方式 |
| * | A | xx.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/coredns
2. 编辑配置文件/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] Description=CoreDNS DNS Server After=network.target:ml-citation{ref="20,22" appearance="aggregated" data="citationList"} [Service] ExecStart=/usr/local/bin/coredns -conf /etc/coredns/Corefile Restart=on-failure User=root [Install] WantedBy=multi-user.target2. 启动服务:
sudo systemctl daemon-reload && sudo systemctl enable coredns && sudo systemctl start coredns
五、使用方法:
http://ddns.j64.cn/ph/update.php?token=token&hostname=主机名&myip=IP地址
token :token 作为验证字符,可以自己修改
主机名:你设置的比如:xx.d.j64.cn
IP地址:可以不填,会自动用自己当前的地址