前言:
用花生壳很长时间了,但是发现这两年越来越不好用了。
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. 准备域名、云服务器(宝塔系统),没有的去看看 https://xs5k.com/?id=6 里的方法搞一个。
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地址:可以不填,会自动用自己当前的地址
实在下载不了,备用下载链接: http://www.xs5k.com/ddns_files.7z
豫公网安备41077102000127号