La Fibre

Télécom => Réseau => reseau IPv6 => Discussion démarrée par: vivien le 24 décembre 2015 à 08:37:50

Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 24 décembre 2015 à 08:37:50
Script perl pour récupérer l'IP publique et indiquer si c'est une IPv4 ou une IPv6

Script Perl :
#!/usr/bin/perl -w
use strict;
use LWP::Simple;

my $ip= get("https://ip.lafibre.info/ip.php");
printf("Adresse IP publique : $ip\n");
printf("Protocole IP : IPv%d\n",(index($ip,":")==-1)?4:6);

Le script est dispo sur : https://ip.lafibre.info/scripts/ip.pl



Script Python :
#!/usr/bin/python3
from urllib.request import urlopen
ip = urlopen('https://ip.lafibre.info/ip.php').read()
print("Adresse IP publique :", ip.decode('ascii'))
print("Protocole IP : IPv%d" % (6 if b':' in ip else 4))

Le script est dispo sur : https://ip.lafibre.info/scripts/ip.py



Le scipt shell (bash) :
#!/bin/sh
ip=$(wget wget -q -O - https://ip.lafibre.info/ip.php)
echo Adresse IP publique : $ip
case "$ip" in
*:* ) echo Protocole IP : IPv6;;
* ) echo Protocole IP : IPv4;;
esac

Le script est dispo sur : https://ip.lafibre.info/scripts/ip.sh



Script original (sur lequel se base la discussion ci-dessous) :
#!/usr/bin/perl -w
use strict;
### Dépendance à installer :
# sudo apt install w3m

### FONCTION Détection IPv4 vs IPv6
sub detection_ip {
my $str = shift;
$str =~ s/^\s*//;
$str =~ s/\s*$//;
  if ($str =~ s/^((?:\d+\.)+\d+)(?::(\d+))?$//) {
return 'IPv4';
}
return 'IPv6';
}

### DÉBUT DU PROGRAMME

# Récupération IP publique
my $IP_client = `/usr/bin/w3m -dump https://ip.lafibre.info/ip.php`;
chomp($IP_client);
print ("Adresse IP publique : $IP_client\n");

# Détection du protocole IP
my ($IP_version) = detection_ip($IP_client);
print "Protocole IP : $IP_version\n";

installation :
wget https://ip.lafibre.info/ip.pl
chmod +x ip.pl
sudo apt install w3m
./ip.pl


Exemple si IPv6 n'est pas disponible :
$ ./ip.pl
Adresse IP publique : 46.227.16.8
Protocole IP : IPv4

Exemple si IPv6 est disponible :
$ ./ip.pl
Adresse IP publique : 2a01:6e00:10:410::2
Protocole IP : IPv6
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Marin le 24 décembre 2015 à 12:19:44
Exemple d'implèmentation en Python 3, sans dépendance externe :

from urllib.request import urlopen
ip = urlopen('https://ip.lafibre.info/ip.php').read()
print("Adresse IP publique :", ip.decode('ascii'))
print("Protocole IP : IPv%d" % (6 if b':' in ip else 4))
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 24 décembre 2015 à 12:50:15
Impressionnant la compacité du code et l'absence de dépendances externes.

Je l'ai rajouté sur la page : http://ip.lafibre.info/scripts/ip.py

Il faut que je me plonge dans le Python...
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 24 décembre 2015 à 13:34:24
c'est ton code perl qui est pas top top plutot ?

un truc comme ca devrait marcher en Perl (pas testé:):
use LWP::Simple;
$ip= get("https://ip.lafibre.info/ip.php");
printf("Adresse IP publique : $ip\n");
printf("Protocole IP : IPv%d\n",(index(":",$ip)==-1)?4:6);

ps: on me signale que LWP n'est pas forcement installé. Dans ce cas:
sudo apt install libwww-perlou via CPAN
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 24 décembre 2015 à 14:10:13
ou en Shell directement, pas besoin d'installer quoique ce soit sauf curl:

ip=$(curl -s https://ip.lafibre.info/ip.php)
echo Adresse IP publique : $ip
case "$ip" in
*:* ) echo Protocole IP : IPv6;;
* ) echo Protocole IP : IPv4;;
esac
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: alain_p le 24 décembre 2015 à 16:39:05
Et c'est un peu moins obscur que les expressions régulières Perl.
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 24 décembre 2015 à 16:44:47
Code: (C++) [Sélectionner]
#include <iostream>
using namespace std;

enum IP_family {
addr_IPv4,
addr_IPv6,
addr_unknown
};

const char *to_string (IP_family f) {
switch (f) {
case addr_IPv6:
return "IPv6";
case addr_IPv4:
return "IPv4";
default:
return "unknown";
}
}

IP_family addr_type (const string &addr) {
if (addr.find_first_of (':') != string::npos)
return addr_IPv6;
if (addr.find_first_of ('.') != string::npos)
return addr_IPv4;
return addr_unknown;
}

ostream &operator<< (ostream &os, IP_family f) {
return os << to_string (f);
}

void test (const string &str) {
cout << ""\" << str << "\" is " << addr_type(str) << endl;
}

int main() {
test ("46.227.16.8");
test ("2a01:6e00:10:410::2");
test ("42");
return 0;
}
https://ideone.com/jG8yYv

"46.227.16.8" is IPv4
"2a01:6e00:10:410::2" is IPv6
"42" is unknown
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 24 décembre 2015 à 16:57:48
Et c'est un peu moins obscur que les expressions régulières Perl.
Les regexp, en français expression rationnelles, correspondent à un automate (déterministe ou non).

Les perlre ne sont pas des regexp, elles ne sont pas rationnelles!
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 24 décembre 2015 à 17:25:44
Et c'est un peu moins obscur que les expressions régulières Perl.
Petite explication :
   $str =~ s/^\s*//;
   $str =~ s/\s*$//;

Citer
    ^        Match the beginning of the line

    $        Match the end of the string (or before newline at the end

    \d        [3]  Match a decimal digit character

    \s        [3]  Match a whitespace character

En résumé :

^\s* tous les espaces en début de chaîne
\s*$ tous les espaces en fin de chaîne
s/toto// remplace toto par rien (= supprimer)
s/^\s*// remplace tous les espaces en début de chaîne par rien (= supprimer)

   if ($str =~ s/^((?:\d+\.)+\d+)(?::(\d+))?$//) {
Citer
n
Prevent the grouping metacharacters () from capturing. This modifier, new in 5.22, will stop $1 , $2 , etc... from being filled in.
  "hello" =~ /(hi|hello)/;   # $1 is "hello"
  "hello" =~ /(hi|hello)/n;  # $1 is undef
This is equivalent to putting ?: at the beginning of every capturing group:
  "hello" =~ /(?:hi|hello)/; # $1 is undef

http://perldoc.perl.org/perlre.html#Regular-Expressions

\d+ suite de chiffres (non vide) = nombre en décimal "1" "23" "111" "000000"
\d+\. nombre en décimal suivi d'un point
((?:\d+\.) idem
((?:\d+\.) au moins une fois : nombre en décimal suivi d'un point "1." "12." "1.3." "12.345." "12.000.56452."
(?:\d+\.)+\d+ série de nombres en décimal séparés par un point  "1.0" "12.01" "1.3.5" "12.345.000" "12.3.56452.5111" "12.3.56452.5111.0"

On voit donc qu'à aucun moment on ne vérifie que c'est syntaxiquement une adresse IPv4 bien formée (4 mots de 8 bits écrit en décimal). On va désigner ça par dotted-decimal.

((?:\d+\.)+\d+) idem, rend disponible l'expression matchée plus tard

: deux points
:(\d+) deux points suivi d'un nombre, rend disponible le nombre; appelons ça decimal-port
(?::(\d+)) idem
(?::(\d+))? optionnellement deux points suivi d'un nombre, rend disponible le nombre


^((?:\d+\.)+\d+)(?::(\d+))?$

chaîne complète constituée de dotted-decimal suivi éventuellement de decimal-port, rend disponible les deux composantes sous forme de $1 et $2

exemples :

"1.0" "12.01:124" "1.3.5" "12.345.0:00" "12.3.56452:5111" "12.3.56452.5111.0.12:123422"
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 24 décembre 2015 à 17:31:47
c'est ton code perl qui est pas top top plutot ?

un truc comme ca devrait marcher en Perl (pas testé:):
index(":",$ip)
Oui mais ça n'a rien à voir avec ce que teste vivien en Perl.
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 24 décembre 2015 à 17:51:06
Les regexp, en français expression rationnelles, correspondent à un automate (déterministe ou non).

Les perlre ne sont pas des regexp, elles ne sont pas rationnelles!
Mais en l'occurrence l'expression de vivien est bien rationnelle, enfin, ce sont deux expressions qui définissent des variables.

Une expression est rationnelle si on peut l'écrire avec uniquement les opérateurs suivants

| alternative
* répétition (étoile de Kleene)

ce qui est le cas pour le programme de vivien :

\d = 0|1|2|3...
\d+ = \d*\d
(\d+.)+ = (\d*\d.)*\d*\d.
(\d+.)+\d+ = (\d*\d.)*\d*\d.\d*\d
(:\d+)? = (:\d*\d)|
(l'alternative de droite est vide)

(\d+.)+\d+(:\d+)? = (\d*\d.)*\d*\d.\d*\d((:\d*\d)|)

(La question du stockage des correspondances est laissé de coté.)
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 24 décembre 2015 à 18:17:55
On peut écrire cela sous forme d'un automate avec
état initial S0
état final END
goto A,B signifie passer à l'état A ou bien l'état B

S0 : if (isdigit) goto S0,S1
S1 : if (isdigit) goto S2
S2 : if (".") goto S0,S10
S10 : if (isdigit) goto S10,S11
S11 : if (isdigit) goto END,S20
S20 : if (":") goto S30
S30 : if (isdigit) goto S30,S31
S31 : if (isdigit) goto END


isdigit est lui même un automate :

S0 : if ("0") goto END
S0 : if ("1") goto END
S0 : if ("2") goto END
...
S0 : if ("9") goto END
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 24 décembre 2015 à 19:11:38
c'est ton code perl qui est pas top top plutot ?

un truc comme ca devrait marcher en Perl (pas testé:):
use LWP::Simple;
$ip= get("https://ip.lafibre.info/ip.php");
printf("Adresse IP publique : $ip\n");
printf("Protocole IP : IPv%d\n",(index(":",$ip)==-1)?4:6);

ps: on me signale que LWP n'est pas forcement installé. Dans ce cas:
sudo apt install libwww-perlou via CPAN

C'est mieux que la méthode avec case et curl, car case demande un
use Switch;qui n'est pas installé par défaut dans les distributions Linux (de même que curl, seul wget est installé par défaut)

Le code fonctionne (il manque un my pour déclarer $ip), mais en IPv6 le résultat n'est pas celui attendu :

$ ./ip.pl
Adresse IP publique : 2a01:6e00:10:410::2
Protocole IP : IPv4
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: jack le 24 décembre 2015 à 20:38:51
Comment ? On souhaite du code compact ?

Bash:
Code: ("bash") [Sélectionner]
target="https://ip.lafibre.info/ip.php"
[[ $(wget -q -O - "$target") == *":"* ]] && echo "ipv6!" || echo "ipv4!"

(3 lignes de moins de 80char, si tu veux l'affichage de l'addresse IP)
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 25 décembre 2015 à 14:42:11
C'est mieux que la méthode avec case et curl, car case demande un
use Switch;
qui n'est pas installé par défaut dans les distributions Linux (de même que curl, seul wget est installé par défaut)


Le script avec case et curl est un script shell (/bin/sh ou bash) et pas perl.
Si wget est plus souvent installé que curl, le meme script avec wget:

#!/bin/sh
ip=$(wget wget -q -O - https://ip.lafibre.info/ip.php)
echo Adresse IP publique : $ip
case "$ip" in
*:* ) echo Protocole IP : IPv6;;
* ) echo Protocole IP : IPv4;;
esac

Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 25 décembre 2015 à 15:08:38
vivien utilise un script qui récupère le numéro de port, il y a peut être une raison?

Si il y a un numéro de port après l'adresse IP ce test ne marchera pas.
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 25 décembre 2015 à 15:54:21
Oui dans le cas donné, il n'y a pas de port, donc c'est une bonne idée de simplifier.

J'ai mis en ligne les 3 scripts sur la page http://ip.lafibre.info/

Une idée pour le script perl qui retourne toujours IPv4, même quand c'est une IPv6 ?
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 25 décembre 2015 à 21:31:35
Une idée pour le script perl qui retourne toujours IPv4, même quand c'est une IPv6 ?

oui inversion de ma part du fonctionnement de la fonction index.

La bonne ligne devrait être:

printf("Protocole IP : IPv%d\n",(index($ip,":")==-1)?4:6);
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: BadMax le 26 décembre 2015 à 09:28:20
J'ai p'tet loupé un épisode : pourquoi ne réalises-tu pas le test dans le code php de ta page ?

Ainsi le script à développer se contente de charger la page ce qui serait plus simple à maintenir sur différents OS.

Non ?
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 26 décembre 2015 à 10:17:56
Parfait kgersen.

C'est une idée BadMax. Afficher en bas du site lafibre.info, quand il sera dispo en IPv6 (le 1er janvier), si on visualise le site en IPv4 ou IPv6.

L'idée des bouts de code perl / python / bash était de donner un exemple de code qui fonctionne, pour que des personnes qui ont un projet x ou y puisse trouver rapidement la solution.
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: underground78 le 26 décembre 2015 à 12:00:09
Pour le site, tu pourrais afficher un logo (un peu) différent pour les gens en IPv6 par exemple.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 26 décembre 2015 à 17:04:57
Avec une tortue? ;)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 05 janvier 2016 à 12:32:13
Quelques idées a rajouter a ip.lafibre.info : http://dual.tlund.se/

notamment l'url qui "requires resolver to be IPv6 enabled".

Le link vers le BGP Toolkit d'HE est pas mal aussi d'autant que ca indique le RBL.
(par exemple je vois que spamhaus n'aime pas mon IP dynamique attribuée par Orange http://bgp.he.net/ip/90.61.196.245#_rbl )
Titre: Script perl pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 06 janvier 2016 à 07:10:53
Et c'est un peu moins obscur que les expressions régulières Perl.
La "regexp" Perl ne fait pas du tout la même chose, et je pense que ce serait bien de le préciser à l'intention de ceux qui ne liront pas toute la discussion.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 21 février 2016 à 10:07:30
Quelques idées a rajouter a ip.lafibre.info : http://dual.tlund.se/

notamment l'url qui "requires resolver to be IPv6 enabled".

J'ai repris les idées => https://ip.lafibre.info, sauf celle qui demande une résolution DNS activée.

Bind propose de ne pas répondre de la même façon aux requêtes A / AAAA qui lui viennent en IPv4 vs IPv6 ou il faut mettre ça sur deux machines différentes (une qui répond en IPv4 et l'autre en IPv6 ?)

J'ai un peu de mal à comprendre, même si mon FAI me fournit une IPv6 pour joindre son DNS, il y a de grande chance qu'il réalise la requête derrière en IPv4, non ?
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 21 février 2016 à 12:17:40
J'ai repris les idées => https://ip.lafibre.info, sauf celle qui demande une résolution DNS activée.

Bind propose de ne pas répondre de la même façon aux requêtes A / AAAA qui lui viennent en IPv4 vs IPv6 ou il faut mettre ca su deux machines différentes (une qui répond en IPv4 et l'autre en IPv6 ?)

J'ai un peu de mal a comprendre, même si mon FAI me fourni une IPv6 pour joindre son DNS, il y a de grande chance qu'il réalise la requête derrière en IPv4, non ?

le test en question test le resolver DNS: le serveur qui fait la résolution récursive. Le nom a résoudre n'est résoluble qu'en IPv6 au niveau du serveur autorité pour ce nom.

Dans l'exemple: ipv6-only.tlund.se
le serveur de nom SOA qui répond pour la zone "tlund.se" ne donnera pas de réponse AAAA (ou meme A) pour l'enregistrement "ipv6-only" si on le lui demande en IPv4, il ne répondra que si on le lui demande en IPv6.

donc en pratique, config standard:
PC(serveur dns=@box en IPv6 ou IPv4)--- box (forwarder dns vers resolver(s) FAI)--- resolver(s) FAI --- tlund.se

dans ce cas, ca test le resolver du FAI: chez Orange par exemple ca échoue car le(s) resolver(s) Orange ne travaillent qu'en IPv4.

dans cette config:
PC(serveur dns=8.8.8.8 )--- box ()--- resolver(s) Google --- tlund.se
ou
PC(serveur dns=2001:4860:4860::8888)--- box ()--- resolver(s) Google --- tlund.se

ca fonctionne car les resolvers de Google fonctionnent en IPv6 (on peut test avec "dig ipv6-only.tlund.se aaaa +short @resolver")

on voit donc aussi que ca n'a rien a voir avec le fait qu'on interroge le resolver  en IPv4 ou IPv6. Ce qui compte c'est comment lui fait les résolutions.


Titre: Réponse DNS dépendante de l'IP source
Posté par: corrector le 21 février 2016 à 15:00:22
J'ai repris les idées => https://ip.lafibre.info, sauf celle qui demande une résolution DNS activée.

Bind propose de ne pas répondre de la même façon aux requêtes A / AAAA qui lui viennent en IPv4 vs IPv6 ou il faut mettre ca su deux machines différentes (une qui répond en IPv4 et l'autre en IPv6 ?)
Il y a bien des "vues" qui permettent de ne pas répondre la même chose selon l'interface sur laquelle arrive la requête (ce qui est typiquement utilisé pour renvoyer une IP privée quand un domaine public est demandé depuis un LAN), donc peut être.

Ceci dit : vues = caca.
Titre: Comportement de Unbound
Posté par: corrector le 21 février 2016 à 15:51:04
J'ai un peu de mal a comprendre, même si mon FAI me fourni une IPv6 pour joindre son DNS, il y a de grande chance qu'il réalise la requête derrière en IPv4, non ?
/* loop over missing targets */
for(ns = iq->dp->nslist; ns; ns = ns->next) {
if(ns->resolved)
continue;

/* randomly select this item with probability toget/missing */
if(!iter_ns_probability(qstate->env->rnd, toget, missing)) {
/* do not select this one, next; select toget number
* of items from a list one less in size */
missing --;
continue;
}

if(ie->supports_ipv6 && !ns->got6) {
/* Send the AAAA request. */
if(!generate_target_query(qstate, iq, id,
ns->name, ns->namelen,
LDNS_RR_TYPE_AAAA, iq->qchase.qclass)) {
*num = query_count;
if(query_count > 0)
qstate->ext_state[id] = module_wait_subquery;
return 0;
}
query_count++;
}
/* Send the A request. */
if(ie->supports_ipv4 && !ns->got4) {
if(!generate_target_query(qstate, iq, id,
ns->name, ns->namelen,
LDNS_RR_TYPE_A, iq->qchase.qclass)) {
*num = query_count;
if(query_count > 0)
qstate->ext_state[id] = module_wait_subquery;
return 0;
}
query_count++;
}

/* query for parent-side A and AAAA for nameservers */
if(ie->supports_ipv6 && !ns->done_pside6) {
/* Send the AAAA request. */
if(!generate_parentside_target_query(qstate, iq, id,
ns->name, ns->namelen,
LDNS_RR_TYPE_AAAA, iq->qchase.qclass))
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
ns->done_pside6 = 1;
query_count++;
}
if(ie->supports_ipv4 && !ns->done_pside4) {
/* Send the A request. */
if(!generate_parentside_target_query(qstate, iq, id,
ns->name, ns->namelen,
LDNS_RR_TYPE_A, iq->qchase.qclass))
return error_response(qstate, id,
LDNS_RCODE_SERVFAIL);
ns->done_pside4 = 1;
query_count++;
}

Il me semble que l'IPv6 est utilisé prioritairement par Unbound.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 21 février 2016 à 16:14:52
avec une "acl" dans bind tu dois pouvoir limité la résolution d'un nom qu'a ceux qui font la demande en IPv6 (hypothese, j'ai pas testé).
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 21 février 2016 à 17:35:43
Tu peux tester avec rs.dns-oarc.net

DNS Free (testé avec dns1.proxad.fr)

rs.dns-oarc.net
        canonical name = rst.x4090.rs.dns-oarc.net
        ttl = 1800 (30 mins)
rst.x4090.rs.dns-oarc.net
        canonical name = rst.x4058.x4090.rs.dns-oarc.net
        ttl = 1800 (30 mins)
rst.x4058.x4090.rs.dns-oarc.net
        canonical name = rst.x4064.x4058.x4090.rs.dns-oarc.net
        ttl = 1800 (30 mins)
rst.x4064.x4058.x4090.rs.dns-oarc.net
        text =

        "213.228.58.24 DNS reply size limit is at least 4090"
        ttl = 1800 (30 mins)
rst.x4064.x4058.x4090.rs.dns-oarc.net
        text =

        "213.228.58.24 sent EDNS buffer size 4096"
        ttl = 1800 (30 mins)
rst.x4064.x4058.x4090.rs.dns-oarc.net
        text =

        "Tested at 2016-02-21 16:43:58 UTC"
        ttl = 1800 (30 mins)

x4064.x4058.x4090.rs.dns-oarc.net
        nameserver = ns00.x4064.x4058.x4090.rs.dns-oarc.net
        ttl = 1800 (30 mins)
ns00.x4064.x4058.x4090.rs.dns-oarc.net
        internet address = 149.20.58.136
        ttl = 1800 (30 mins)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 21 février 2016 à 17:57:58
Dans l'exemple: ipv6-only.tlund.se
le serveur de nom SOA qui répond pour la zone "tlund.se" ne donnera pas de réponse AAAA (ou meme A) pour l'enregistrement "ipv6-only" si on le lui demande en IPv4, il ne répondra que si on le lui demande en IPv6.
Plus précisèment, le serveur qui peut dire quelle est l'adresse de ipv6-only.tlund.se est

ipv6-only.tlund.se      nameserver = ns.ipv6-only.tlund.se

Or ns.ipv6-only.tlund.se est IPv6-only comme le nom l'indique :

ns.ipv6-only.tlund.se   AAAA IPv6 address = 2001:67c:1898:2::53

Donc si tu n'as pas la connectivité IPv6, tu ne peux pas trouver directement cette information :

Serveur :   ns.ipv6-only.tlund.se
Address:  2001:67c:1898:2::53

Nom :    ipv6-only.tlund.se
Address:  2a00:801:f::195
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 21 février 2016 à 18:14:18
>unbound-host.exe -t TXT -d rs.dns-oarc.net
[1456074703] libunbound[5584:0] notice: init module 0: validator
[1456074703] libunbound[5584:0] notice: init module 1: iterator
[1456074703] libunbound[5584:0] info: resolving rs.dns-oarc.net. TXT IN
[1456074703] libunbound[5584:0] info: priming . IN NS
[1456074703] libunbound[5584:0] info: response for . NS IN
[1456074703] libunbound[5584:0] info: reply from <.> 199.7.83.42#53
[1456074703] libunbound[5584:0] info: query response was ANSWER
[1456074703] libunbound[5584:0] info: priming successful for . NS IN
[1456074704] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074704] libunbound[5584:0] info: reply from <.> 2001:500:2d::d#53
[1456074704] libunbound[5584:0] info: query response was REFERRAL
[1456074704] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074704] libunbound[5584:0] info: reply from <net.> 192.54.112.30#53
[1456074704] libunbound[5584:0] info: query response was REFERRAL
[1456074704] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074704] libunbound[5584:0] info: reply from <dns-oarc.net.> 149.20.58.65#53
[1456074704] libunbound[5584:0] info: query response was REFERRAL
[1456074704] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074704] libunbound[5584:0] info: reply from <rs.dns-oarc.net.> 149.20.58.133#53
[1456074704] libunbound[5584:0] info: query response was CNAME
[1456074704] libunbound[5584:0] info: resolving rs.dns-oarc.net. TXT IN
[1456074704] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074704] libunbound[5584:0] info: reply from <rs.dns-oarc.net.> 2001:4f8:3:2bc:2::133#53
[1456074704] libunbound[5584:0] info: query response was REFERRAL
[1456074704] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074704] libunbound[5584:0] info: reply from <x4090.rs.dns-oarc.net.> 2001:4f8:3:2bc:2::134#53
[1456074704] libunbound[5584:0] info: query response was CNAME
[1456074704] libunbound[5584:0] info: resolving rs.dns-oarc.net. TXT IN
[1456074705] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074705] libunbound[5584:0] info: reply from <x4090.rs.dns-oarc.net.> 2001:4f8:3:2bc:2::134#53
[1456074705] libunbound[5584:0] info: query response was REFERRAL
[1456074705] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074705] libunbound[5584:0] info: reply from <x4060.x4090.rs.dns-oarc.net.> 2001:4f8:3:2bc:2::135#53
[1456074705] libunbound[5584:0] info: query response was CNAME
[1456074705] libunbound[5584:0] info: resolving rs.dns-oarc.net. TXT IN
[1456074705] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074705] libunbound[5584:0] info: reply from <x4060.x4090.rs.dns-oarc.net.> 2001:4f8:3:2bc:2::135#53
[1456074705] libunbound[5584:0] info: query response was REFERRAL
[1456074705] libunbound[5584:0] info: response for rs.dns-oarc.net. TXT IN
[1456074705] libunbound[5584:0] info: reply from <x4066.x4060.x4090.rs.dns-oarc.net.> 2001:4f8:3:2bc:2::136#53
[1456074705] libunbound[5584:0] info: query response was ANSWER
rs.dns-oarc.net is an alias for rst.x4066.x4060.x4090.rs.dns-oarc.net.
rst.x4066.x4060.x4090.rs.dns-oarc.net has TXT record "2a01:e35:xxxx:xxx0:xxxx:xxxx:xxxx:xxxx DNS reply size limit is at least 4090"
rst.x4066.x4060.x4090.rs.dns-oarc.net has TXT record "2a01:e35:xxxx:xxx0:xxxx:xxxx:xxxx:xxxx sent EDNS buffer size 4096"
rst.x4066.x4060.x4090.rs.dns-oarc.net has TXT record "Tested at 2016-02-21 17:11:44 UTC"
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 21 février 2016 à 18:34:44
C:\Program Files (x86)\Unbound>unbound-host.exe -4t TXT -d rs.dns-oarc.net
[1456075809] libunbound[2636:0] notice: init module 0: validator
[1456075809] libunbound[2636:0] notice: init module 1: iterator
[1456075809] libunbound[2636:0] info: resolving rs.dns-oarc.net. TXT IN
[1456075809] libunbound[2636:0] info: priming . IN NS
[1456075809] libunbound[2636:0] info: response for . NS IN
[1456075809] libunbound[2636:0] info: reply from <.> 199.7.83.42#53
[1456075809] libunbound[2636:0] info: query response was ANSWER
[1456075809] libunbound[2636:0] info: priming successful for . NS IN
[1456075809] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075809] libunbound[2636:0] info: reply from <.> 202.12.27.33#53
[1456075809] libunbound[2636:0] info: query response was REFERRAL
[1456075809] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075809] libunbound[2636:0] info: reply from <net.> 192.35.51.30#53
[1456075809] libunbound[2636:0] info: query response was REFERRAL
[1456075810] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075810] libunbound[2636:0] info: reply from <dns-oarc.net.> 38.230.3.42#53
[1456075810] libunbound[2636:0] info: query response was REFERRAL
[1456075810] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075810] libunbound[2636:0] info: reply from <rs.dns-oarc.net.> 149.20.58.133#53
[1456075810] libunbound[2636:0] info: query response was CNAME
[1456075810] libunbound[2636:0] info: resolving rs.dns-oarc.net. TXT IN
[1456075810] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075810] libunbound[2636:0] info: reply from <rs.dns-oarc.net.> 149.20.58.133#53
[1456075810] libunbound[2636:0] info: query response was REFERRAL
[1456075810] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075810] libunbound[2636:0] info: reply from <x4090.rs.dns-oarc.net.> 149.20.58.134#53
[1456075810] libunbound[2636:0] info: query response was CNAME
[1456075810] libunbound[2636:0] info: resolving rs.dns-oarc.net. TXT IN
[1456075810] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075810] libunbound[2636:0] info: reply from <x4090.rs.dns-oarc.net.> 149.20.58.134#53
[1456075810] libunbound[2636:0] info: query response was REFERRAL
[1456075811] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075811] libunbound[2636:0] info: reply from <x4058.x4090.rs.dns-oarc.net.> 149.20.58.135#53
[1456075811] libunbound[2636:0] info: query response was CNAME
[1456075811] libunbound[2636:0] info: resolving rs.dns-oarc.net. TXT IN
[1456075811] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075811] libunbound[2636:0] info: reply from <x4058.x4090.rs.dns-oarc.net.> 149.20.58.135#53
[1456075811] libunbound[2636:0] info: query response was REFERRAL
[1456075811] libunbound[2636:0] info: response for rs.dns-oarc.net. TXT IN
[1456075811] libunbound[2636:0] info: reply from <x4064.x4058.x4090.rs.dns-oarc.net.> 149.20.58.136#53
[1456075811] libunbound[2636:0] info: query response was ANSWER
rs.dns-oarc.net is an alias for rst.x4064.x4058.x4090.rs.dns-oarc.net.
rst.x4064.x4058.x4090.rs.dns-oarc.net has TXT record "82.x.x.x DNS reply size limit is at least 4090"
rst.x4064.x4058.x4090.rs.dns-oarc.net has TXT record "82.x.x.x sent EDNS buffer size 4096"
rst.x4064.x4058.x4090.rs.dns-oarc.net has TXT record "Tested at 2016-02-21 17:30:10 UTC"
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 22 février 2016 à 19:54:57
Une autre idée : afficher l'adresse IPv4 en hexa.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 22 février 2016 à 22:13:48
un test de "ICMP packet too big" / PMTUD serait bien aussi.

test-ipv6.com fait ca avec une requete web du style:

http://mtu1280.test-ipv6.com/ip/?callback=?&size=1600&fill=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&testdomain=test-ipv6.com&testname=test_v6mtu


La machine en mtu1280.test-ipv6.com a un mtu forcé a 1280. pour recevoir cette requête, elle va donc rejeter tout paquet trop grand et répondre avec un "ICMP packet too big" avec 1280 dedans. Celui va revenir au poste qui va le prendre en compte et recommencer avec le bon mtu.

Si le poste ne recommence pas et signale un erreur au bout d'un moment, c'est que l'ICMP n'est pas passé donc quelque chose sur le chemin l'a bloqué.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 23 février 2016 à 09:45:36
À une époque, cette URL aurait été considérée comme une attaque informatique!
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 05 mars 2016 à 14:22:15
vivien, ce serait bien de permettre de récupérer l'adresse IP dans une page, sous forme de texte.

Cela permettrait d'afficher l'adresse IPv4 et v6 dans une même page, et surtout de les comparer.

(http://www.ipnow.org/images/1/bgcolor/FFFFFF/yes/TRANSIST.TTF/000000/customipimage.jpg) (http://www.ipnow.org/custimgs/createipimage.php)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 05 mars 2016 à 19:06:52
C'est un peu plus complexe, car si on détecte une IPv6, il faut charger un second élèment en forçant l'IPv4.

Si tu as une idée de script, je suis preneur.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 06 mars 2016 à 01:12:30
le plus simple c'est avec JQuery:

mon IPv4 est <div id="ipv4"></div><br>
<script src="http://code.jquery.com/jquery-latest.pack.js"></script>
<script
$(document).ready( function() {
   $('#ipv4').load('https://ipv4.lafibre.info/ip.php');
});
</script>

si c'est pas sur le meme domaine il faut activer cors (http://enable-cors.org/) ou utiliser JSONP.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 06 mars 2016 à 01:52:03
Ce n'est évidemment pas sur le même domaine.

CORS m'a l'air plus simple donc plus sûr.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 06 mars 2016 à 08:32:31
J'ai rajouté
Header set Access-Control-Allow-Origin "*"dans la conf apache2 (en http comme en https)

J'ai rajouté dans le php
mon IPv4 est <div id="ipv4"></div><br>
<script src="http://code.jquery.com/jquery-latest.pack.js"></script>
<script>
$(document).ready( function() {
   $("#ipv4").load("https://ipv4.lafibre.info/ip.php");
});
</script>
Dans un echo '.............';  de php, sous le logo de lafibre.info et voici ce que cela donne : https://ip.lafibre.info/test.php

Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 06 mars 2016 à 08:45:49
Solution : il faut appeler en https et non en http le jquery-latest.pack.js
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 06 mars 2016 à 12:54:28
Tu peux également installer le script sur ton serveur.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 06 mars 2016 à 16:47:43
J'ai rajouté
Header set Access-Control-Allow-Origin "*"

Le cors n'est pas obligatoire dans le cas présent l'appel se faisant sur le meme domaine.

En mettant * n'importe quel site au monde peut utiliser ton service web.
Tant que personne n'est trop au courant ca va mais si des gens mal intentionnés le découvrent ca peut amener a des abus.

Pour le moment tu ne fournis que l'IP donc l'attractivité est limitée mais si un jour tu fournis la geoloc ou d'autres infos ca peut attirer des spammeurs et autres 'bandits' de l'Internet.
Pas mal de ces services gratuits ont fermé devant les abus ou ont mis en en place des restrictions d'usage (X requêtes/heure ou auto-ban):
http://www.telize.com/ par exemple a fermé. https://freegeoip.net limite l'usage. http://ip-api.com/ active un bannissement automatique qu'on peut  retirer via un captcha, etc

Surveilles donc bien ton trafic et si tu vois trop de requêtes sur ipv4.lafibre.info ou ipv6.lafibre.info (ou meme ip.lafibre.info), la cause en sera probablement le CORS.

Il faut juste en être conscient. CORS est la pour protéger ton serveur et pas l'inverse.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 06 mars 2016 à 17:20:31
Le cors n'est pas obligatoire dans le cas présent l'appel se faisant sur le meme domaine.
Quel domaine?

En mettant * n'importe quel site au monde peut utiliser ton service web.
Oui. Mais n'importe qui pouvait déjà utiliser de nombreux services de ces sites :
- affichage de l'adresse IP
- tests de débit
- images du forum
- il y aurait même des gens qui utilisent le serveur HTTP comme un sink TCP!

<iframe src="ipv4.lafibre.info/..."> ...

Tant que personne n'est trop au courant ca va mais si des gens mal intentionnés le découvrent ca peut amener a des abus.
Bof! Plein de sites fournissent ce genre d'informations.

Pour le moment tu ne fournis que l'IP donc l'attractivité est limitée mais si un jour tu fournis la geoloc ou d'autres infos ca peut attirer des spammeurs et autres 'bandits' de l'Internet.
Et bien quand il fournira des services avancés et coûteux, il mettra une interface évoluée avec des identifiants des clients et des clefs.

Pas mal de ces services gratuits ont fermé devant les abus ou ont mis en en place des restrictions d'usage (X requêtes/heure ou auto-ban):
http://www.telize.com/ par exemple a fermé. https://freegeoip.net limite l'usage. http://ip-api.com/ active un bannissement automatique qu'on peut  retirer via un captcha, etc

Surveilles donc bien ton trafic et si tu vois trop de requêtes sur ipv4.lafibre.info ou ipv6.lafibre.info (ou meme ip.lafibre.info), la cause en sera probablement le CORS.

Il faut juste en être conscient. CORS est la pour protéger ton serveur et pas l'inverse.
Je n'ai pas compris. Qu'entends-tu par "inverse"?
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 06 mars 2016 à 18:37:44
Quel domaine?

"lafibre.info"

La page web située a "https://ip.lafibre.info/test.php" fait une requête XHR de "https://ipv4.lafibre.info/ip.php": c'est le meme domaine donc CORS n'est pas nécessaire.

Je t'invite a lire la doc de CORS, t'as pas du bien comprendre a quoi ca sert et pourquoi ca existe vu le reste de tes questions/remarques.

y'a une vf ici: https://developer.mozilla.org/fr/docs/HTTP/Access_control_CORS
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 06 mars 2016 à 19:07:36
      <ul><li>Votre IPv4 publique est <strong><font color=red><div id="ipv4"></div><div id="ipv4"></div></li>
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 06 mars 2016 à 19:34:42
Je t'invite a lire la doc de CORS, t'as pas du bien comprendre a quoi ca sert et pourquoi ca existe vu le reste de tes questions/remarques.

y'a une vf ici: https://developer.mozilla.org/fr/docs/HTTP/Access_control_CORS
OK j'ai lu et je ne vois pas bien ce que tu voulais que je lise.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 06 mars 2016 à 20:22:38
Citer
Changing origin
A page may change its own origin with some limitations. A script can set the value of document.domain to its current domain or a superdomain of its current domain. If it sets it to a superdomain of its current domain, the shorter domain is used for subsequent origin checks. For example, assume a script in the document at http://store.company.com/dir/other.html executes the following statement:

document.domain = "company.com";
After that statement executes, the page can pass the origin check with http://company.com/dir/page.html (assuming http://company.com/dir/page.html sets its document.domain to "company.com" to indicate that it wishes to allow that - see document.domain for more). However, company.com could not set document.domain to othercompany.com since that is not a superdomain of company.com.

https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 06 mars 2016 à 21:40:12
J'ai mis à jour la page https://ip.lafibre.info (je verrais plus tard, pour retirer CORS)
- Le script https://code.jquery.com/jquery-latest.pack.js est maintenant en interne. Au passage je ne comprends pas pourquoi "jquery-latest" est en version 1.11 alors que la 1.12.1 est sortie (c'est celle que j'utilise)
- L'appel à https://ipv4.lafibre.info/ip.php est fait en http, si la page parent est appelée en http et elle est appelée en https, si la page parent est appelé en https.

Mes 2 questions :
- Pourquoi il y a un retour à la ligne avant l’affichage de l'IPv4 (quand on à IPv6 d'activé), il n'y a pas de retour a la ligne retourné par https://ipv4.lafibre.info/ip.php ?
- Comment obtenir reverse DNS et le port TCP de retour utilisé pour cette connexion ? Il me semble pertinent d'afficher ces infos en IPv4 et en IPv6

Le script php que j'utilise : (le script qui récupère l'IPv4 quand on est en IPv6 est à la fin, il me semble que c'est les recommandations de mettre les scripts juste avant </body>)

<?php
$ClientIp = $_SERVER['REMOTE_ADDR'];//On obtient l'adresse IP
if(strstr($ClientIp,":")) {
$IP = "IPv6";
}
else {
$IP = "IPv4";
}
$ClientPort = $_SERVER['REMOTE_PORT'];//On obtient le port source
$ClientHost = htmlspecialchars(gethostbyaddr($ClientIp));//on transforme en Host avec adresse du FAI
$ClientUA = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);

echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>Quelle est mon IP ?</title>
      <meta name="description" content="Donne votre adresse IP, le reverse-DNS et le FAI associé" />
      <meta name="author" content="Vivien - https://lafibre.info" />
      <meta name="keywords" content="IP, reverse DNS" />
    </head>
<body>
<a href="https://lafibre.info"><img src="images/lafibre.png" alt="LaFibre.info" /></a>
<br />
<h4>Informations données par votre navigateur aux sites internet :</h4>
      <ul><li>';
if ("$IP" == "IPv4")
        echo 'Votre IPv4 publique est <strong><font color=red>',$ClientIp,'</font></strong></li>
<li>IPv6 n\'a pas été détecté. <small>(Si vous pensez avoir une connectivité IPv6, vous pouvez forcer l\'utilisation d\'IPv6 en cliquant sur: <a href="https://ipv6.lafibre.info" title="IPv6 publique">https://ipv6.lafibre.info</a> - la page ne se chargera pas, en cas d\'absence d\'IPv6)</small>';
else
        echo 'Votre IPv4 publique est <strong><font color=red><div id="ipv4"></div><div id="ipv4"></div></font></strong></li>
      <li>Votre IPv6 publique est <strong><font color=green>',$ClientIp,'</font></strong>';
echo '</li>
      <li>La version du protocole IP utilisée par défault <small>(et pour charger cette page)</small> est <strong><font color=';

if ("$IP" == "IPv4")
        echo 'red';
else
        echo 'green';
echo '>',$IP,'</font></strong></li>
      <li>Votre nom d\'hôte ',$IP,' ("reverse DNS") est <strong>',$ClientHost,'</strong></li>
      <li>Le port TCP source utilisé par votre connexion ',$IP,' est <strong>';
if ("$ClientPort" < "32768")
echo '<font color=red>',$ClientPort,'</font></strong> <small>(<a href="https://lafibre.info/systeme-exploitation/local_port_range" title="Plage de ports dynamique du protocole TCP" target="_blank">Plus d\'informations</a>)</small></li>';
else
echo '<font color=green>',$ClientPort,'</font></strong> <small>(<a href="https://lafibre.info/systeme-exploitation/local_port_range" title="Plage de ports dynamique du protocole TCP" target="_blank">Plus d\'informations</a>)</small></li>';
echo '
      <li>Le port TCP destination utilisé est <strong>',$_SERVER['SERVER_PORT'],'</strong></li>
      <li>Votre connexion sur cette page est <strong>';
if ($_SERVER['HTTPS'] == "on")
echo 'chiffrée avec https</strong></li>';
else
echo 'en clair</strong></li>';
echo '
      <li>La version du protocole HTTP utilisée est <strong>',$_SERVER['SERVER_PROTOCOL'],'</strong></li>
      <li>Votre navigateur est <strong>',getenv("HTTP_USER_AGENT"),'</strong></li></ul>
<br />';

[...]

//Script pour récupérer l'IPv4
if ("$IP" == "IPv6") {
echo '<script src="js/jquery-1.12.1.min.js"></script>
<script>
$(document).ready( function() {
   $("#ipv4").load("http';

if ($_SERVER['HTTPS'] == "on")
echo 's';
echo '://ipv4.lafibre.info/ip.php");
});
</script>';
}

echo '</body>
</html>';
?>
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 06 mars 2016 à 21:50:16
<div id="ipv4"></div><div id="ipv4">
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Marin le 06 mars 2016 à 23:10:07
- Comment obtenir reverse DNS et le port TCP de retour utilisé pour cette connexion ? Il me semble pertinent d'afficher ces infos en IPv4 et en IPv6

Tu génères avec du code PHP équivalent ce qui devrait apparaître à cet endroit de la page, en y chargeant un fichier autre que le /ip.php ? Ou alors tu mets les données dans un JSON et tu les dispatches aux bons endroits avec un peu plus de JavaScript.

- Pourquoi il y a un retour à la ligne avant l’affichage de l'IPv4 (quand on à IPv6 d'activé), il n'y a pas de retour a la ligne retourné par https://ipv4.lafibre.info/ip.php ?

Le « <div id="ipv4"></div> » est en double. (C'est invalide, tu n'es pas censé avoir deux éléments avec le même id en HTML, si c'était voulu utiliser class="").

"http';

if ($_SERVER['HTTPS'] == "on")
echo 's';
echo '://ipv4.lafibre.info/ip.php"

Il n'y a pas de raison d'utiliser une condition comme ça, il suffit de charger la ressource "//ipv4.lafibre.info/ip.php" et le navigateur s'adaptera automatiquement.

<script src="js/jquery-1.12.1.min.js"></script>
<script>
$(document).ready( function() {
   $("#ipv4").load("http';

if ($_SERVER['HTTPS'] == "on")
echo 's';
echo '://ipv4.lafibre.info/ip.php");
});

jQuery est overkill pour ça. Tu peux aussi bien utiliser XMLHttpRequest, l'API native pour faire des requêtes en JavaScript. Le code équivalent est :

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '//ipv4.lafibre.info/ip.php', true);
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 4)
            document.getElementById('ipv4').innerHTML = xhr.responseText;
    };
    xhr.send(null);
}

Et je crois que tu n'as pas besoin du window.onload (équivalent du $(document).ready()) si tu mets ton code à la fin du <body>. Le code ci-dessus prend soin de n'utiliser aucune API "récente" pour garder la compatibilité avec les vieux IE, autrement il pourrait être un peu plus succinct.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 07 mars 2016 à 00:00:57
JQuery est plus 'parlant' et facile a comprendre pour le profane si tu veux modifier et ajouter des trucs toi-meme par la suite.

Apres s'il ne t'importe pas de comprendre comment ca fonctionne derriere ou toujours dépendre de "ceux qui savent" pour faire une petite modif ou un évolution future, dans ce cas, la solution de Marin est recommandée.

ps: si tu veux être natif, y'a xhr2 qui est un peu plus moderne ('onload' au lieu de 'onreadystatechange'):

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '//ipv4.lafibre.info/ip.php', true);
    xhr.onload = function() { document.getElementById('ipv4').innerHTML = xhr.responseText; };
    xhr.send(null);
}

Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 01:05:56
<?php

..............................

$ClientPort = $_SERVER['REMOTE_PORT'];//On obtient le port source
$ClientHost = htmlspecialchars(gethostbyaddr($ClientIp));//on transforme en Host avec adresse du FAI
$ClientUA = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);

..............................

      <li>Votre navigateur est <strong>',getenv("HTTP_USER_AGENT"),'</strong></li></ul>
<br />';
Pourquoi appeler htmlspecialchars pour ensuite utiliser directement getenv("HTTP_USER_AGENT")?
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 01:21:56
Le « <div id="ipv4"></div> » est en double. (C'est invalide, tu n'es pas censé avoir deux éléments avec le même id en HTML, si c'était voulu utiliser class="").
Oui d'ailleurs je l'ai juste signalé deux fois! (Bizarrement la console de Google Chrome n'affiche absolument rien à ce sujet alors qu'elle est en général assez prolixe sur les anomalies des pages Web.)

Non, ce n'est pas le souci : tu peux supprimer un <div> en interactif dans Google Chrome et cela ne corrige pas le souci.

jQuery est overkill pour ça. Tu peux aussi bien utiliser XMLHttpRequest, l'API native pour faire des requêtes en JavaScript. Le code équivalent est :
Et puis surtout je ne vois pas de gain en terme d'abstraction ou de quoi que ce soit d'autre.

Après peut être que jQuery est le langage de programmation du Web moderne et qu'il faut utiliser parce que.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 01:36:18
- Pourquoi il y a un retour à la ligne avant l’affichage de l'IPv4 (quand on à IPv6 d'activé), il n'y a pas de retour a la ligne retourné par https://ipv4.lafibre.info/ip.php ?
Dans ces cas là :

- ou bien tu apprends par cœur toute la spécification HTML

- ou bien tu vas consulter la doc de chaque élèment utilisé, ici DIV :

Citer
Example
A section in a document that will be displayed in blue:

<div style="color:#0000FF">
  <h3>This is a heading</h3>
  <p>This is a paragraph.</p>
</div>


Definition and Usage
The <div> tag defines a division or a section in an HTML document.

The <div> tag is used to group block-elements to format them with CSS.
http://www.w3schools.com/tags/tag_div.asp

- ou bien tu demandes au navigateur quels sont et d'où proviennent les attributs d'affichage de chaque élèment :

user agent stylesheet
div {
    display: block;
}


Et pour comprendre la fonction de l'attribut display :

Citer
CSS Syntax
display: value;

Property Values

Value    Description   
inline    Default value. Displays an element as an inline element (like <span>)
block    Displays an element as a block element (like <p>)
http://www.w3schools.com/cssref/pr_class_display.asp
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 02:54:06
<?php
$ClientIp = $_SERVER['REMOTE_ADDR'];//On obtient l'adresse IP
if(strstr($ClientIp,":")) {
$IP = "IPv6";
}
else {
$IP = "IPv4";
}
$ClientPort = $_SERVER['REMOTE_PORT'];//On obtient le port source
$ClientHost = htmlspecialchars(gethostbyaddr($ClientIp));//on transforme en Host avec adresse du FAI
$ClientUA = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);

echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>Quelle est mon IP ?</title>
      <meta name="description" content="Donne votre adresse IP, le reverse-DNS et le FAI associé" />
      <meta name="author" content="Vivien - https://lafibre.info" />
      <meta name="keywords" content="IP, reverse DNS" />
    </head>
<body>
<a href="https://lafibre.info"><img src="images/lafibre.png" alt="LaFibre.info" /></a>
<br />
<h4>Informations données par votre navigateur aux sites internet :</h4>
      <ul><li>';
if ("$IP" == "IPv4")
        echo 'Votre IPv4 publique est <strong><font color=red>',$ClientIp,'</font></strong></li>
<li>IPv6 n\'a pas été détecté. <small>(Si vous pensez avoir une connectivité IPv6, vous pouvez forcer l\'utilisation d\'IPv6 en cliquant sur: <a href="https://ipv6.lafibre.info" title="IPv6 publique">https://ipv6.lafibre.info</a> - la page ne se chargera pas, en cas d\'absence d\'IPv6)</small>';
else
        echo 'Votre IPv4 publique est <strong><font color=red><div id="ipv4"></div><div id="ipv4"></div></font></strong></li>
      <li>Votre IPv6 publique est <strong><font color=green>',$ClientIp,'</font></strong>';
echo '</li>
      <li>La version du protocole IP utilisée par défault <small>(et pour charger cette page)</small> est <strong><font color=';

if ("$IP" == "IPv4")
        echo 'red';
else
        echo 'green';
echo '>',$IP,'</font></strong></li>
      <li>Votre nom d\'hôte ',$IP,' ("reverse DNS") est <strong>',$ClientHost,'</strong></li>
      <li>Le port TCP source utilisé par votre connexion ',$IP,' est <strong>';
if ("$ClientPort" < "32768")
echo '<font color=red>',$ClientPort,'</font></strong> <small>(<a href="https://lafibre.info/systeme-exploitation/local_port_range" title="Plage de ports dynamique du protocole TCP" target="_blank">Plus d\'informations</a>)</small></li>';
else
echo '<font color=green>',$ClientPort,'</font></strong> <small>(<a href="https://lafibre.info/systeme-exploitation/local_port_range" title="Plage de ports dynamique du protocole TCP" target="_blank">Plus d\'informations</a>)</small></li>';
echo '
      <li>Le port TCP destination utilisé est <strong>',$_SERVER['SERVER_PORT'],'</strong></li>
      <li>Votre connexion sur cette page est <strong>';
if ($_SERVER['HTTPS'] == "on")
echo 'chiffrée avec https</strong></li>';
else
echo 'en clair</strong></li>';
echo '
      <li>La version du protocole HTTP utilisée est <strong>',$_SERVER['SERVER_PROTOCOL'],'</strong></li>
      <li>Votre navigateur est <strong>',getenv("HTTP_USER_AGENT"),'</strong></li></ul>
<br />';

[...]

//Script pour récupérer l'IPv4
if ("$IP" == "IPv6") {
echo '<script src="js/jquery-1.12.1.min.js"></script>
<script>
$(document).ready( function() {
   $("#ipv4").load("http';

if ($_SERVER['HTTPS'] == "on")
echo 's';
echo '://ipv4.lafibre.info/ip.php");
});
</script>';
}

echo '</body>
</html>';
?>
Est-ce qu'on peut produire du code encore plus infect?

Est-ce qu'il existe un langage pire que PHP pour faire des pages Web?

Même le shell ferait mieux!
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 04:29:18
- Comment obtenir reverse DNS et le port TCP de retour utilisé pour cette connexion ? Il me semble pertinent d'afficher ces infos en IPv4 et en IPv6
La façon la plus simple (mais pas la plus flexible) de faire cela serait d'intégrer une iframe pour afficher toutes ces informations.

Mais cela ne permettra pas de faire des calculs ou des comparaisons utilisant les informations IPv4 et IPv6 en même temps.

Sinon tu généralises la méthode pour récupérer l'adresse IP, avec plus d'informations, que tu mets dans un format facile à traiter.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Marin le 07 mars 2016 à 09:03:18
JQuery est plus 'parlant' et facile a comprendre pour le profane si tu veux modifier et ajouter des trucs toi-meme par la suite.

Apres s'il ne t'importe pas de comprendre comment ca fonctionne derriere ou toujours dépendre de "ceux qui savent" pour faire une petite modif ou un évolution future, dans ce cas, la solution de Marin est recommandée.

J'ai l'impression que c'est une solution (jQuery) qui est certes plus compacte mais ne saurait être dépeinte comme objectivement plus intuitive. Certes, il y a plein de sucre syntaxique, mais est-ce que « $("# » est censé être autrement plus « parlant / profane / moins "ceux qui savent" » pour « donne-moi l'élèment dont l'attribut ID correspond à la sous-chaîne de caractères subséquente » que l'équivalent DOM ? Dans un extrait plein de code boiterplate pour une tâche à la sortie plus ou moins basique, j'aurais bien voulu, mais là tu as à peine l'overhead des quelques paramètres XMLHttpRequest obligatoires en plus, tu survoles la doc de la page MDN et tu sais à quoi ils servent. Ce n'est peut-être pas significativement mieux que quelque chose comme $.get() et ses paramètres facultatifs à l'ordre arbitraire d'un point de vue apprentissage. Ce n'est pas parce qu'une solution jQueryifiée sort quasi-systématiquement en première position des votes Stack Overflow qu'elle est systématiquement meilleure ou plus simple, juste plus attrayante (et en plus il suffit de scroller vers la deuxième en général).

Après, attention, je ne suis pas un hater de jQuery et peux encenser son utilisation pour des projets à la couche présentation lourde (aujourd'hui, si on n'est déjà pas à un ou deux niveaux d'abstraction au dessus), et admire sa compacité utile surtout aux "ceux qui savent". Mais pour évaluer et comparer l'intuitivité de deux solutions auprès d'un débutant, il faut les mettre sur un banc similaire d'un point de vue fonctionnel et penser ergonomie. Ici, un indicateur constructif pourrait être le caractère sommaire et sobre technologiquement qu'on peut prêter et vouloir prêter à la page que vivien a (commencé à) construire : on parle souvent stats avec des extraits d'User-Agent exotiques sur les forums, ou des sujets comme ceux-ci, vouloir présenter une interface simple et universelle pour afficher ce genre d'information peut s'inscrire dans une démarche d'unification et de proposition d'une interface qui fonctionne même sur le navigateur de stock de ton Amiga avec une dégradation en mode meilleure effort (voire de minimalisme) ?
Rien que ça, ça donne une valeur extérieure au projet, d'une manière qui peut le démarquer intrinsèquement de l'exemple du chapitre 2-Site du Zéro pour lui donner des lettres d'utilité voire de raison individuelle d'être, et commencer par ne pas charger ≃ 100 Ko de code générique depuis une ressource externe en SSL pour l'équivalent de 3 à 4 lignes peut être une bonne base pour ne pas faire pire par la suite.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 07 mars 2016 à 11:45:29
Si on va dans ce sens, il faut carrèment ne pas faire de JS et de XHR non plus, peut-être une simple iframe ?

Comme toujours en programmation il y a des compromis à  faire en fonction de plusieurs critères dont l'un des 1ers est l'objectif.
La on ne sait pas trop ou Vivien veut aller a terme, lui non plus surement. Ca commence par une simple page, puis des choses d'ajoutent au fur et a mesure. Demain ca serait peut-être la géoloc et les n° d'AS ? certe on peut tout faire en JS basique mais à  partir d'un certain seuil de complexité , un simple framework peut éventuellement améliorer les choses (ou les aggraver ... ca arrive).

C'est certain que pour remplacer 5 lignes de JS c'est overkill mais si le projet grossit ca peut être une bonne base des le départ plutôt que de devoir réécrire tout a un moment. Et a t'on besoin d'apprendre 100% du JS natif pour faire des choses simples et efficaces en JQuery ?

Je pense qu'il vaut mieux lui présenter plusieurs choix techniques et les +/- de chacun, d'autant s'il veut faire plus tard par lui-meme plutôt que de toujours dépendre d'autres. Il faut qu'il fasse aussi un choix a un moment en fonction de la cible visée, s'il y en a une.

Il faut qu'il pense aussi a la taille de la population susceptible de l'aider, y'a pas forcement que nous. JQuery a l'avantage d'être très pratiqué donc le 'potentiel' d'assistance est plus large que du JS natif (assistance = recherche web aussi).

Apres personnellement  je n'aime pas JQuery ni JS d'ailleurs. Je trouve tout cet éco-systeme JS déplorable mais bon on n'a pas trop le choix en ce moment meme si les choses évoluent lentement.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 18:28:44
J'ai l'impression que c'est une solution (jQuery) qui est certes plus compacte mais ne saurait être dépeinte comme objectivement plus intuitive. Certes, il y a plein de sucre syntaxique, mais est-ce que « $("# » est censé être autrement plus « parlant / profane / moins "ceux qui savent" » pour « donne-moi l'élèment dont l'attribut ID correspond à la sous-chaîne de caractères subséquente » que l'équivalent DOM ?
Je confirme : pour un ignorant comme moi, c'est du charabia.

On dirait des formules magiques, comme du Perl!
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 18:37:18
Si on va dans ce sens, il faut carrèment ne pas faire de JS et de XHR non plus, peut-être une simple iframe ?
Oui pour moi une iframe était la proposition de base, mais à un moment on veut pouvoir indiquer si le client est en 6rd (ou 4rd ou que sais-je).

Apres personnellement  je n'aime pas JQuery ni JS d'ailleurs. Je trouve tout cet éco-systeme JS déplorable mais bon on n'a pas trop le choix en ce moment meme si les choses évoluent lentement.
Il n'est contestable que JS a été conçu par des californiens fumeurs de beuh complètement dérangés.

Enfin en tout c'est la seule explication que j'ai trouvé.

Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 07 mars 2016 à 18:40:19
Le « <div id="ipv4"></div> » est en double. (C'est invalide, tu n'es pas censé avoir deux éléments avec le même id en HTML, si c'était voulu utiliser class="").
Le div id n'est plus en double, mais il y a toujours un retour à la ligne que je ne m'explique pas.


Il n'y a pas de raison d'utiliser une condition comme ça, il suffit de charger la ressource "//ipv4.lafibre.info/ip.php" et le navigateur s'adaptera automatiquement.
Effectivement, c'est plus simple comme ça. C'est étonnant car peu de sites disponible en http et https l'utilisent : quand on charge la version http du site, il y a de nombreux éléments https chargés.

Pourquoi appeler htmlspecialchars pour ensuite utiliser directement getenv("HTTP_USER_AGENT")?
C'est corrigé, le but est effectivement d'utiliser htmlspecialchars pour protéger d'une attaque via l'user-agent.

Merci pour avoir repéré le pb de sécurité.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 19:16:39
Le div id n'est plus en double, mais il y a toujours un retour à la ligne que je ne m'explique pas.
J'ai expliqué pourquoi div ici est essentiellement équivalent à p.

Effectivement, c'est plus simple comme ça. C'est étonnant car peu de sites disponible en http et https l'utilisent :
Moi aussi ça m'étonne.

Merci pour avoir repéré le pb de sécurité.
Je ne crois pas qu'une faille de sécurité exploitable existait.

Mais avoir htmlspecialchars partout :
- est plus régulier
- donc plus simple
- plus facile que de faire une analyse de sécurité en tenant compte de toutes les configurations imaginables

Donc pour moi avoir mis htmlspecialchars partout rend la vérification du code moins "prise de tête" et donc rend le code au final plus sûr même si certaines occurrences n'étaient pas indispensables.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 07 mars 2016 à 19:34:29
Ou alors tu mets les données dans un JSON et tu les dispatches aux bons endroits avec un peu plus de JavaScript.
J'ai réalisé le php qui crée le json : https://ip.lafibre.info/json.php

<?php
if(strstr($_SERVER['REMOTE_ADDR'],":")) {
$IP = "IPv6";
}
else {
$IP = "IPv4";
}
$hostname = htmlspecialchars(gethostbyaddr($_SERVER['REMOTE_ADDR']));
$useragent = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);

echo '{
    "ip_version": "',$IP,'",
    "ip": "',$_SERVER['REMOTE_ADDR'],'",
    "hostname": "',$hostname,'",
    "remote_port": "',$_SERVER['REMOTE_PORT'],'",
    "server_port": "',$_SERVER['SERVER_PORT'],'",
    "https": "',$_SERVER['HTTPS'],'",
    "server_protocol": "',$_SERVER['SERVER_PROTOCOL'],'",
    "user-agent": "',$useragent,'"
}';
?>

Je veut bien de l'aide pour le code qui récupérer les éléments.

Comme toujours en programmation il y a des compromis à  faire en fonction de plusieurs critères dont l'un des 1ers est l'objectif.
La on ne sait pas trop ou Vivien veut aller a terme, lui non plus surement. Ca commence par une simple page, puis des choses d'ajoutent au fur et a mesure. Demain ca serait peut-être la géoloc et les n° d'AS ? certe on peut tout faire en JS basique mais à  partir d'un certain seuil de complexité , un simple framework peut éventuellement améliorer les choses (ou les aggraver ... ca arrive).
L'objectif court terme est de :
- déterminer l'AS de l'IP
- déterminer le pays de l'IP
- déterminer avec précision le système d'exploitation (via le user-agent) pour déterminer si le port de retour est en adéquation et donc mieux détecter le CG-NAT
- déterminer avec précision le navigateur et déterminer ce qui ne vient pas d'un navigateur, mais d'un robot : cela se fait via le user-agent et en combinant la version du protocole http : un navigateur moderne qui fait du http1.0 on sait que c'est un robot.

Objectif final : faire un outil d'analyse de log Apache2 qui fait des logos IPv4 vs IPv6 par AS, par système d’exploitation et navigateur. Détecter le % de retour de port non conforme en IPv4 et en IPv6 afin de déterminer le % de connexion qui passent par un CG-Nat. Avoir des stats de flux non humain par AS,...

Vous savez tout !
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 07 mars 2016 à 19:54:42
Je me demande aussi comment faire proprement pour ne pas avoir systématiquement dans le logs :
PHP Notice:  Undefined index: HTTPS in /home/ip.lafibre.info/json.php on line 17quand la page est appelée en http.

$_SERVER['HTTPS'] => nul en http et 'ON' en https
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: jack le 07 mars 2016 à 19:56:46
if(isset($_SERVER['HTTPS'])) ou un truc du genre

Idée: mettre le code sur github, par exemple
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 07 mars 2016 à 20:14:18
Oui, l'idée est de faire un truc open source utilisable par tous, par contre, il faut attendre d'avoir un peu avancé dans le projet pour le mettre sur github

if(isset($_SERVER['HTTPS'])) ou un truc du genre
C'est parfait, plus d'erreur dans mes logs en http
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 07 mars 2016 à 20:25:53
Je veut bien de l'aide pour le code qui récupérer les éléments.
L'objectif court terme est de :
- déterminer l'AS de l'IP
- déterminer le pays de l'IP
- déterminer avec précision le système d'exploitation (via le user-agent) pour déterminer si le port de retour est en adéquation et donc mieux détecter le CG-NAT
- déterminer avec précision le navigateur et déterminer ce qui ne vient pas d'un navigateur, mais d'un robot : cela se fait via le user-agent et en combinant la version du protocole http : un navigateur moderne qui fait du http1.0 on sait que c'est un robot.

Objectif final : faire un outil d'analyse de log Apache2 qui fait des logos IPv4 vs IPv6 par AS, par système d’exploitation et navigateur. Détecter le % de retour de port non conforme en IPv4 et en IPv6 afin de déterminer le % de connexion qui passent par un CG-Nat. Avoir des stats de flux non humain par AS,...

Vous savez tout !

- quand tu parles des 'logs' ce sont que les logs de https://ip.lafibre.info/ ou tout tes logs, y compris ceux du forum (lafibre.info) ?

- "déterminer l'AS de l'IP & déterminer le pays de l'IP": coté client ou client serveur ? pour afficher sur la page https://ip.lafibre.info/ ou juste pour augmenter les logs coté serveur de 2 colonnes (AS et Pays ) ?

- idem pour l'OS et le CGNAT.

- en fait la principale question qui regroupe les 3 précédentes c'est : veux tu une solution 'coté serveur' (back-end)  qui va 'traiter' tes logs, les augmenter d'informations (AS,OS, Pays, CGNAT ou pas, etc) et ensuite faire des statistiques/analyses dessus OU une solution "full stack" qui va aussi, en live, renvoyer a l'utilisateur ces informations a l'instar de ce qu'il y a déjà dans https://ip.lafibre.info/ ?

c'est la question clé, parce que si l'objectif final c'est juste de "faire un outil d'analyse de log Apache2", alors tu peux te concentrer que sur ca et oublier l'aspect "web". Ca devient principalement un probleme de base de donnée/big data/BI et donc pas besoin de javascript,de programmation et les stack/framework web. Ca change énormèment l'envergure du projet.

- es tu prêt a utiliser des solutions "clé en main" comme ELK ou equivalent ou préférerais tu comprendre "tout ce qui se passe" , voir et appréhender tout le 'code' utilisé en partant d'aucun existant.

Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 07 mars 2016 à 20:32:08
L'idée est d'afficher ces informations sur la page https://ip.lafibre.info pas dans les logs.

L'outil d'analyse de log, l'étape suivante est pour analyser les logs de lafibre.info (mettre en base de donnée les infos par AS et pouvoir les afficher avec un outil php / MySQL comme k-net-stats crée par TiTiDu01 qui permet de voir le trafic K-Net et le ratio IPv4/IPv6 par AS.
Le script PHP (ou autre, mais pourquoi pas utiliser PHP, même si c'est pas exécuter sur une page web) passe chaque log Apache2 et incrèmente des compteur dans la base SQL (nb de hits et taille pour chaque AS et chaque type de navigateur / OS)
=> Analyser la progression d'IPv6 via les logs Apache2 (https://lafibre.info/ipv6/analyser-la-progression-dipv6-via-les-logs-apache2/msg300759/#msg300759)

La taille en base de données est donc relativement indépendante du nombre de Go de log analysés et la recherche d'info est extrêmement rapide, contrairement à une solution big data qui va tout conserver.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Breizh 29 le 07 mars 2016 à 20:36:37
D'ailleurs pourquoi le port TCP s'affiche soit en rouge, soit en vert ?
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 07 mars 2016 à 20:41:17
Rouge => 32000 ports dans la partie inférieure donc soit c'est Windows XP, soit un CG-Nat, soit une configuration modifiée de Windows.

Une fois analysé le type d'OS, cela serait rouge si c'est hors de la page par défaut de l'OS.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 20:54:50
Ou bien un autre OS que Windows!
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 07 mars 2016 à 21:01:41
D'ailleurs pourquoi le port TCP s'affiche soit en rouge, soit en vert ?
Parce que soi-disant utiliser un port "bas" est "contraire aux normes", ce qui est de l'enfumage évidemment.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 07 mars 2016 à 21:06:09
A terme utiliser Windows XP affichera du vert si < 5000 et du rouge si > 5000.

L'idée est de voir si le % de rouge est plus important chez certains FAI, ce qui signifie que les paquets IP sont plus triturés que chez d'autres où on garde le port d'origine.

C'est une info important qu'on arrive à  avoir quand il y a de nombreuses connexions, cas des log apache2.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 07 mars 2016 à 23:52:57
L'idée est d'afficher ces informations sur la page https://ip.lafibre.info pas dans les logs.

L'outil d'analyse de log, l'étape suivante est pour analyser les logs de lafibre.info (mettre en base de donnée les infos par AS et pouvoir les afficher avec un outil php / MySQL comme k-net-stats crée par TiTiDu01 qui permet de voir le trafic K-Net et le ratio IPv4/IPv6 par AS.
Le script PHP (ou autre, mais pourquoi pas utiliser PHP, même si c'est pas exécuter sur une page web) passe chaque log Apache2 et incrèmente des compteur dans la base SQL (nb de hits et taille pour chaque AS et chaque type de navigateur / OS)
=> Analyser la progression d'IPv6 via les logs Apache2 (https://lafibre.info/ipv6/analyser-la-progression-dipv6-via-les-logs-apache2/msg300759/#msg300759)

La taille en base de données est donc relativement indépendante du nombre de Go de log analysés et la recherche d'info est extrêmement rapide, contrairement à une solution big data qui va tout conserver.

hum y'a donc bien deux projets A et B distincts et ca introduit de la confusion de mélanger les 2 ici.

A: https://ip.lafibre.info et ce qu'il affiche c'est un projet a part entiere et ce sujet ci.

B: L'analyse des logs apache et l'outil d'affichage des stats qui en découle c'est un autre projet discuté sur ce sujet: https://lafibre.info/ipv6/analyser-la-progression-dipv6-via-les-logs-apache2

Il serait plus clair de ne pas faire de mélange/croisement entre les 2.

Quelque sont les infos qu'il te faut afficher dans: https://ip.lafibre.info ?
-AS
-Pays
-
Citer
déterminer avec précision le système d'exploitation (via le user-agent) pour déterminer si le port de retour est en adéquation et donc mieux détecter le CG-NAT
CG-NAT de Free j'imagine ou en général?
si c'est que pour Free, ca doit donc afficher a l'utilisateur un truc du style: 'vous utilisez du CG-NAT Free (4rd) - port X a Y' ?
Ca ne semble pas dur à  faire, on n'a pas besoin de l'user-agent et l'OS: si on a l'IPv6 et l'IPv4 (via le xhr) du visiteur et si on applique la formule de Marin, on peut savoir si c'est un client CG-NAT Free. Ca peut se faire coté client en JS si le serveur renvoi via xhr l'ipv4 et le port et l'IPv6 on l'a par la page web (le n° port sert juste a valider la formule).

Le 'travail' à  faire est donc assez simple: tu as déjà la réponse en json avec le n° de port , il suffit donc juste de faire des calculs en JS coté client. Tu peux aussi vouloir 'logger' ca coté serveur (et/ou faire les calculs coté serveur) donc on peut passer l'ipv6 en paramètre a l'xhr.

voila un code simple pour dispatcher les infos json sur les éléments :

HTLM:
ip_version: <div id="ip_version"></div><br>
ip: <div id="ip"></div><br>
hostname: <div id="hostname"></div><br>
remote_port: <div id="remote_port"></div><br>
server_port: <div id="server_port"></div><br>
https: <div id="https"></div><br>
server_protocol: <div id="server_protocol"></div><br>
user-agent: <div id="user-agent"></div><br>

JS:
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://ipv4.lafibre.info/json.php', true);
xhr.onload = function() {
  var response = JSON.parse(xhr.responseText);
  for (var k in response) {
    if (response.hasOwnProperty(k)) {
      document.getElementById(k).innerHTML = response[k];
    }
  }
};
xhr.send(null);
en gros: tu transforme la  réponse json reçue au format texte (xhr.responseText) en objet JS (response) avec JSON.parse.
Ensuite tu accedes directement aux propriétés de cet objet:  response["remote_port"] donne le n° port par exemple.
La je fais une boucle sur tout les propriétés de l'objet et je remplis les éléments du DOM qui ont pour id le nom d'une propriété.
demo ici: https://jsfiddle.net/kgersen/1ewyex58/

Citer
- déterminer avec précision le navigateur et déterminer ce qui ne vient pas d'un navigateur, mais d'un robot : cela se fait via le user-agent et en combinant la version du protocole http : un navigateur moderne qui fait du http1.0 on sait que c'est un robot.
ca ne concerne pas le projet A je présume ? donc c'est pas ce sujet.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Breizh 29 le 08 mars 2016 à 08:25:46
Rouge => 32000 ports dans la partie inférieure donc soit c'est Windows XP, soit un CG-Nat, soit une configuration modifiée de Windows.

Une fois analysé le type d'OS, cela serait rouge si c'est hors de la page par défaut de l'OS.
Les OS sont des WIN 10 Pro non modifier, sur un routeur en DMZ sur la Livebox.
Il y a aussi un oint d'accès Wifi.

Tous mes PC en Win 10 Pro, un en Win 8.1 Pro. Ceux de mes enfants sont encore en Seven mais parce que jamais allumé.

Là je suis en rouge:
Vous utilisez IPv4 avec le port TCP 29537 (Plus d'informations)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 08 mars 2016 à 13:20:49
demo ici: https://jsfiddle.net/kgersen/1ewyex58/
C'est parfait.

C'est normal que si je ne demande pas le 1er élèment de la liste sur ma page, les autres éléments ne se chargent pas ?
(Concrètement, si je ne fait pas référence à "ip_version" dans ma page, alors les autres éléments sont vides)

Autre question, comment éviter un retour à la ligne avant et après ? (cela se voit bien sur ton exemple https://jsfiddle.net/kgersen/1ewyex58/ )

hum y'a donc bien deux projets A et B distincts et ca introduit de la confusion de mélanger les 2 ici.

A: https://ip.lafibre.info et ce qu'il affiche c'est un projet a part entiere et ce sujet ci.

B: L'analyse des logs apache et l'outil d'affichage des stats qui en découle c'est un autre projet discuté sur ce sujet: https://lafibre.info/ipv6/analyser-la-progression-dipv6-via-les-logs-apache2

Il serait plus clair de ne pas faire de mélange/croisement entre les 2.

ca ne concerne pas le projet A je présume ? donc c'est pas ce sujet.

Là effectivement c'est spécifique au projet A, par contre récupérer la localisation d'une IP, déterminer le système d’exploitation et si le port est correct, le navigateur et savoir si c'est un vrai navigateur ou un robot, c'est commun entre A et B.

Dans le projet B, le script va tourner pour chaque ligne Apache2 et incrèmenter les compteurs d'une base de donnée My-SQL au lieu d'afficher les informations.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 08 mars 2016 à 13:37:40
C'est parfait.

C'est normal que si je ne demande pas le 1er élèment de la liste sur ma page, les autres éléments ne se chargent pas ?
(Concrètement, si je ne fait pas référence à "ip_version" dans ma page, alors les autres éléments sont vides)

oui la boucle (for) ne fait pas de controle d'erreur. c'etait juste une démo.
soit tu fais un controle si il n'y a pas d'element du DOM de ce nom la, soit du met explicitement les noms un par un.

boucle avec contrôle: https://jsfiddle.net/kgersen/1ewyex58/1/
a la main: https://jsfiddle.net/kgersen/vxgfhz27/3/

dans tout les cas, utilise la console du navigateur (F12) pour voir les erreurs.

Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 08 mars 2016 à 13:52:07
Autre question, comment éviter un retour à la ligne avant et après ? (cela se voit bien sur ton exemple https://jsfiddle.net/kgersen/1ewyex58/ )
c'est le comportement d'un div.
pareil c'est une demo. il te faut faire du formatage HTML normal, avec ou sans fichier CSS . 'div' c'est un exemple. tu peux utiliser toute balise HTML qui supporte un ID (sur les TD d'une table par exemple). c'est très lié a ta mise en page.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 08 mars 2016 à 14:25:54
Là effectivement c'est spécifique au projet A, par contre récupérer la localisation d'une IP, déterminer le système d’exploitation et si le port est correct, le navigateur et savoir si c'est un vrai navigateur ou un robot, c'est commun entre A et B.

donc il faut en plus:
l'AS
le Pays
determiné l'OS
estimé si le port ok en fonction de l'OS -> c'est quoi l'utilité de ca?
robot ou pas (y'a un intérêt ici ?)

pour l'AS et le Pays il te faut faire de la géoloc coté serveur ou coté client avec la fonction geoloc des navigateurs (mais si le client refuse t'aura rien et c'est pas forcement universel donc pas recommandé ici).
Coté serveur , soit c'est ton serveur web qui le fait: https://github.com/maxmind/mod_maxminddb par exemple
ou faut développer du code et l'interfacer.

user-agent -> OS: il te faut un module coté serveur qui fait cela. sert a rien de réinventer la roue donc il faut en trouver un d'interfaçable facilement avec apache/php.-> google it

estimé si le port en fonction de l'OS: la c'est un petit code spécifique à  faire.

Si tu gardes une base apache+php je ne vais pas pouvoir t'aider plus que cela, j'ai abandonné ces technos et ca ne m’intéresse plus de passer du temps sur ces "vieilleries". Mais y'a surement d'autres personnes ici qui peuvent intervenir.

perso si devais faire un projet pareil, en partant de rien, je ferais un truc "server-side only", full back-end donc, qui renvoi du HTML simple sans JS et xhr:

le client appelle ip.lafibre.info, le serveur regarde l'ip du client:
 A. si ca arrive en IPv6 via ip.lafibre.info il redirige (http redirect) sur ip4.lafibre.info/?ip6=<@ipv6 du client codée et compactée>
 B. si ca arrive en IPv6 via ipv6.lafibre.info/tov4 idem

ipv4.lafibre.info a toutes les infos coté serveur pour faire les calculs et renvoi une simple page HTML toute remplie.

 C .si ca arrive en IPv4 on  traite ipv4.lafibre.info sans paramètre ip6 et y rajoute un bouton 'tester en IPv6' qui va vers ipv6.lafibre.info/tov4. si le client click sur le bouton et a de l'IPv6 fonctionnel ca va arriver en B.

L’inconvenient c'est que ca ne marche pas si le client n'a que de l'IPv6 sans IPv4 ou si la connectivité IPv4 est en carafe a ce moment la (le redirect échoue) mais bon c'est rare et le client peut toujours explicitement demander ipv6.lalibre.info (y'a pas le /tov4 donc ca redirige pas).
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 08 mars 2016 à 19:21:01
oui la boucle (for) ne fait pas de controle d'erreur. c'etait juste une démo.
soit tu fais un controle si il n'y a pas d'element du DOM de ce nom la, soit du met explicitement les noms un par un.
Il y a surtout zéro sécurité.

Ici ça va puisque la page vient du même éditeur (vivien), mais il ne faut surtout pas partager un tel code!
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 08 mars 2016 à 19:29:12
si c'est pas sur le meme domaine il faut activer cors (http://enable-cors.org/) ou utiliser JSONP.
J'ai activé CORS en limitant au domaine : https://ip.lafibre.info

Concrètement, Apache2 rajoute l’entête suivant aux pages en http :
Header set Access-Control-Allow-Origin "http://ip.lafibre.info"et l'entête suivant pour les pages https :
Header set Access-Control-Allow-Origin "https://ip.lafibre.info"
Dans les différents nom de domaines proposé, seul https://ip.lafibre.info permet de voir IPv4 et IPv6 sur une même page.

Exemple avec Orange FTTH :
(https://lafibre.info/images/ipv6/201603_ipv4_ipv6_orange_ftth.png)

Un grand merci kgersen, marin, corrector et jack pour l'aide apportée.

Quand j'aurais un peu de temps, je rajouterais l'AS IPv4 et  l'AS IPv6, via les bases Maxmind. (cf Analyser la progression d'IPv6 via les logs Apache2 (https://lafibre.info/ipv6/analyser-la-progression-dipv6-via-les-logs-apache2/msg223118/#msg223118))
Le but progresser doucement pour mon outil d'analyse des logs.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 08 mars 2016 à 19:44:14
J'ai activé CORS en limitant au domaine : https://ip.lafibre.info

Concrètement, Apache2 rajoute l’entête suivant aux pages en http :
Header set Access-Control-Allow-Origin "http://ip.lafibre.info"et l'entête suivant pour les pages https :
Header set Access-Control-Allow-Origin "https://ip.lafibre.info"
OK mais tu ne craignais vraiment pas l'abus de ressources AMA.

Pendant ce temps là, tu tolères le hotlinking des images du forum non seulement d'autres sites Web mais de logiciels lourds!
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 08 mars 2016 à 19:58:20
perso si devais faire un projet pareil, en partant de rien, je ferais un truc "server-side only", full back-end donc, qui renvoi du HTML simple sans JS et xhr:

le client appelle ip.lafibre.info, le serveur regarde l'ip du client:
 A. si ca arrive en IPv6 via ip.lafibre.info il redirige (http redirect) sur ip4.lafibre.info/?ip6=<@ipv6 du client codée et compactée>
 B. si ca arrive en IPv6 via ipv6.lafibre.info/tov4 idem

ipv4.lafibre.info a toutes les infos coté serveur pour faire les calculs et renvoi une simple page HTML toute remplie.
(beurk sur la méthode)

Ceci me donne envie de faire un rappel concernant le Web :

Les domaines Web différents (sans liens) peuvent échanger des informations par l'intermédiaire du navigateur (sans connexion directe entre serveurs) que vous le vouliez ou non, que vous acceptiez les témoins HTTP (cookies) ou non, que vous bloquiez les témoins "tiers" (quoi que cela puisse signifier) ou non, même si vous bloquez JS.

Ces interactions complexes entre serveurs Web via le navigateur font que la notion de "tiers" est des plus vaseuses.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 08 mars 2016 à 22:48:11
si tu veux détecter un 4rd Free en JS:

copier "ipaddr.min.js" de https://github.com/whitequark/ipaddr.js (ou via npm install ipaddr.js ou bower).

Ce petit bout de JS (7300 octets) permet de parser et manipuler des addresses IP.

puis ce code ci:

<script src="ipaddr.min.js">
/* https://github.com/whitequark/ipaddr.js/ */
</script>

<script>

/*
from: https://lafibre.info/free-10g-epon/zones-de-test-zmd/msg312896/#msg312896
*/

var pfx4 = ipaddr.parse("91.0.0.0");
var pfx6 = ipaddr.parse("2a01:e00::");

function is_in_Free_4rd_dom(ip6)
{
  return ip6.match(pfx6,24); // TODO: /24 is a guess, get the real Free/Iliad 4rd prefix
}

function ip6_to_ip4(ip6) {
  var ip4 = ipaddr.fromByteArray([
    pfx4.octets[0],
    ((ip6.parts[1] & 0xF) << 4) | ((ip6.parts[2] >> 8) & 0x3),
    ((ip6.parts[2] & 0x3F) <<2) | (ip6.parts[3] >> 14),
    (ip6.parts[3] >> 6) & 0xFF
    ]
  );

  return ip4;
}

function ip6_to_ip4_port_range(ip6) {
   //(ip6 << 10) & 0xc000
   return ((ip6.parts[3]>>8) & 0x3);
}

function port_range_to_range(pr) {
  switch(pr)
  {
     case 0: return {from:0    , to:16383};
     case 1: return {from:16384, to:32767};
     case 2: return {from:32768, to:49151};
     case 3: return {from:49152, to:65535};
   }
}

/*
function ip4_to_ip6(ip4,port_range)
{
    //TODO
}
*/
</script>

je l'ai mis ici aussi : https://gist.github.com/kgersen/689ad74c116d0ad1af6d#file-4rd-free-js

Exemple d'utilisation:


<script>

function testFree4rd(ip6)
{
  var addr = ipaddr.parse(ip6);
  if (is_in_Free_4rd_dom(addr))
  {
    console.log(addr.toString() + " might be in Free 4rd domain");
  }
  else
    console.log(addr.toString() + " is not in Free 4rd domain");
}

testFree4rd("2001:db8:1234::1");
testFree4rd("2a01:e0a:1:4bf0::1");

console.log("2a01:e0a:1:4bf0::1 => ipv4 = " + ip6_to_ip4(ipaddr.parse("2a01:e0a:1:4bf0::1")).toString());
var pr = ip6_to_ip4_port_range(ipaddr.parse("2a01:e0a:1:4bf0::1"));
var prt = port_range_to_range(pr);
console.log("2a01:e0a:1:4bf0::1 => port range = " + pr + " (" + prt["from"]+ "-" + prt["to"] + ")");

</script>


ca doit afficher dans la console:

2001:db8:1234::1 is not in Free 4rd domain
2a01:e0a:1:4bf0::1 might be in Free 4rd domain
2a01:e0a:1:4bf0::1 => ipv4 = 91.160.5.47
2a01:e0a:1:4bf0::1 => port range = 3 (49152-65535)


J'ai pas coder la fonction ip4_to_ip6 parce que pas le temps et mal de crane d'avoir fait ip6_to_ip4  ;D (en plus c'est pas testé donc pas garantie d'être juste).
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 09 mars 2016 à 21:25:01
Merci, kgersen, je vais le rajouter, quand il détecte une IPv6 en "2a01:e00::"

J'aimerais traiter le cas rare, mais qui existe où le navigateur préfère IPv4 à IPv6.
Dans ces cas là j'affiche l'IPv6 sur http://ip.lafibre.info/ grâce au système de json :


<li><big>Votre IPv6 publique est <font color=green><strong id="ip"></strong></font></big> (Si le champ est vide, c\'est que vous n\'avez pas de connectivité IPv6).</li>

puis la script :
//JavaScript pour récupérer l'IPv6, pour ceux qui sont en IPv4
if ("$IP" == "IPv4")
echo '
<script>
  var xhr = new XMLHttpRequest();
  xhr.open(\'GET\', \'//ipv6-json.lafibre.info\', true);
  xhr.onload = function() {
    var response = JSON.parse(xhr.responseText);
    for (var k in response) {
      if (response.hasOwnProperty(k)) {
      var elem = document.getElementById(k);
        if (elem) elem.innerHTML = response[k];
      }
    }
  };
  xhr.send(null);
</script>';

La question est de comment faire pour afficher un message "IPv6 non présent" à la place d'un champ vide quand il n'a pas réussi à se connecter au nom de domaine en IPv6 only ?

Au passage, j'ai mis un log spécifique pour pouvoir récupérer les cas où l'IPv4 est par défaut mais où il y aune connectivité IPv6 qui fonctionne.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 09 mars 2016 à 21:47:09
Pourquoi pas faire l'inverse : mention <pas d'IP détectée> que tu remplaces quand tu trouves l'IP?
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 09 mars 2016 à 21:56:48
oui tu met:

<strong id="ip">IPv6 non dectectée</strong>

puis le code replacera "IPv6 non dectectée" par l'IP car le code affecte innerHTML donc remplace tout ce qu'il y a dans la balise strong

tu peux aussi utilisé "xhr.onerror" mais c'est pour les erreurs de haut niveau (erreur 404 par exemple). La c'est une erreur bas niveau (pas de connexion IP ou pas de résolution DNS) donc tu ne chopera pas l'erreur avec onerror.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 09 mars 2016 à 21:58:15
Un timeout ne provoque pas d'erreur? ???
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Marin le 09 mars 2016 à 22:12:56
tu peux aussi utilisé "xhr.onerror" mais c'est pour les erreurs de haut niveau (erreur 404 par exemple). La c'est une erreur bas niveau (pas de connexion IP ou pas de résolution DNS) donc tu ne chopera pas l'erreur avec onerror.

C'est le contraire. onerror est déclenché par une erreur réseau, et c'est onload qui est appelé si une réponse 404 est bien transmise.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 09 mars 2016 à 22:16:28
http://ipv6-json.lafibre.info/


{
    "ip": "2a01:e35:XXXXXXXXXXXXXXX",
    "hostname": "2a01:e35:XXXXXXXXXXXXXXX",
    "remote_port": "<font color=red>23376</font>"
}


lol
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 09 mars 2016 à 22:35:03
C'est le contraire. onerror est déclenché par une erreur réseau, et c'est onload qui est appelé si une réponse 404 est bien transmise.

opps oui exact. On a la réponse HTTP dans xhr.status (200 si ok ou sinon 404, etc).

Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 09 mars 2016 à 23:02:05
par contre les nouveaux "blocks de menu" qui font bouger le texte en dessous quand on les survole, ca donne la nausée  ;D

si tu veux un style "material design" (Android recent), je te conseille MDL (Material Design Lite): https://www.getmdl.io/

Tu pars sur un simple layout (https://www.getmdl.io/components/index.html#layout-section) puis mettre des lists par exemple.

Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 09 mars 2016 à 23:11:11
Ah oui, c'est "too much".

Et pourquoi un texte en gris?
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 09 mars 2016 à 23:27:52
<script>
  var xhr = new XMLHttpRequest();
  xhr.open(\'GET\', \'//ipv6-json.lafibre.info\', true);
  xhr.onload = function() {
    var response = JSON.parse(xhr.responseText);
    for (var k in response) {
      if (response.hasOwnProperty(k)) {
         var elem = document.getElementById(k);
        if (elem) elem.innerHTML = response[k];
      }
    }
  };
  xhr.send(null);
</script>
Tu laisses ipv6-json.lafibre.info modifier assez arbitrairement la page. Ici ça passe parce que ça provient du même service, mais je pense qu'il faudrait mieux énumérer les éléments qui vont être modifiés.

Ainsi, même si tu utilises un service externe pour obtenir ces infos, le piratage de la page est impossible.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 10 mars 2016 à 14:04:03
Les modif sont mis en place : il marque (Vous n'avez pas de connectivité IPv6) ou (Vous n'avez pas de connectivité IPv4) en cas d'absence d'un des deux protocoles.

par contre les nouveaux "blocks de menu" qui font bouger le texte en dessous quand on les survole, ca donne la nausée  ;D
Bon, j'ai bien noté de changer le menu, mais je vais déjà privilégier les nouvelles fonctionnalité.

A noter qu'il est responsive design (le menu se met sous une forme verticale sur un téléphone, voir même un menu "sandwitch" si il n'y a pas de place). Les pages sont html5 (validé par W3C)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 10 mars 2016 à 14:15:24
Le port TCP source utilisé par votre connexion IPv6 est <strong><span class="textevert">>35993</span></strong> <small>

???
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 10 mars 2016 à 16:55:40
Petite boulette (et le site de validation du W3C fait le test en IPv4)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 10 mars 2016 à 17:07:32
Ah oui, je me demandais comment tu avais validé ça!

Tu sais que le validateur SGML est très facile à installer?
Titre: Outils de merde
Posté par: corrector le 12 mars 2016 à 09:40:27
Petite boulette (et le site de validation du W3C fait le test en IPv4)
Selon moi, si ton outil ne détecte même pas les boulettes syntaxiques, tu n'utilises pas un outil adéquat.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 12 mars 2016 à 10:08:24
C'est ça l'outil de validation : https://validator.w3.org/

Je remarque que de nombreux sites ne passent pas (Free, Apple, Microsoft et même Google !)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 12 mars 2016 à 10:25:13
C'est un outil pour un site qui est en ligne.

Il faudrait utiliser un outil directement sur le site en préparation, sur le code PHP.

PHP s'il était conçu pour le Web proposerait ça, mais PHP est une daube qui n'est conçu pour RIEN.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Hugues le 12 mars 2016 à 13:45:36
PHP s'il était conçu pour le Web proposerait ça, mais PHP est une daube qui n'est conçu pour RIEN.

Conçue :)

(Sinon je suis d'accord)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: jack le 12 mars 2016 à 14:04:48
PHP fait très bien ce pour quoi il est conçu.
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: corrector le 12 mars 2016 à 14:26:28
C'est à dire?

Inciter l'utilisateur à tout mélanger dans un gros blog avec du HTML, du JS, du SQL, la logique et la présentation bien imbriqués?
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 27 mars 2016 à 21:11:18
A noter que le javascript suivant n'est pas compatible avec Internet Explorer 9.

Mon PC est un PC sous Windows Vista (donc la dernière version d'Internet Explorer disponible est IE 9 et j'ai une connectivité IPv6 par Orange)
Mon script ne récupère pas d'IPv4 et donc la page affiche : "(Vous n'avez pas de connectivité IPv4)" ce qui est bien entendu faux.

//JavaScript pour récupérer l'IPv4, pour ceux qui sont en IPv6
if ("$IP" == "IPv6")
        echo '
<script>
  var xhr = new XMLHttpRequest();
  xhr.open(\'GET\', \'//ipv4-json.lafibre.info/ipv4.php\', true);
  xhr.onload = function() {
    var response = JSON.parse(xhr.responseText);
    for (var k in response) {
      if (response.hasOwnProperty(k)) {
        var elem = document.getElementById(k);
        if (elem) elem.innerHTML = response[k];
      }
    }
  };
  xhr.send(null);
</script>';
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Marin le 27 mars 2016 à 21:14:51
A noter que le javascript suivant n'est pas compatible avec Internet Explorer 9.

C'est exactement pour ça que j'avais conseillé d'utiliser onreadystatechange plutôt que onload il y a quelques pages :
Le code ci-dessus prend soin de n'utiliser aucune API "récente" pour garder la compatibilité avec les vieux IE, autrement il pourrait être un peu plus succinct.

La matrice de compatibilité de XMLHttpRequest 2 (qui inclut l'ajout de cet évènement) peut être consultée ici : http://caniuse.com/#feat=xhr2
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 28 mars 2016 à 04:57:21
T'as vraiment besoin de supporter ie9 et antérieur ?

caniuse indique 96,37% pour la France pour xhr2... (ie9: 0,71%, ie8: 0,64%, opera mini: 0,17% )

C'est toi qui voit mais il faut avancer a un moment  ... IE9 est 'end of life' chez MS (de meme qu'IE10).

Si tu veux contribuer a un meilleur web, le mieux , quand tu détectes un navigateur ancien est d'indiquer gentiment qu'il est obsolete et de proposer des liens vers des navigateurs plus récents ou sa mise a jour officielle. C'est bien mieux que triturer son code avec des polyfill ou de se limiter a des api 'anciennes' pour quelques % de cas.
Ce n'est pas en étant conciliant avec les utilisateurs pas a jour qu'on fait avancer les choses.

Apres si tu veux 100%, il ne faut pas utiliser JS et XHR mais faire tout coté serveur, comme indiqué dans un message antérieur. Ca marchera dans Lynx, Emacs, curl, etc    :P
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: vivien le 28 mars 2016 à 10:38:25
Bon ok IE9 est plus trop utilisé...

Par contre, il est toujours supporté par Microsoft pendant encore 1an sur Windows Vista (c'est la dernière version de IE disponible sous Vista).

IE 10 est lui supporté par Microsoft encore plus de 6 ans sous Windows Server 2012. (IE 11 n'est pas disponible sous Windows server 2012)

Microsoft se traine encore les boulets...

Par contre sous Windows 7, le support de IE8, IE9, IE10 est arrêté et seul IE11 est maintenu.
Windows 8 n'est plus maintenu (il faut migrer vers Windows 8.1 et ce dernier à IE11 par défaut)

Autant il est difficile de surfer sur Internet avec IE8, autant IE9 cela fonctionne pas trop mal.

Youtube fonctionne en mode HTML5 sous Internet Explorer 9 :

(https://lafibre.info/testdebit/windowsVista/201603_youtube_html5_ie9_vista_1.png)

La "connexion Speed" ne fonctionne pas :
(https://lafibre.info/testdebit/windowsVista/201603_youtube_html5_ie9_vista_2.png)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Breizh 29 le 28 mars 2016 à 12:59:47
IE c'est le truc qui sert une fois pour Dl Firefox ?
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Paul le 28 mars 2016 à 13:03:47
Ah non tu plaisantes ? C'est LE navigateur du moment (si on se replace en 2000)
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: kgersen le 28 mars 2016 à 21:41:27
IE c'est le truc qui sert une fois pour Dl Firefox ?

plus besoin y'a Powershell maintenant. par exemple:

(New-Object System.Net.WebClient).DownloadFile("https://download.mozilla.org/?product=firefox-45.0.1-SSL&os=win64&lang=fr", "ffsetup.exe")et y'a plus qu'a lancer ffsetup.exe pour installer Firefox  ;D
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Nh3xus le 28 mars 2016 à 22:49:49
Sympa l'équivalent Windows de wget  ;D
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Paul le 29 mars 2016 à 09:26:07
plus besoin y'a Powershell maintenant. par exemple:

(New-Object System.Net.WebClient).DownloadFile("https://download.mozilla.org/?product=firefox-45.0.1-SSL&os=win64&lang=fr", "ffsetup.exe")et y'a plus qu'a lancer ffsetup.exe pour installer Firefox  ;D

Ou alors tu mets l'exécutable sur une clé USB avec un autre PC ;D
Titre: Script pour récupérer l'IP et indiquer si c'est une IPv4 ou une IPv6
Posté par: Breizh 29 le 31 mars 2016 à 11:19:03
Ou alors tu mets l'exécutable sur une clé USB avec un autre PC ;D
C'est comme ça que je fais.  :)