No creo que haya una respuesta correcta definitiva a su pregunta. En cambio, hay un gran conjunto de formas de acercarse a lo que desea. Por lo tanto, proporcionaré algunos consejos sobre cómo hacerlo.
Si una máquina tiene más de 2 interfaces ( lo
cuenta como una), tendrá problemas para detectar automáticamente la interfaz correcta fácilmente. Aquí hay algunas recetas sobre cómo hacerlo.
El problema, por ejemplo, es si los hosts están en una DMZ detrás de un firewall NAT que cambia la IP pública a alguna IP privada y reenvía las solicitudes. Su máquina puede tener 10 interfaces, pero solo una corresponde a la pública.
Incluso la autodetección no funciona en caso de que esté en doble NAT, donde su firewall incluso traduce la IP de origen en algo completamente diferente. Por lo tanto, ni siquiera puede estar seguro de que la ruta predeterminada conduce a su interfaz con una interfaz pública.
Detectarlo por la ruta predeterminada
Esta es mi forma recomendada de autodetectar cosas
Algo como ip r get 1.1.1.1
normalmente te dice la interfaz que tiene la ruta predeterminada.
Si desea recrear esto en su lenguaje de programación / scripts favorito, use strace ip r get 1.1.1.1
y siga el camino de ladrillos amarillos.
Configurarlo con /etc/hosts
Esta es mi recomendación si quieres mantener el control
Puedes crear una entrada /etc/hosts
como
80.190.1.3 publicinterfaceip
Entonces puede usar este alias publicinterfaceip
para referirse a su interfaz pública.
Lamentablemente haproxy
no asimila este truco con IPv6
Usa el medio ambiente
Esta es una buena solución /etc/hosts
en caso de que noroot
Igual que /etc/hosts
. pero usa el entorno para esto. Puedes probar /etc/profile
o ~/.profile
para esto.
Por lo tanto, si su programa necesita una variable MYPUBLICIP
, puede incluir código como (esto es C, no dude en crear C ++ a partir de él):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
Entonces puedes llamar a tu script / programa /path/to/your/script
así
MYPUBLICIP=80.190.1.3 /path/to/your/script
esto incluso funciona en crontab
.
Enumere todas las interfaces y elimine las que no desee
La forma desesperada si no puedes usar ip
Si sabe lo que no desea, puede enumerar todas las interfaces e ignorar todas las falsas.
Aquí ya parece haber una respuesta https://stackoverflow.com/a/265978/490291 para este enfoque.
Hazlo como DLNA
El camino del borracho que intenta ahogarse en alcohol
Puede intentar enumerar todas las puertas de enlace UPnP en su red y de esta manera encontrar una ruta adecuada para alguna cosa "externa". Esto incluso podría estar en una ruta donde su ruta predeterminada no apunta.
Para obtener más información sobre esto, quizás consulte https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
Esto le da una buena impresión de cuál es su interfaz pública real, incluso si su ruta predeterminada apunta a otro lugar.
Hay aun mas
Donde la montaña se encuentra con el profeta
Los enrutadores IPv6 se anuncian a sí mismos para ofrecerle el prefijo IPv6 correcto. Mirar el prefijo le da una pista sobre si tiene alguna IP interna o global.
Puede escuchar tramas IGMP o IBGP para encontrar una puerta de enlace adecuada.
Hay menos de 2 ^ 32 direcciones IP. Por lo tanto, no se necesita mucho tiempo en una LAN para hacer ping a todos. Esto le da una pista estadística sobre dónde se encuentra la mayoría de Internet desde su punto de vista. Sin embargo, debería ser un poco más sensato que el famoso https://de.wikipedia.org/wiki/SQL_Slammer
ICMP e incluso ARP son buenas fuentes de información de banda lateral de la red. También podría ayudarte.
Puede usar la dirección de transmisión Ethernet para comunicarse con todos los dispositivos de su infraestructura de red, lo que a menudo le ayudará, como DHCP (incluso DHCPv6), etc.
Esta lista adicional probablemente sea interminable y siempre incompleta, porque todos los fabricantes de dispositivos de red están inventando afanosamente nuevos agujeros de seguridad sobre cómo detectar automáticamente sus propios dispositivos. Lo que a menudo ayuda mucho sobre cómo detectar alguna interfaz pública donde no debería haber una.
'Nuff dijo. Fuera.