相關(guān):Webman插件
composer require laysense/dns
#注:這是webman用的不是workerman用的
截圖
Workerman的DNS協(xié)議,實(shí)現(xiàn)了簡(jiǎn)單的DNS協(xié)議解析和響應(yīng),通過(guò)本協(xié)議支持,您可以利用Workerman實(shí)現(xiàn)基于PHP的Dns服務(wù)器
目前支持以下DNS類型:
本倉(cāng)庫(kù)內(nèi)vendor文件夾為Workerman 您可以刪除,
直接將本倉(cāng)庫(kù)根目錄下的 Dns.php 放置到您的Workerman項(xiàng)目中的 /vendor/workerman/workerman/Protocols 目錄下
詳見start.php 文件
注意:使用53端口需要root權(quán)限
<?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';
$worker->onMessage = function($connection, $data){
$data=json_decode($data);
$type=$data->type; #查詢類型
$name=$data->name; #查詢內(nèi)容(一般是域名,PTR時(shí)為倒序IP)
$rip=$connection->getRemoteIp(); #客戶端IP
#輸出信息
echo "\n Type:$type \n Domain: $name\n Client IP: $rip \n";
}
$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();
見start.php 內(nèi)有所有記錄類型的響應(yīng)方式
您應(yīng)當(dāng)通過(guò)獲取query的 $name
通過(guò)查詢數(shù)據(jù)庫(kù)等方式返回?cái)?shù)據(jù),對(duì)于不存在的記錄應(yīng)當(dāng)返回SOA記錄
您需要的時(shí)候可以通過(guò) dns_get_record()
向上級(jí)DNS遞歸查找并緩存
這一系列操作,本協(xié)議不提供,您可以自行通過(guò)Redis等并利用workerman實(shí)現(xiàn)
不建議作為根域名的NS服務(wù)器使用 (如果作為必須提供自定義SOA)。
本協(xié)議最早寫于鄙人剛學(xué)習(xí)php的階段,現(xiàn)在翻出來(lái)無(wú)疑是屎山一坨,代碼寫的和xxs一樣,性能不敢測(cè)試,還請(qǐng)各位大佬包容
目前已知問(wèn)題是:
域名不存在時(shí)可能出現(xiàn)BUG
如果有空,可以開發(fā)一個(gè) ssh server偽服務(wù)端, go就有這個(gè)包。 可以自定義控制 ssh client發(fā)來(lái)的消息 和返回