Ich glaube nicht, dass es eine endgültige richtige Antwort auf Ihre Frage gibt. Stattdessen gibt es eine Vielzahl von Möglichkeiten, wie Sie sich Ihren Wünschen nähern können. Daher werde ich einige Hinweise geben, wie es geht.
Wenn eine Maschine mehr als 2 Schnittstellen hat ( lo
zählt als eine), haben Sie Probleme, die richtige Schnittstelle einfach automatisch zu erkennen. Hier sind einige Rezepte, wie es geht.
Das Problem besteht beispielsweise darin, dass sich Hosts in einer DMZ hinter einer NAT-Firewall befinden, die die öffentliche IP in eine private IP ändert und die Anforderungen weiterleitet. Ihr Computer verfügt möglicherweise über 10 Schnittstellen, aber nur eine entspricht der öffentlichen.
Selbst die automatische Erkennung funktioniert nicht, wenn Sie sich auf Double-NAT befinden, wo Ihre Firewall sogar die Quell-IP in etwas völlig anderes übersetzt. Sie können also nicht einmal sicher sein, dass die Standardroute zu Ihrer Schnittstelle mit einer öffentlichen Schnittstelle führt.
Erkennen Sie es über die Standardroute
Dies ist meine empfohlene Methode, um Dinge automatisch zu erkennen
Etwas wie ip r get 1.1.1.1
normalerweise sagt Ihnen die Schnittstelle, die die Standardroute hat.
Wenn Sie dies in Ihrer bevorzugten Skript- / Programmiersprache neu erstellen möchten, verwenden Sie strace ip r get 1.1.1.1
die gelbe Backsteinstraße und folgen Sie ihr.
Stellen Sie es mit ein /etc/hosts
Dies ist meine Empfehlung, wenn Sie die Kontrolle behalten möchten
Sie können einen Eintrag in /etc/hosts
like erstellen
80.190.1.3 publicinterfaceip
Dann können Sie diesen Alias verwenden publicinterfaceip
, um auf Ihre öffentliche Schnittstelle zu verweisen.
Leider haproxy
ist dieser Trick mit IPv6 nicht möglich
Nutze die Umgebung
Dies ist eine gute Problemumgehung, /etc/hosts
falls Sie dies nicht tunroot
Gleich wie /etc/hosts
. aber nutzen Sie die Umgebung dafür. Sie können versuchen /etc/profile
oder ~/.profile
dafür.
Wenn Ihr Programm eine Variable benötigt MYPUBLICIP
, können Sie Code wie folgt einfügen (dies ist C, Sie können C ++ daraus erstellen):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
So können Sie Ihr Skript / Programm /path/to/your/script
so aufrufen
MYPUBLICIP=80.190.1.3 /path/to/your/script
das funktioniert sogar in crontab
.
Zählen Sie alle Schnittstellen auf und entfernen Sie diejenigen, die Sie nicht möchten
Der verzweifelte Weg, wenn Sie nicht verwenden können ip
Wenn Sie wissen, was Sie nicht wollen, können Sie alle Schnittstellen auflisten und alle falschen ignorieren.
Hier scheint bereits eine Antwort https://stackoverflow.com/a/265978/490291 für diesen Ansatz zu sein.
Mach es wie DLNA
Der Weg des Betrunkenen, der versucht, sich in Alkohol zu ertränken
Sie können versuchen, alle UPnP-Gateways in Ihrem Netzwerk aufzulisten, und auf diese Weise einen geeigneten Weg für eine "externe" Sache finden. Dies kann sogar auf einer Route der Fall sein, auf die Ihre Standardroute nicht verweist.
Weitere Informationen hierzu finden Sie unter https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
Dies gibt Ihnen einen guten Eindruck davon, welches Ihre echte öffentliche Schnittstelle ist, selbst wenn Ihre Standardroute auf eine andere Stelle verweist.
Es gibt noch mehr
Wo der Berg auf den Propheten trifft
IPv6-Router bewerben sich selbst, um Ihnen das richtige IPv6-Präfix zu geben. Wenn Sie sich das Präfix ansehen, erhalten Sie einen Hinweis darauf, ob es eine interne oder eine globale IP-Adresse hat.
Sie können nach IGMP- oder IBGP-Frames suchen, um ein geeignetes Gateway zu finden.
Es gibt weniger als 2 ^ 32 IP-Adressen. Daher dauert es in einem LAN nicht lange, sie alle anzupingen. Dies gibt Ihnen einen statistischen Hinweis darauf, wo sich aus Ihrer Sicht der Großteil des Internets befindet. Sie sollten jedoch etwas vernünftiger sein als der berühmte https://de.wikipedia.org/wiki/SQL_Slammer
ICMP und sogar ARP sind gute Quellen für Netzwerkseitenbandinformationen. Es könnte Ihnen auch helfen.
Sie können die Ethernet Broadcast-Adresse verwenden, um mit all Ihren Netzwerkinfrastrukturgeräten in Kontakt zu treten, die häufig hilfreich sind, z. B. DHCP (sogar DHCPv6) usw.
Diese zusätzliche Liste ist wahrscheinlich endlos und immer unvollständig, da jeder Hersteller von Netzwerkgeräten fleißig neue Sicherheitslücken erfindet, um seine eigenen Geräte automatisch zu erkennen. Das hilft oft sehr dabei, eine öffentliche Schnittstelle zu erkennen, bei der es keine geben sollte.
'Nuff sagte. Aus.