Je ne pense pas qu'il y ait une bonne réponse définitive à votre question. Au lieu de cela, il existe un grand nombre de façons de vous rapprocher de ce que vous souhaitez. Par conséquent, je vais fournir quelques conseils pour y parvenir.
Si une machine a plus de 2 interfaces (lo
compte pour une), vous aurez des problèmes pour détecter automatiquement la bonne interface facilement. Voici quelques recettes pour y parvenir.
Le problème, par exemple, est si les hôtes se trouvent dans une zone démilitarisée derrière un pare-feu NAT qui transforme l'adresse IP publique en une adresse IP privée et transmet les demandes. Votre machine peut avoir 10 interfaces, mais une seule correspond à celle publique.
Même la détection automatique ne fonctionne pas si vous êtes en double NAT, où votre pare-feu traduit même l'IP source en quelque chose de complètement différent. Vous ne pouvez donc même pas être sûr que la route par défaut mène à votre interface avec une interface publique.
Détectez-le via l'itinéraire par défaut
C'est ma méthode recommandée pour détecter automatiquement les choses
Quelque chose comme ip r get 1.1.1.1
vous indique généralement l'interface qui a la route par défaut.
Si vous souhaitez recréer cela dans votre langage de script / programmation préféré, utilisez strace ip r get 1.1.1.1
et suivez la route de briques jaunes.
Réglez-le avec /etc/hosts
Ceci est ma recommandation si vous voulez garder le contrôle
Vous pouvez créer une entrée /etc/hosts
comme
80.190.1.3 publicinterfaceip
Ensuite, vous pouvez utiliser cet alias publicinterfaceip
pour faire référence à votre interface publique.
Malheureusement, haproxy
ne gâche pas cette astuce avec IPv6
Utilisez l'environnement
C'est une bonne solution de contournement /etc/hosts
au cas où vous ne seriez pasroot
Identique à /etc/hosts
. mais utilisez l'environnement pour cela. Vous pouvez essayer /etc/profile
ou ~/.profile
pour cela.
Par conséquent, si votre programme a besoin d'une variable, MYPUBLICIP
vous pouvez inclure du code comme (c'est C, n'hésitez pas à créer C ++ à partir de celui-ci):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
Vous pouvez donc appeler votre script / programme /path/to/your/script
comme ceci
MYPUBLICIP=80.190.1.3 /path/to/your/script
cela fonctionne même dans crontab
.
Énumérez toutes les interfaces et éliminez celles que vous ne voulez pas
La voie désespérée si vous ne pouvez pas utiliser ip
Si vous savez ce que vous ne voulez pas, vous pouvez énumérer toutes les interfaces et ignorer toutes les fausses.
Ici semble déjà être une réponse https://stackoverflow.com/a/265978/490291 pour cette approche.
Faites-le comme DLNA
La voie de l'homme ivre qui tente de se noyer dans l'alcool
Vous pouvez essayer d'énumérer toutes les passerelles UPnP sur votre réseau et de cette façon trouver une route appropriée pour quelque chose "externe". Cela peut même être sur une route sur laquelle votre route par défaut ne pointe pas.
Pour en savoir plus, consultez peut-être https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
Cela vous donne une bonne idée de celle qui est votre véritable interface publique, même si votre itinéraire par défaut pointe ailleurs.
Il y en a encore plus
Où la montagne rencontre le prophète
Les routeurs IPv6 s'annoncent pour vous donner le bon préfixe IPv6. L'examen du préfixe vous donne un indice pour savoir s'il a une adresse IP interne ou une adresse IP globale.
Vous pouvez écouter les trames IGMP ou IBGP pour trouver une passerelle appropriée.
Il y a moins de 2 ^ 32 adresses IP. Par conséquent, il ne faut pas longtemps sur un réseau local pour les envoyer tous. Cela vous donne un indice statistique sur l'endroit où se trouve la majorité d'Internet de votre point de vue. Cependant, vous devriez être un peu plus sensible que le célèbre https://de.wikipedia.org/wiki/SQL_Slammer
ICMP et même ARP sont de bonnes sources d'informations sur la bande latérale du réseau. Cela pourrait aussi vous aider.
Vous pouvez utiliser l'adresse de diffusion Ethernet pour contacter tous les périphériques de votre infrastructure réseau, ce qui vous aidera souvent, comme DHCP (même DHCPv6), etc.
Cette liste supplémentaire est probablement infinie et toujours incomplète, car chaque fabricant de périphériques réseau invente activement de nouvelles failles de sécurité sur la façon de détecter automatiquement ses propres périphériques. Ce qui aide souvent beaucoup à détecter une interface publique là où il ne devrait pas y en avoir.
Dit Nuff. En dehors.