Page 1 sur 1

Comment se passer de DNS

Posté : 14 févr. 2015, 22:26
par leiopar
Bonsoir

J'ai une question pour un dev en cour :
comment obtenir à un instant "T" les informations DNS d'une URL de facon à pouvoir recharger le site, plus tard même si les DNS ne réponde plus ?

J'ai trouvé ça :
http://php.mesexemples.com/reseaux/exem ... on-de-dns/
Mais aucun exemple ne marche de façon réversible.

Par exemple :

$resultat = gethostbyname("www.yahoo.fr");
echo "IP = $resultat<br/>";

retourne :

IP = 188.125.73.108

Mais si je rentre ça dans la barre d'adresse de mon navigateur, ca me renvoi vers une page d'erreur, du bon domaine certes, mais... pas vers la page de départ...

Le but et de faire en sorte qu'un site web "Alpha" prenne périodiquement des informations sur un site "Beta".
Mais si pour une raison quelconque le DNS ne répond plus pour l'URL du site "Beta" (panne de tous les DNS de la terre, DNS menteur, DNS contraint juridiquement...) je veux que le site "Alpha" puisse tout de même trouver les info du site "Beta" en utilisant des information DNS enregistré préalablement.

Bref de rendre mon système résilient au "pannes" DNS, ceci en full PHP car mon scripte et moi n'auront pas forcément accès à la configuration du serveur...

Avez-vous une solution sous le coude ?

Re: Comment se passer de DNS

Posté : 14 févr. 2015, 23:02
par tof73
pas possible à mon avis, en php seul; sauf à ce que le site visé soit accessible aussi par une ip.

Re: Comment se passer de DNS

Posté : 15 févr. 2015, 00:04
par @rthur
Si je résume, tu as une url à appeler de la forme http://www.domaine.com/page.php que tu souhaites appeler en forçant l'IP (par exemple 123.456.789.0) que tu aurais enregistrée préalablement pour parer les pannes/erreurs/blocage de DNS, c'est bien ça ?

Pour récupérer l'IP, pas de problème je pense vu que la page que tu as indiquée te donne le bon code.


Ensuite pour pouvoir accéder à ce site alors que le DNS ne renvoie pas la bonne IP :
- soit tu modifies le fichier hosts de ta machine/serveur en ajoutant la ligne suivante

Code : Tout sélectionner

www.domaine.com 123.456.789.0
Et ensuite, via un navigateur tu pourras accéder au site en tapant son domaine normalement.
- soit en PHP, avec CURL, tu peut interroger l'IP du serveur mais en précisant le domaine. Voici le bout de code pour le faire :
$header = array
(
    "Host: http://www.domaine.com", // IMPORTANT
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3",
    "Accept-Encoding: gzip,deflate,sdch",
    "Accept-Language: fr-FR,it;q=0.8,en-US;q=0.6,en;q=0.4",
    "Cache-Control: max-age=0",
    "Connection: keep-alive",
);

curl_setopt($this->ch, CURLOPT_URL, 'http://123.456.789.0/page.php');
curl_setopt($this->ch, CURLOPT_HTTPHEADER, $header);

Re: Comment se passer de DNS

Posté : 15 févr. 2015, 05:36
par leiopar
Si je résume, tu as une url à appeler de la forme http://www.domaine.com/page.php que tu souhaites appeler en forçant l'IP (par exemple 123.456.789.0) que tu aurais enregistrée préalablement pour parer les pannes/erreurs/blocage de DNS, c'est bien ça ?
Oui, c'est l'idée.
Mais mon but n'est pas de garder le lien "à tout prix" mais "un peu plus longtemps si possible".
Il est de toute façon prévu de faire des sauvegardes de "Béta" sur "Alpha" et que "Alpha" soit informer qu'il y a aussi une potentiel sauvegarde sur "Gama"...
Je cherche un peu de résilience, je n’espère pas un bouclier magique :wink:
Pour récupérer l'IP, pas de problème je pense vu que la page que tu as indiquée te donne le bon code.
Ensuite pour pouvoir accéder à ce site alors que le DNS ne renvoie pas la bonne IP :
- soit tu modifies le fichier hosts de ta machine/serveur en ajoutant la ligne suivante

Code : Tout sélectionner

www.domaine.com 123.456.789.0
Ça, ça va poser un problème... comme dit tantôt, mon script ou moi n'aurons pas forcément la main sur les fichiers de configuration du serveur... je ne suis même pas sûr d'avoir l’extension "curl" systématiquement à disposition !
Et ensuite, via un navigateur tu pourras accéder au site en tapant son domaine normalement.
- soit en PHP, avec CURL, tu peut interroger l'IP du serveur mais en précisant le domaine. Voici le bout de code pour le faire :
$header = array
(
    "Host: http://www.domaine.com", // IMPORTANT
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3",
    "Accept-Encoding: gzip,deflate,sdch",
    "Accept-Language: fr-FR,it;q=0.8,en-US;q=0.6,en;q=0.4",
    "Cache-Control: max-age=0",
    "Connection: keep-alive",
);

curl_setopt($this->ch, CURLOPT_URL, 'http://123.456.789.0/page.php');
curl_setopt($this->ch, CURLOPT_HTTPHEADER, $header);
Mais je vais tout de même de documenter sur "Curl"...

Pourrais tu me réécrire ton exemple avec cette url s'il te plaît ? : http://www.agendadulibre.org/ical.php?region=22
Ceci afin de mieux comprendre ce qui doit être renseigné...

Re: Comment se passer de DNS

Posté : 15 févr. 2015, 06:15
par leiopar
bon...

Pour tenter de répondre à ma propre question, j'ai bricolé un peu le code précédant :
<?php

// l'url à traiter
$url="http://www.agendadulibre.org/ical.php?region=22";

$tab = parse_url($url); 
echo "scheme = " . $tab["scheme"] . "<BR>"; 
echo "host = " . $tab["host"] . "<BR>"; 
echo "path = " . $tab["path"] . "<BR>"; 
echo "query = " . $tab["query"] . "<BR>"; 
$ip= gethostbyname($tab["host"]); //l'ip...
echo "IP = " . $ip . "<BR>";
$url_ip=$tab["scheme"]."://".$ip."/".$tab["path"]."?".$tab["query"]; //remplacement du Host par l'ip corespondante (et sauvegardé au préalable)
echo "url/ip = " . $url_ip . "<HR>";
// du coup, là il me semble que j'ai un résultat exploitable non ?


$ips= gethostbynamel($tab["host"]); //les ip s'il y en à plusieur dans le DNS...
print_r($ips);
foreach($ips as $i){// liste des URL/IP possible...
	$url_ip=$tab["scheme"]."://".$i."/".$tab["path"]."?".$tab["query"];
	echo "url/ip = " . $url_ip . "<BR>";
}

// a partir de là, je ne comprends plus à quoi ca sert...
$header = array
(
    "Host: ".$tab["scheme"]."://".$tab["host"], // IMPORTANT
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3",
    "Accept-Encoding: gzip,deflate,sdch",
    "Accept-Language: fr-FR,it;q=0.8,en-US;q=0.6,en;q=0.4",
    "Cache-Control: max-age=0",
    "Connection: keep-alive",
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url_ip);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
?>
mais, du coup il y en a une bonne parti dont j'ignore l'utilité, notamment ce qui concerne "curl".
Quelqu"un peu il éclaircir ma lanterne ?

Re: Comment se passer de DNS

Posté : 15 févr. 2015, 10:41
par @rthur
Ça, ça va poser un problème... comme dit tantôt, mon script ou moi n'aurons pas forcément la main sur les fichiers de configuration du serveur... je ne suis même pas sûr d'avoir l’extension "curl" systématiquement à disposition !
Si l'extension curl n'est pas disponible, ça doit être faisable aussi avec fsockopen() et ses fonctions associées stream_socket_client() à chaque fois en forgeant l'IP dans la requête et en indiquant le domaine dans l'entête. Un exemple avec fsockopen pour s'inspirer.

mais, du coup il y en a une bonne parti dont j'ignore l'utilité, notamment ce qui concerne "curl".
Curl permet d'effectuer une requête où l'on peut préciser chaque paramètre.
Fais un Ctrl+Maj+i dans ton navigateur, va dans l'onglet Réseau et rafraichis la page, tu verras toutes les requêtes HTTP effectuées par ton navigateur et en cliquant dessus, tu verras les entêtes qui sont proches de l'exemple que je t'ai donné avec Curl.
L'idée avec Curl est de simuler une requête de navigateur donc il faut mettre les entêtes correspondantes.

Avant de l'assembler il faut déjà que tu fasses un essai sur 1 url avec 1 ip pour être sûr que ça fasse bien ce que tu veux.

Voici ci-dessous un exemple que je viens de faire sur thepiratebay.se qui est blacklisté chez les principaux FAI en France et donc dont le DNS renvoie 127.0.0.1 au lieu de sa véritable IP 104.28.4.42 :
<?php
$params = array('url' => 'https://104.28.4.42/index.php',
'host' => 'www.thepiratebay.se',
'header' => '',
'method' => 'GET', // 'POST','HEAD'
'referer' => '',
'cookie' => '',
'post_fields' => '', // 'var1=value&var2=value
'timeout' => 20
);

$requete=new CurlRequest;
$requete->init($params);
$result = $requete->exec();

var_dump($result);
// le code HTML de la page est dans $result['body']




/******** CLASS / FONCTIONS - A NE PAS MODIIFER ********/


class CurlRequest {
    private $ch;
    public function init($params)
    {
        $this->ch = curl_init();
        $user_agent = 'Mozilla/5.0 (Windows; U;
Windows NT 5.1; ru; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9';
        $header = array(
        "Accept: text/xml,application/xml,application/xhtml+xml,
text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
        "Accept-Language: FR-fr,fr;q=0.7,en-us;q=0.5,en;q=0.3",
        "Accept-Charset: windows-8859-1,utf-8;q=0.7,*;q=0.7",
        "Keep-Alive: 300");
        if (isset($params['host']) && $params['host'])      $header[]="Host: " . $params['host'];
        if (isset($params['header']) && $params['header']) $header[]=$params['header'];
       
        @curl_setopt ( $this -> ch , CURLOPT_RETURNTRANSFER , 1 );
        @curl_setopt ( $this -> ch , CURLOPT_VERBOSE , 1 );
        @curl_setopt ( $this -> ch , CURLOPT_HEADER , 1 );
       
        if ($params['method'] == "HEAD") @curl_setopt($this -> ch,CURLOPT_NOBODY,1);
        @curl_setopt ( $this -> ch, CURLOPT_FOLLOWLOCATION, 1);
        @curl_setopt ( $this -> ch , CURLOPT_HTTPHEADER, $header );
        if ($params['referer'])    @curl_setopt ($this -> ch , CURLOPT_REFERER, $params['referer'] );
        @curl_setopt ( $this -> ch , CURLOPT_USERAGENT, $user_agent);
        if ($params['cookie'])    @curl_setopt ($this -> ch , CURLOPT_COOKIE, $params['cookie']);

        if ( $params['method'] == "POST" )
        {
            curl_setopt( $this -> ch, CURLOPT_POST, true );
            curl_setopt( $this -> ch, CURLOPT_POSTFIELDS, $params['post_fields'] );
        }
        @curl_setopt( $this -> ch, CURLOPT_URL, $params['url']);
        @curl_setopt ( $this -> ch , CURLOPT_SSL_VERIFYPEER, 0 );
        @curl_setopt ( $this -> ch , CURLOPT_SSL_VERIFYHOST, 0 );
        if (isset($params['login']) & isset($params['password']))
            @curl_setopt($this -> ch , CURLOPT_USERPWD,$params['login'].':'.$params['password']);
        @curl_setopt ( $this -> ch , CURLOPT_TIMEOUT, $params['timeout']);
    }
   
    /**
     * Make curl request
     * @return array  'header','body','curl_error','http_code','last_url'
     */
    public function exec()
    {
        $response = curl_exec($this->ch);
        $error = curl_error($this->ch);
        $result = array( 'header' => '',
                         'body' => '',
                         'curl_error' => '',
                         'http_code' => '',
                         'last_url' => '');
        if ( $error != "" )
        {
            $result['curl_error'] = $error;
            return $result;
        }
       
        $header_size = curl_getinfo($this->ch,CURLINFO_HEADER_SIZE);
        $result['header'] = substr($response, 0, $header_size);
        $result['body'] = substr( $response, $header_size );
        $result['http_code'] = curl_getinfo($this -> ch,CURLINFO_HTTP_CODE);
        $result['last_url'] = curl_getinfo($this -> ch,CURLINFO_EFFECTIVE_URL);
        return $result;
    }
}
Cela va te renvoyer les entêtes et le code HTML de la page de ThePirateBay.