web-dev-qa-db-fra.com

Recherche de toutes les adresses IPv4 et IPv6 publiques dans un script Shell UNIX

À des fins de surveillance, j'aimerais connaître toutes les adresses IPv4 et IPv6 publiques d'une box UNIX mobile-warrior.

Notez que cela est différent de Recherche de l'adresse IP publique dans un script Shell en raison des exigences supplémentaires suivantes:

  • le guerrier mobile lui-même n'a probablement aucune adresse IPv4 publique;
  • il peut ou non avoir IPv6 (mais nous ne sommes intéressés que par ceux actifs qui seraient utilisés dans les connexions sortantes réelles);
  • la connexion Internet sous-jacente peut être à charge équilibrée, détails inconnus, où une combinaison de UDP, TCP, ICMP et de l'adresse IP source/destination, peut déterminer quel amont sera utilisé; nous devons faire de notre mieux pour trouver toutes ces adresses IP pour une image complète de la connectivité Internet sous-jacente de la passerelle, sans avoir un accès direct à la passerelle elle-même.
5
cnst

Explication

Nous pouvons déterminer adresse IP publique via DNS avec Dig (l'utilitaire de recherche DNS de BIND), cela nous permet d'essayer les deux UDP (avec le +notcp option) et TCP (+tcp option), ne laissant que ICMP derrière. Cependant, nous pouvons essayer d'envoyer toutes ces requêtes à plusieurs adresses IPv4 et IPv6 de destination indépendantes, ce qui rend plus probable l'équilibrage de la charge de la connexion, produisant des réponses plus uniques.

Il semblerait que le positionnement du -4 et -6 les options avec Dig peuvent également être traitées différemment selon l'ordre des arguments - si elles sont positionnées juste après Dig avant le @ spécificateur, puis il est appliqué comme une exigence stricte; si positionné au-delà du @ spécificateur et/ou comme argument final, il est alors appliqué comme une exigence souple (IPv4 sera utilisé si la connectivité IPv6 est manquante); l'extrait de code ci-dessous l'utilise comme une exigence souple pour éviter d'avoir à implémenter la gestion des erreurs.

Nous pouvons utiliser GNU Parallel pour mélanger et assortir plusieurs commandes et options qui sont en jeu ici.

Solution

Voici la solution complète:

parallel -kj16 Dig -t txt o-o.myaddr.l.google.com +short \
::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp

Voici le même extrait qu'une seule ligne:

parallel -kj16 Dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp

Voici le même extrait SO inline:

parallel -kj16 Dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp


Essai

Voici une démonstration de ce que l'invocation parallel ci-dessus pourrait accomplir:

% parallel -k echo Dig -t txt o-o.myaddr.l.google.com +short \
? ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp
Dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -4 +notcp
Dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -4 +tcp
Dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -6 +notcp
Dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -6 +tcp
Dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -4 +notcp
Dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -4 +tcp
Dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -6 +notcp
Dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -6 +tcp
Dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -4 +notcp
Dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -4 +tcp
Dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -6 +notcp
Dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -6 +tcp
Dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -4 +notcp
Dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -4 +tcp
Dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -6 +notcp
Dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -6 +tcp
%

P.S. Plus de GNU Parallel

Pour étendre notre solution ci-dessus, les éléments suivants pourraient être utilisés pour effectuer des recherches whois et rDNS sur toutes les adresses trouvées; notez que pour que les recherches IPv6 fonctionnent sur BSD et macOS, il peut être nécessaire de spécifier -a pour ARIN, -A pour APNIC ou -r pour RIPE en option pour whois :

parallel -kj16 Dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp | sort -n | uniq | parallel -vk ::: "echo" "Host" "whois -a" :::: /dev/stdin

5
cnst