Workerman DNS协议

EchoNoch

先上仓库:
Repo
Github


相关:Webman插件

Webman插件市场

Repo

composer require laysense/dns
#注:这是webman用的不是workerman用的

截图

截图


Workerman-DNS

Workerman的DNS协议,实现了简单的DNS协议解析和响应,通过本协议支持,您可以利用Workerman实现基于PHP的Dns服务器

您既可以实现递归服务器,进行DNS优化、加速、抗污染

也可以作为权威服务器,进行任意的DNS响应,甚至DNS优选,配合监控实现CDN和负载均衡

目前支持以下DNS类型:

  • A
  • AAAA
  • CNAME
  • SOA
  • PTR
  • MX
  • TXT

本仓库内vendor文件夹为Workerman 您可以删除,

直接将本仓库根目录下的 Dns.php 放置到您的Workerman项目中的 /vendor/workerman/workerman/Protocols 目录下


使用方式:

详见start.php 文件

注意:使用53端口需要root权限

1.监听端口

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/php-ipv6.php'; #IPv6支持
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('Dns://0.0.0.0:53');
$worker->transport = 'udp';

2.获取查询内容

$worker->onMessage = function($connection, $data){
$data=json_decode($data);
$type=$data->type; #查询类型
$name=$data->name; #查询内容(一般是域名,PTR时为倒序IP)
$rip=$connection->getRemoteIp(); #客户端IP

#输出信息
echo "\n Type:$type \n Domain: $name\n Client IP: $rip \n";

}

3.响应A记录

$worker->onMessage = function($connection, $data){

$send['type']='A';
$send['detail'][1]='119.29.29.29';  #第一条记录
$send['detail'][2]='8.8.8.8';       #第二条记录
$send['ttl']=30;

#id和query一般情况下直接返回输出即可
$send['id']=$data->id;
$send['query']=$data->query;

$send=json_encode($send);
$connection->send($send);

};
Worker::runAll();

4.响应其他记录

见start.php 内有所有记录类型的响应方式

5.说明

您应当通过获取query的 $name通过查询数据库等方式返回数据,对于不存在的记录应当返回SOA记录

您需要的时候可以通过 dns_get_record()向上级DNS递归查找并缓存

这一系列操作,本协议不提供,您可以自行通过Redis等并利用workerman实现

不建议作为根域名的NS服务器使用 (如果作为必须提供自定义SOA)。

已知问题

本协议最早写于鄙人刚学习php的阶段,现在翻出来无疑是屎山一坨,代码写的和xxs一样,性能不敢测试,还请各位大佬包容

目前已知问题是:

域名不存在时可能出现BUG

403 4 0
4个评论

Tinywan

直接写个webman的插件

aria

有计划开发支持动态IP的功能吗?

  • adminv 2022-12-22

    完全可以自己实现,这算业务层了,他已经给你提供了协议层,过度分装 其他人会不好

  • EchoNoch 2022-12-22

    如果想实现的是ddns,直接给一个子域名开ns,然后自己php去curl一个ip接口,自己实现下就行了

adminv

如果有空,可以开发一个 ssh server伪服务端, go就有这个包。 可以自定义控制 ssh client发来的消息 和返回

  • EchoNoch 2022-12-22

    这个我想过来着,可以做蜜罐之类的好玩的东西,回头有空研究下

  • EchoNoch 2022-12-22

    好吧浅看了下ssh协议的加密实现部分太复杂了(github上面好像有一个开源的php原生实现)

  • adminv 2022-12-25

    所以,拿过来改到workerman试试

王八念经

这东西是干啥用的,没接触过

EchoNoch

260
积分
0
获赞数
0
粉丝数
2022-04-29 加入
🔝