From e6c19f90a14d4b7ef69305b6441889bea545bbce Mon Sep 17 00:00:00 2001 From: Enoch Date: Mon, 29 Jan 2024 17:20:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0dns.php=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3googleDNS=E3=80=81CloudFlareDNS?= =?UTF-8?q?=E7=AD=89dns=E9=80=92=E5=BD=92=E6=97=B6=E6=90=BA=E5=B8=A6DNSSEC?= =?UTF-8?q?=E5=90=8E=E6=97=A0=E6=B3=95=E8=A7=A3=E6=9E=90=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 6 ++++- src/resource/Dns.php | 53 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 269cc2c..06edb48 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,7 @@ # Webman DNS Webman的DNS服务器插件,可以实现Webman启动时运行一个DNS服务器 +请不要用于生产环境。 > 注意:默认为udp53端口,需要ROOT权限 @@ -26,6 +27,8 @@ Webman的DNS服务器插件,可以实现Webman启动时运行一个DNS服务 ## 安装 +在确保已经安装webman后执行 + ```shell composer require laysense/dns ``` @@ -96,7 +99,8 @@ class DnsController } ``` -具体的使用方式请参照 [Workerman-DNS](https://www.workerman.net/a/1439) ([Github](https://github.com/ywnsya/workerman-dns)) 下的start.php +具体的使用方式请参照 [Workerman-DNS](https://git.laysense.com/enoch/Workerman-DNS) ([Github](https://github.com/ywnsya/workerman-dns)) 下的start.php + ## 赞助(我不要脸) diff --git a/src/resource/Dns.php b/src/resource/Dns.php index f44ee5d..134c880 100644 --- a/src/resource/Dns.php +++ b/src/resource/Dns.php @@ -369,8 +369,11 @@ class Dns */ public static function decode($buffer) { + /** $data=bin2hex($buffer); + echo $data; $id=substr($data,0,4); + $flag=substr($data,5,4); $type=substr($data,-8,4); switch($type){ case '0001': @@ -410,8 +413,58 @@ class Dns } $realname=substr($realname,1,-1); $query=substr($data,24); + ***/ #$returndata="$type".'|||'."$realname"; + $data=bin2hex($buffer); + $id=substr($data,0,4); +$flag=substr($data,4,4); +$questions=substr($data,8,4); +$answerRRs=substr($data,12,4); +$authorityRRs=substr($data,16,4); +$additionalRRs=substr($data,20,4); +$startbyte=24; +$dlen=substr($data,$startbyte,2); +$startbyte=26; +$i=1; +while($dlen!='00'){ +$domain[$i]=hex2bin(substr($data,$startbyte,hexdec($dlen)*2)); +$startbyte=$startbyte+(hexdec($dlen)*2); +$dlen=substr($data,$startbyte,2); +$startbyte=$startbyte+2; +$i++; +} +$realname=join(".",$domain); +$type=substr($data,$startbyte,4); +switch($type){ + case '0001': + $type='A'; + break; + case '0002': + $type='NS'; + break; + case '000c': + $type='PTR'; + break; + case '0006': + $type='SOA'; + break; + case '001c': + $type='AAAA'; + break; + case '0005': + $type='CNAME'; + break; + case '0010': + $type='TEXT'; + break; + case '000f': + $type='MX'; + break; +} +$query=substr($data,24,$startbyte-16); + + $returndata= json_encode(array('type' => $type, 'name' => "$realname", 'id'=>"$id", 'query'=>"$query")); return $returndata;