yswery/dns

纯PHP实现的DNS服务器。

v1.4.1 2020-03-13 21:06 UTC

This package is not auto-updated.

Last update: 2024-09-26 21:05:46 UTC


README

Build Status Coverage Status Scrutinizer Code Quality

PHP DNS服务器

这是一个用纯PHP编写的权威DNS服务器。它将监听默认端口(默认:端口53)并对其具有DNS记录的任何域提供答案。这个类可以用来根据现有的PHP代码动态提供DNS响应。

要求

  • PHP 7.2+
  • 需要加载 socketssocket_create PHP扩展(默认情况下已加载)

示例

以下是DNS服务器使用示例

require_once __DIR__.'/../vendor/autoload.php';

// JsonResolver created and provided with path to file with json dns records
$jsonResolver = new yswery\DNS\Resolver\JsonResolver([
    '/path/to/zones/example.com.json',
    '/path/to/zone/test.com.json',
]);

// System resolver acting as a fallback to the JsonResolver
$systemResolver = new yswery\DNS\Resolver\SystemResolver();

// StackableResolver will try each resolver in order and return the first match
$stackableResolver = new yswery\DNS\Resolver\StackableResolver([$jsonResolver, $systemResolver]);

// Create the eventDispatcher and add the event subscribers
$eventDispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
$eventDispatcher->addSubscriber(new \yswery\DNS\Event\Subscriber\EchoLogger());

// Create a new instance of Server class
$server = new yswery\DNS\Server($stackableResolver, $eventDispatcher);

// Start DNS server
$server->start();

运行示例

  • 运行 composer install 以安装依赖项
  • 运行 php example/example.php 以运行服务器

使用 dig 命令查询服务器以确保其正常运行

$ dig @127.0.0.1 test.com A +short
111.111.111.111

$ dig @127.0.0.1 test.com TXT +short
"Some text."

$ dig @127.0.0.1 test2.com A +short
111.111.111.111
112.112.112.112

区域文件存储

PHP DNS服务器支持四种区域文件格式:Bind、JSON、XML和YAML;每种文件格式都有一个专门的 Resolver 类:分别为 BindResolverJsonResolverXmlResolverYamlResolver。示例文件位于 example/ 目录中。

JSON区域示例

{
  "domain": "example.com.",
  "default-ttl": 7200,
  "resource-records": [
    {
      "name": "@",
      "ttl": 10800,
      "type": "SOA",
      "class": "IN",
      "mname": "example.com.",
      "rname": "postmaster",
      "serial": 2,
      "refresh": 3600,
      "retry": 7200,
      "expire": 10800,
      "minimum": 3600
    }, {
      "type": "A",
      "address": "12.34.56.78"
    },{
      "type": "A",
      "address": "90.12.34.56"
    }, {
      "type": "AAAA",
      "address": "2001:acad:ad::32"
    }, {
      "name": "www",
      "type": "cname",
      "target": "@"
    }, {
      "name": "@",
      "type": "MX",
      "preference": 15,
      "exchange": "mail"
    }, {
      "name": "*.subdomain",
      "ttl": 3600,
      "type": "A",
      "address": "192.168.1.42"
    }
  ]
}

运行测试

提供使用PHPUnit的单元测试。一个简单的脚本位于根目录。

  • 运行 composer install 以安装PHPUnit和依赖项
  • 从根目录运行 vendor/bin/phpunit 以运行测试

构建 .phar

  • 运行 composer run-script build-server 以构建 phpdnsserver.phar 文件,输出在 bin 文件夹中。
  • 运行 composer run-script build-console 以构建 phpdnscli.phar 文件,输出在 bin 文件夹中。
  • 运行 composer run-script build-installer 以构建安装程序。安装程序目前对Windows的支持有限。

运行 .phar 文件

要运行新的 .phar 文件,从发行版中下载它们并将它们移动到所需的文件夹。

  • phpdnsserver.phar 用于运行 phpdnsserver,默认使用新的文件系统
  • phpdnscli.phar 用于运行命令行命令
  • phpdnsinstaller.phar 作为root创建所需的文件夹和默认配置

支持的命令行选项

  • --bind:b - 绑定到特定IP。默认使用 0.0.0.0
  • --port:p - 绑定到特定端口。默认使用端口 53
  • --config:c - 指定配置文件。在Windows上默认使用 phpdns.json,在Unix系统上默认使用 /etc/phpdns.json
  • --storage:s - 指定区域和日志的存储路径。在Unix上默认使用 /etc/phpdnsserver,在Windows上默认使用当前工作目录

支持的记录类型

  • A
  • NS
  • CNAME
  • SOA
  • PTR
  • MX
  • TXT
  • AAAA
  • AXFR
  • ANY
  • SRV

许可证

MIT许可(MIT)

版权所有(c)2016-2017 Yif Swery

特此授予任何获得此软件及其相关文档副本(“软件”)的人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许提供软件的人使用软件,但受以下条件的约束

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论该责任是基于合同、侵权或其他方式,无论该责任产生于、源于或与软件或软件的使用或其他方式有关。