reactphp / dns

Async DNS resolver for ReactPHP.

Home Page:https://reactphp.org/dns/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Connection to DNS server lost

deepika-maj opened this issue · comments

I am trying to get all the records for a domain with actual TTL value from authoritative DNS server (something like DNS_ALL but with authoritative TTL value). This seems to work until I got RuntimeException with "Connection to DNS server lost".

Below are sample code and error message:

<?php

use React\Dns\Model\Message;
use React\Dns\Query\Query;
use React\Dns\Query\TcpTransportExecutor;

require './vendor/autoload.php';

$dnsRecords = [];

$domain = 'cloudflare.com';
$authNameServerIP = '162.159.0.33';
//$authNameServerIP = '162.159.1.33';
//$authNameServerIP = '162.159.2.9';
//$authNameServerIP = '162.159.3.11';
//$authNameServerIP = '162.159.4.8';

$loop = \React\EventLoop\Factory::create();
$executor = new TcpTransportExecutor($authNameServerIP, $loop);

$reflector = new \ReflectionClass(Message::class);
$typeConstants = $reflector->getReflectionConstants();

foreach ($typeConstants as $typeConstant) {
    if ($typeConstant->getName() == 'TYPE_ANY' || strpos($typeConstant->getName(), 'TYPE_') !== 0) {
        continue;
    }

    $query = new Query($domain, $typeConstant->getValue(), Message::CLASS_IN);
    $executor->query($query)->then(function (Message $message) use (&$dnsRecords) {
        foreach ($message->answers as $answer) {
            $dnsRecords[] = [
                'type' => $answer->type,
                'ttl' => $answer->ttl,
                'data' => $answer->data
            ];
        }
    }, 'printf');
}

$loop->run();

print PHP_EOL;
var_export($dnsRecords);
print PHP_EOL;

and below is the output:

RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}RuntimeException: DNS query for cloudflare.com failed: Connection to DNS server lost in /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php:327
Stack trace:
#0 /PATH-REDACTED/vendor/react/dns/src/Query/TcpTransportExecutor.php(259): React\Dns\Query\TcpTransportExecutor->closeError('Connection to D...')
#1 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(244): React\Dns\Query\TcpTransportExecutor->handleRead(Resource id #25)
#2 /PATH-REDACTED/vendor/react/event-loop/src/StreamSelectLoop.php(211): React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#3 /PATH-REDACTED/test.php(41): React\EventLoop\StreamSelectLoop->run()
#4 {main}
array (
  0 => 
  array (
    'type' => 1,
    'ttl' => 300,
    'data' => '198.41.215.162',
  ),
  1 => 
  array (
    'type' => 1,
    'ttl' => 300,
    'data' => '198.41.214.162',
  ),
)

@deepika-maj Thanks for this excellent question!

It looks like you're hitting a rate limiting by the given DNS server (Cloudflare). You should probably introduce a small delay between sending your queries or distribute them over a larger set of DNS servers. Perhaps https://github.com/clue/reactphp-mq may help you with limiting concurrency.

What is happening here is the first query will create a connection to send the query message. All further queries will be appended to the same connection (connection reuse) to avoid creating too many connections at once. The server seems to not like seeing these many queries in a short time frame and appears to close the connection after replying to the first query.

I hope this helps 👍