La Fibre
Télécom => Réseau =>
IPv6 => Discussion démarrée par: vivien le 13 mars 2015 à 13:38:40
-
Script pour retourner l'IPv4 publique et l'IPv6
La page https://ip.lafibre.info permet de retourner l'IP utilisée.
Comment faire pour retourner l'IPv4 et l'IPv6 (si le client est compatible IPv6) ?
Je suppose qu'il faut détecter sur la connexion est IPv6 (donc si la première IP retournée est en IPv6, le serveur écoute en IPv4 et IPv6) et si c'est le cas faire une seconde connexion en IPv4 only pour récupérer l'IPv4.
Vous auriez un script simple pour le faire ?
Voici le code tout simple que j'utilise sur La page https://ip.lafibre.info/ (disponible en http et https)
<?php
$ClientIp = $_SERVER["REMOTE_ADDR"];//On obtient l"adresse IP
$ClientHost = gethostbyaddr($ClientIp);//on transforme en Host avec adresse du FAI
$ClientHostTab = explode(".", $ClientHost);//on divise en segments le host par rapport à chaque point
$nb_points = substr_count($ClientHost, ".");// Nombre de point(s) dans la ligne
//$ClientFaiUrl = "http:\/\/www.",$ClientHostTab[$nb_points - 1],".",$ClientHostTab[$nb_points];
echo "<!DOCTYPE html>\n";
echo "<html lang=\"fr\">\n";
echo " <head>\n";
echo " <meta charset=\"utf-8\" />\n";
echo " <title>Quelle est mon IP ?</title>\n";
echo " <meta name=\"description\" content=\"Donne votre adresse IP, le reverse-DNS et le FAI associé\" />\n";
cho " <meta name=\"author\" content=\"Vivien - https://lafibre.info\">\n";
echo " <meta name=\"keywords\" content=\"IP, reverse DNS\" />\n";
echo " </head>\n";
echo "<body>\n";
echo "<img src=\"lafibre.png\" alt=\"LaFibre.info\"><br />\n";
echo "<strong>Informations données par votre navigateur aux sites internet :</strong><br />\n";
echo " <ul><li>Votre IP publique est <strong><font color=green>",$ClientIp,"</font></strong></li>\n";
echo " <li>Votre nom d'hôte (\"reverse DNS\") est <strong>",$ClientHost,"</strong></li>\n";
echo " <li>Votre navigateur est <strong>",getenv("HTTP_USER_AGENT"),"</strong></li>\n";
echo " <li>Votre FAI supposé est \"<strong><a href=\"http://www.",$ClientHostTab[$nb_points - 1],".",$ClientHostTab[$nb_points],"\" title=\"Portail web\" target=\"_blank\">",ucfirst($ClientHostTab[$nb_points - 1]),"</a></strong>\"</li></ul>\n";
echo "<small>Si vous souhaitez récupérer :<br /></small>\n";
echo "<small>- L'IP pour un site disponible en <strong><font color=purple>IPv4</font></strong> et <strong><font color=purple>IPv6</font></strong>, vous pouvez utiliser la page <a href=\"https://ip.lafibre.info\" title=\"IP publique\" target=\"_blank\">http<strong>s</strong>://ip.lafibre.info</a> (https) ou <a href=\"http://ip.lafibre.info\" title=\"IP publique\" target=\"_blank\">http://ip.lafibre.info</a> (http)<br /$
echo "<small>- L'IP pour un site disponible en <strong><font color=purple>IPv4</font></strong> uniquement, vous pouvez utiliser la page <a href=\"https://ipv4.lafibre.info\" title=\"IPv4 publique\" target=\"_blank\">http<strong>s</strong>://ipv4.lafibre.info</a> (https) ou <a href=\"http://ipv4.lafibre.info\" title=\"IPv4 publique\" target=\"_blank\">http://ipv4.lafibre.info</a> (http)<br /></small>\n";
echo "<small>- L'IP pour un site disponible en <strong><font color=purple>IPv6</font></strong> uniquement, vous pouvez utiliser la page <a href=\"https://ipv6.lafibre.info\" title=\"IPv6 publique\" target=\"_blank\">http<strong>s</strong>://ipv6.lafibre.info</a> (https) ou <a href=\"http://ipv6.lafibre.info\" title=\"IPv6 publique\" target=\"_blank\">http://ipv6.lafibre.info</a> (http)<br /></small>\n";
echo "<small>- votre <strong><font color=purple>IPv4</font></strong> publique par script, vous pouvez utiliser la page <a href=\"https://ipv4.lafibre.info/ip.php\" title=\"IPv4 publique\" target=\"_blank\">http<strong>s</strong>://ipv4.lafibre.info/ip.php</a> (https) ou <a href=\"http://ipv4.lafibre.info/ip.php\" title=\"IPv4 publique\" target=\"_blank\">http://ipv4.lafibre.info/ip.php</a> (http)<br /></small>\n";
echo "<small>- votre <strong><font color=purple>IPv6</font></strong> publique par script, vous pouvez utiliser la page <a href=\"https://ipv6.lafibre.info/ip.php\" title=\"IPv6 publique\" target=\"_blank\">http<strong>s</strong>://ipv6.lafibre.info/ip.php</a> (https) ou <a href=\"http://ipv6.lafibre.info/ip.php\" title=\"IPv6 publique\" target=\"_blank\">http://ipv6.lafibre.info/ip.php</a> (http)<br /></small>\n";
echo "<br /><br />";
echo "<small>Scripts pour Linux, qui récupérent l'IP publique, et qui indiquent si c'est une IPv4 ou une IPv6 :</small>\n";
echo " <ul><li><small>Script python3 : <a href=\"ip.py\" title=\"Script perl IP publique\">ip.py</a></small></li>\n";
echo " <li><small>Script perl : <a href=\"ip.pl\" title=\"Script perl IP publique\">ip.pl</a></small></li>\n";
echo " <li><small>Script shell - bash : <a href=\"ip.sh\" title=\"Script perl IP publique\">ip.sh</a></small></li></ul>\n";
echo "</body>\n";
echo "</html>\n";
?>
-
edit: scratch that, j'avais compris dans l'autre sens
-
Tu veux l'info ou ? coté serveur (le serveur sait que ce même client a tel ipv4 et tel ipv6) ou juste coté client (une page qui affiche l'ipv4 et l'ipv6).
-
A priori la fonction de base PHP utilisé dans le script n'est pas très compatible avec IPv6.
C'est ce qui est reporté ici http://php.net/manual/en/function.gethostbyaddr.php (http://php.net/manual/en/function.gethostbyaddr.php).
Le but, c'est d'avoir l'IPv4 ou l'IPv6 du client, mais pas les 2 en même temps, on est bien d'accord ?
-
(http://www.ipnow.org/images/1/bgcolor/FFFFFF/no/TRANSIST.TTF/000000/customipimage.jpg)
-
Difficile à faire, car le socket est établi en v6, donc PHP traite une requête sur ce socket là.
Si tu veux gérer du v4, il faut faire un sous-domaine uniquement en v4 et remonter les résultats sur la page en AJAX (si tu veux les synthétiser sur la même).
-
Tu as besoin que la page principe obtienne l'information ou que l'utilisateur la voit?
Comme j'ai indiqué un simple objet externe dans la page affiche l'information, sans utilisation de choses aussi subtiles que des scripts intégrés d'autres domaines (qui violent le principe fondamental de la sécurité de Web).
-
Le but est de faire une page toute bête, avec des info intéressantes pour l'utilisateur, lisible depuis n'importe quel périphérique, même un vieux nokia, une TV ou un navigateur en mode texte.
Exemple avec les info IPv4 + IPv6 que je souhaiterais afficher :
- Votre IPv4 publique est 80.215.198.21
- Votre IPv6 est 2a01:e0c:1::1
- Votre nom d'hôte IPv4 ("reverse DNS") est reverse.toto.fr
- Votre nom d'hôte IPv6 ("reverse DNS") est reverse.toto.fr
- Votre navigateur est Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0
- Votre FAI supposé est "toto"
Aujourd'hui quand on a l'IPv6, la page n'affiche plus l'IPv4 : (là j'utilise w3m, un navigateur en mode texte)
-
Ben j'ai mis une image parce que c'est tout ce que le forum autorise, mais sinon en texte pur tu mets une iframe pointant sur https://ip.lafibre.info/ip.php tout simplement.
Il te faudra créer ipv4.lafibre.info et ipv6.lafibre.info bien sûr.
-
Tu ne peux effectivement pas avoir les 2 infos (IPv4 et IPv6) sur la même connexion TCP puisqu'elle s'établit avec l'un ou avec l'autre selon le choix du client. Donc faut bien de l'iframe/ajax/etc pour établir 2 sous connexions vers des hosts fixés IPv4 et IPv6 pour récupérer l'information.
-
C'est pas de l'AJAX normal qu'il faut, c'est de la communication par inclusion de script. Beurk.
-
Il y a bien IPv6-Test.com qui est excellent, mais là aussi, le site effectue des requêtes AJAX sur différents sous-domaines :
(http://i.imgur.com/HpZmxg2.png)
(http://i.imgur.com/knRnKe6.png)
Pour l'avoir en script, tu ne pourras pas renvoyer le résultat en one-shot, surtout si ce n'est pas un navigateur en face qui fait la requête (et qui ne pourra pas exécuter des iframes ou du JS).
-
Le but est de faire une page toute bête, avec des info intéressantes pour l'utilisateur, lisible depuis n'importe quel périphérique, même un vieux nokia, une TV ou un navigateur en mode texte.
Je ne vois que 2 solutions:
- 2 pages distinctes (une pour v4, une pour v6) dans des iframes au besoin
- ajax/js dans une page
En principe tout les vieux navigateurs supportent iframe (c'est du HTML 1.0) meme lynx.
-
iframe est du HTML pas du HTTP, enfin! ;)
-
iframe est du HTML pas du HTTP, enfin! ;)
une fois sur 2 je mélange les 2:p
-
troisieme solution un redirect qui passe l'IPv6 dans l'url... :
1. le client demande la page au serveur
2. serveur regarde l'ip du client, si ipv4 il repond avec la page normal
3. si ipv6 il repond un redirect forcant v4 en passant l'ipv6 dans l'url (http://ipv4.domain.com/45641778655464654)
4. le serveur recoit le redirect en ipv4 , parse l'ipv6 dans l'url et genere une page web réponse avec les 2 ip
ca ne marche pas si client ne supporte pas IPv4 (cas rare).
-
Et si le navigateur préfère IPv4 à IPv6?
-
Je vais faire plus simple avec 3 pages :
- Page IPv4 / IPv6
- Page IPv4 only
- Page IPv6 only
-
Comment tu vas faire pour implèmenter la page IPv4 / IPv6?
-
Des sous nom de domaine ;D
ipv4.lafibre.info (A uniquement) et ipv6.lafibre.info (AAAA uniquement), mais cela pose un problème pour le https : je n'ai pas de certificat global pour les sous-domaines.
Pourtant j'aime bien l'idée d'avoir l'IP public en http / https. Je me demande toujours si j'ai la même IP avec les proxy sur le port 80 des opérateurs mobiles (le trafic du port 80 passe par le proxy, tandis que le trafic su port 443 passe directement)