Cómo realizar consultas DNS desde PHP

Dificultad: Intermedio
Tiempo de Lectura: 3 minutos

Hoy vamos a ver cómo hacer consultas dns desde PHP, pero primero es conveiente hacer un repaso sobre lo que es el DNS. El Domain Name System lo que comúnmente conocemos como DNS cumplen un papel muy importante para que los dominios puedan ser accesibles a la web, sin ellos un dominio no se podría ver en internet y solo serviría para trabajar haciendo pruebas a través de nuestro archivo hosts.

Este «Sistema de Nombre de Dominio» se utiliza para resolver los nombres de los dominio y convertirlo de tal manera que sean leído por un computador y así ubicarlo desde cualquier parte del mundo, es como la identidad del dominio, como mencionamos al principio, el DNS es la parte esencial del internet.

Cómo realizar Consultas DNS desde PHP

En los sistemas a veces se necesita identificar estos registros (depende de que sistemas estés desarrollando), por lo que hay varias maneras de consultarlos y obtener su informacion. En esta ocasión mencionaremos como hacerlo desde PHP.

Actualmente existen varias funciones de php que nos ayudan con esta tarea, algunas de las que podemos mencionar serian:

 dns_get_record()

Esta función te devuelve un arreglo completo de los registros que puedes manipular con el DNS como por ejemplo el registro A, MX, NS, entre otras. Para probar esta función solo colocamos esto es nuestro archivo .php:

$dns = dns_get_record("guiadev.com");
 echo '<pre>';
 print_r($dns);
 echo '</pre>';

Con esto tendremos una salida como esta:

Array
(
 [0] => Array
 (
 [host] => guiadev.com
 [class] => IN
 [ttl] => 14365
 [type] => MX
 [pri] => 0
 [target] => mail.guiadev.com
 )
[1] => Array
 (
 [host] => guiadev.com
 [class] => IN
 [ttl] => 14365
 [type] => A
 [ip] => 104.250.125.79
 )

Pero si no es necesario obtener todos los registros y solo necesitamos consultar un solo registro como por ejemplo el registro mail exchanger (MX) se puede utilizar esta función:

getmxrr()

Con esta función solo obtendremos el registro MX del dominio, la puedes probar de la siguiente manera:

$dns = array();
 getmxrr("giadev.com", $dns);
 echo '<pre>';
 print_r($dns);
 echo '</pre>';

Tendrás una salida como esta:

Array
(
 [0] => mail.guiadev.com
)

Ahora, si el dominio tiene declarado mas de un registro MX como los de google por ejemplo, tendrás una salida como esta:

Array
(
 [0] => alt3.aspmx.l.google.com
 [1] => alt4.aspmx.l.google.com
 [2] => aspmx.l.google.com
 [3] => alt2.aspmx.l.google.com
 [4] => alt1.aspmx.l.google.com
)

Pero que pasa si solo queremos saber si un dominio tiene un registro de cualquier tipo en especifico?

 checkdnsrr()

Es una función que devuelve un valor booleano, su función es verificar si existe o no un registro de cualquier tipo que le pases como parámetro. Si verifica que el registro existe devuelve true de lo contrario devuelve false, veamos un ejemplo:

$dns = checkdnsrr( 'guiadev.com' , 'TXT' );
echo $dns;

Este ejemplo devuelve un valor «false» porque nuestro dominio «guiadev.com» no cuenta por ahora con un registro «TXT». Esta función es muy sencilla de utilizar y es perfecta si quieres hacer alguna validación sin importar el detalle sino su existencia.

Pero estas no son las únicas funciones para consultar los registros DNS, en la pagina oficial de php puedes encontrar otras funciones que puedes adaptarlas para lo que desees.

Es importante tener en cuenta que algunas de estas funciones necesita utilizar otra función de php como “exec”. Esta función deja vulnerable la seguridad del servidor en caso del algún malware o hackeo hacia tu pagina.

Sin embargo, para evitar utilizar esta función (exec) existe una librería llamada Net-Dns. Esta librería esta desarrollada en perl y funciona como un DNS y permite a lo programadores tener mas detalles y mas opciones que la que te ofrece las mismas funciones de php.

Para probar esta librería lo hacemos de esta manera:

$r = new \Net_DNS2_Resolver(array('nameservers' => array('8.8.8.8')));
$result = $r->query('guiadev.com', 'NS');
echo '<pre>';
 print_r($result->answer);
 echo '</pre>';

Tendremos una salida parecida a esto:

array:2 [▼
 0 => Net_DNS2_RR_NS {#181 ▼
 +nsdname: "ns2.infranetdns.com"
 +name: "guiadev.com"
 +type: "NS"
 +class: "IN"
 +ttl: 21063
 +rdlength: 18
 +rdata: b"\x03ns2\vinfranetdnsÀ\x14"
 }
 1 => Net_DNS2_RR_NS {#182 ▼
 +nsdname: "ns1.infranetdns.com"
 +name: "guiadev.com"
 +type: "NS"
 +class: "IN"
 +ttl: 21063
 +rdlength: 6
 +rdata: b"\x03ns1À-"
 }
]

En conclusión los registros DNS son una pieza fundamental del internet y podemos utilizar varias maneras de ejecutar, consultar y obtener cualquiera de sus registros para nuestros proyectos en php. En base a estos ejemplos podrás hacer consultas DNS desde PHP sin mayor dificultad.

Y si por alguna razón el servidor dns no responde como debe y necesitas chequear la propagación DNS desde todo el mundo luego de alterar el DNS desde PHP, lo mejor es usar sitios como DNS Propagation, que te muestran como se propagan tus DNS desde todo el mundo.


¿Te resultó útil el artículo? Compártelo con tus colegas: