IPinfo

De knowledge
Aller à la navigation Aller à la recherche

Si vous désirez n'utiliser que 50 000 requetes par mois, c'est idéal!

On s'inscrit en donnant une simple adresse mail et on récupère un token.

export IPINFO_TOKEN="546425b91c438b"  # c'est un exemple

La requête la plus simple :

curl "ipinfo.io/95.142.161.196?token=$IPINFO_TOKEN"

Donne la localisation de l'IP du serveur hébergeant ce wiki.

{
  "ip": "95.142.161.196",
  "hostname": "xvm-161-196.dc0.ghst.net",
  "city": "Paris",
  "region": "Île-de-France",
  "country": "FR",
  "loc": "48.8534,2.3488",
  "org": "AS203476 GANDI SAS",
  "postal": "75000",
  "timezone": "Europe/Paris"
}

Hé oui je suis hébergé chez Gandi depuis plus de 10 ans et j'en suis très satisfait!

Authentification

Nous avons vu ci-dessus une méthode pour utiliser le token. En fait il y en a trois

# Avec Basic Auth user sans password
$ curl -u $IPINFO_TOKEN: ipinfo.io/95.142.161.196

# Avec Bearer token
$ curl -H "Authorization: Bearer $IPINFO_TOKEN" ipinfo.io/95.142.161.196

# Dans la query
$ curl ipinfo.io/95.142.161.196?token=$IPINFO_TOKEN

Les 3 nous donnent le même "json" en réponse.

Protocoles

Dans le cas ci dessus on ne précise pas le protocole. Par défaut c'est le http qui est utilisé par curl mais o peut également utiliser https.

#HTTP
curl -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196
#HTTPS
curl -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196

Les options

IPV4 ou IPV6

IPInfo sait indifféremment traiter des IP V4 ou V6.

#IP V4
curl -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196
#IP V6
curl -u $IPINFO_TOKEN: http://ipinfo.io/2001:4b98:dc0:47:216:3eff:feaa:4fe7

C'est toujours le même serveur donc, la même réponse.

Adresse par defaut

Si on ne précise pas une IP c'est l'adresse IP du client telle qu'elle est vue par le serveur qui est utilisée.

curl -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196
curl -u $IPINFO_TOKEN: http://ipinfo.io/

Donnent le même résultat si le client est 95.142.161.196

Filtrage de la réponse

On peut ne demander que certaines informations.

Si la requête globale :

curl -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196
# Equivalant a la demande explicite 
curl -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196/json

Réponds:

{
  "ip": "95.142.161.196",
  "hostname": "xvm-161-196.dc0.ghst.net",
  "city": "Paris",
  "region": "Île-de-France",
  "country": "FR",
  "loc": "48.8534,2.3488",
  "org": "AS203476 GANDI SAS",
  "postal": "75000",
  "timezone": "Europe/Paris"
}

On peut ne demander que l'un des champs ci-dessus:

curl -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196/country

Nous réponds simplement:

FR

et

curl -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196/timezone

un simple :

Europe/Paris

Le "content-type"

IPInfo nous donne un content type qui correspond à notre demande.

curl -i -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196/
curl -i -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196/json

Les deux commandes nous renvoient un objet JSON et donc un content-type:

HTTP/1.1 200 OK
content-type: application/json; charset=utf-8

En revanche si on demande un champ spécifique.

curl -i -u $IPINFO_TOKEN: http://ipinfo.io/95.142.161.196/country

Réponds par :

HTTP/1.1 200 OK
content-type: text/html; charset=utf-8

Ce qui est étrange on s'attendrais à avoir un text/plain mais non.

De la même façon on peut lui demander un format spécifique avec, par exemple, une option curl -H "Accept: application/json" sur une requête /country rien n'y fait le serveur IPInfo impose son format.

Requêtes en IPV6

Tous les exemples ci dessus ont été fait en IPV4 (même quand on demande le détail d'une adresse IPV6 la requête était faite en IPV4)

Curl IPV4.png

est le résultat dans Wireshark de la requête:

curl -u $IPINFO_TOKEN: http://ipinfo.io/2001:4b98:dc0:47:216:3eff:feaa:4fe7

On voit le GET /2001:4b98:dc0:47:216:3eff:feaa:4fe7 qui est bien la requête du détail d'une adresse IPV6 au travers de trames IPV4.

Pour faire une requête en IPV6 j'au dû passer sur une "vrai" machine linux. Le wsl de windows ne sait pas faire d'IPV6 (derrière un NAT V4 interne à windows)

On tente donc un :

curl -u $IPINFO_TOKEN: http://v6.ipinfo.io/95.142.161.196

v6.ipinfo.io est le DNS de l'ip V6 AAAA du service IPINFO.


Et on utilise tcpdump à la place de wireshark (mon serveur linux fait seulement de la ligne de commande).

00:31:08.884049 IP6 xvm6-dc0-feaa-4fe7.ghst.net.34548 > 2600:1901:0:13e0::.http: Flags [S], seq 2678455541, win 64800, options [mss 1440,sackOK,TS val 3419243256 ecr 0,nop,wscale 7], length 0
00:31:08.884775 IP6 2600:1901:0:13e0::.http > xvm6-dc0-feaa-4fe7.ghst.net.34548: Flags [S.], seq 549389614, ack 2678455542, win 65535, options [mss 1440,sackOK,TS val 1351958675 ecr 3419243256,nop,wscale 8], length 0
00:31:08.884804 IP6 xvm6-dc0-feaa-4fe7.ghst.net.34548 > 2600:1901:0:13e0::.http: Flags [.], ack 1, win 507, options [nop,nop,TS val 3419243257 ecr 1351958675], length 0
00:31:08.884957 IP6 xvm6-dc0-feaa-4fe7.ghst.net.34548 > 2600:1901:0:13e0::.http: Flags [P.], seq 1:134, ack 1, win 507, options [nop,nop,TS val 3419243257 ecr 1351958675], length 133: HTTP: GET /95.142.161.196 HTTP/1.1
00:31:08.885610 IP6 2600:1901:0:13e0::.http > xvm6-dc0-feaa-4fe7.ghst.net.34548: Flags [.], ack 134, win 1054, options [nop,nop,TS val 1351958676 ecr 3419243257], length 0
00:31:08.987450 IP6 2600:1901:0:13e0::.http > xvm6-dc0-feaa-4fe7.ghst.net.34548: Flags [P.], seq 1:629, ack 134, win 1054, options [nop,nop,TS val 1351958778 ecr 3419243257], length 628: HTTP: HTTP/1.1 200 OK
00:31:08.987501 IP6 xvm6-dc0-feaa-4fe7.ghst.net.34548 > 2600:1901:0:13e0::.http: Flags [.], ack 629, win 503, options [nop,nop,TS val 3419243360 ecr 1351958778], length 0
00:31:08.988075 IP6 xvm6-dc0-feaa-4fe7.ghst.net.34548 > 2600:1901:0:13e0::.http: Flags [F.], seq 134, ack 629, win 503, options [nop,nop,TS val 3419243360 ecr 1351958778], length 0
00:31:08.988789 IP6 2600:1901:0:13e0::.http > xvm6-dc0-feaa-4fe7.ghst.net.34548: Flags [F.], seq 629, ack 135, win 1054, options [nop,nop,TS val 1351958779 ecr 3419243360], length 0
00:31:08.988818 IP6 xvm6-dc0-feaa-4fe7.ghst.net.34548 > 2600:1901:0:13e0::.http: Flags [.], ack 630, win 503, options [nop,nop,TS val 3419243361 ecr 1351958779], length 0

Conclusion

On a bien des requêtes IPV6 : IP6 xvm6-dc0-feaa-4fe7.ghst.net.50978 > 2600:1901:0:13e0::.http qui transportent un GET /95.142.161.196 pour avoir les infos d'une adresse IPV4.

Donc la base de donnée interrogée contient les adresses IP V4 comme les adresses IPV6 et le protocole de requête peut être du http et du https sur des trames IPV4 ou IPV6 de façon indifférenciée.

Cette API est très simple, limitée à 50 000 req/mois sans avoir a commencer a payer.