shiniv / dns
一个基于RFC1035创建DNS区域文件的PHP库
v0.25
2021-06-11 04:59 UTC
Requires
- php: ^7.3 || ^8.0
- christian-riesen/base32: ^1.5.2
- rlanvin/php-ip: 3.0.0-rc1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^9.0
README
本项目旨在创建DNS记录的抽象对象表示,以PHP实现。项目包括代表DNS对象的各种类(例如 Zone
,ResourceRecord
和各种 RData
类型),一个将BIND风格文本文件转换为PHP对象的解析器,以及用于创建美观的BIND记录的构建器。
该库可以解析和编码DNS消息,使开发者能够使用纯PHP创建DNS客户端/服务器平台。
构建状态
内容
示例用法
require_once '/path/to/vendor/autoload.php'; use Badcow\DNS\Classes; use Badcow\DNS\Zone; use Badcow\DNS\Rdata\Factory; use Badcow\DNS\ResourceRecord; use Badcow\DNS\AlignedBuilder; $zone = new Zone('example.com.'); $zone->setDefaultTtl(3600); $soa = new ResourceRecord; $soa->setName('@'); $soa->setClass(Classes::INTERNET); $soa->setRdata(Factory::Soa( 'example.com.', 'post.example.com.', '2014110501', 3600, 14400, 604800, 3600 )); $ns1 = new ResourceRecord; $ns1->setName('@'); $ns1->setClass(Classes::INTERNET); $ns1->setRdata(Factory::Ns('ns1.nameserver.com.')); $ns2 = new ResourceRecord; $ns2->setName('@'); $ns2->setClass(Classes::INTERNET); $ns2->setRdata(Factory::Ns('ns2.nameserver.com.')); $a = new ResourceRecord; $a->setName('sub.domain'); $a->setRdata(Factory::A('192.168.1.42')); $a->setComment('This is a local ip.'); $a6 = new ResourceRecord; $a6->setName('ipv6.domain'); $a6->setRdata(Factory::Aaaa('::1')); $a6->setComment('This is an IPv6 domain.'); $mx1 = new ResourceRecord; $mx1->setName('@'); $mx1->setRdata(Factory::Mx(10, 'mail-gw1.example.net.')); $mx2 = new ResourceRecord; $mx2->setName('@'); $mx2->setRdata(Factory::Mx(20, 'mail-gw2.example.net.')); $mx3 = new ResourceRecord; $mx3->setName('@'); $mx3->setRdata(Factory::Mx(30, 'mail-gw3.example.net.')); $zone->addResourceRecord($soa); $zone->addResourceRecord($mx2); $zone->addResourceRecord($ns1); $zone->addResourceRecord($mx3); $zone->addResourceRecord($a); $zone->addResourceRecord($a6); $zone->addResourceRecord($ns2); $zone->addResourceRecord($mx1); $builder = new AlignedBuilder(); echo $builder->build($zone);
输出
$ORIGIN example.com. $TTL 3600 @ IN SOA ( example.com. ; MNAME post.example.com. ; RNAME 2014110501 ; SERIAL 3600 ; REFRESH 14400 ; RETRY 604800 ; EXPIRE 3600 ; MINIMUM ) ; NS RECORDS @ IN NS ns1.nameserver.com. @ IN NS ns2.nameserver.com. ; A RECORDS sub.domain A 192.168.1.42; This is a local ip. ; AAAA RECORDS ipv6.domain AAAA ::1; This is an IPv6 domain. ; MX RECORDS @ MX 10 mail-gw1.example.net. @ MX 20 mail-gw2.example.net. @ MX 30 mail-gw3.example.net.
以上是 AlignedBuilder
的示例,它创建的记录更加美观。您也可以使用平铺的 ZoneBuilder
,其输出如下
... echo ZoneBuilder::build($zone);
$ORIGIN example.com. $TTL 3600 @ IN SOA example.com. post.example.com. 2014110501 3600 14400 604800 3600 @ MX 20 mail-gw2.example.net. @ IN NS ns1.nameserver.com. @ MX 30 mail-gw3.example.net. sub.domain A 192.168.1.42; This is a local ip. ipv6.domain AAAA ::1; This is an IPv6 domain. @ IN NS ns2.nameserver.com. @ MX 10 mail-gw1.example.net.
支持类型
所有通用DNS类型都受到支持。有关支持类型的完整详情,请参阅文档。
解析BIND记录
可以使用 Badcow\DNS\Parser\Parser
将BIND记录解析为PHP对象
$file = file_get_contents('/path/to/example.com.txt'); $zone = Badcow\DNS\Parser\Parser::parse('example.com.', $file); //Badcow Zone Object
就这么简单。
更多示例可以在文档中找到