No creo que haya una respuesta correcta y definitiva a su pregunta. En cambio, hay un gran paquete de formas de cómo acercarse a lo que desea. Por lo tanto, daré 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 cortafuegos NAT que cambia la IP pública en una 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 tenga doble NAT, donde su cortafuegos incluso traduce la fuente-IP a 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 a través de la ruta por defecto
Esta es mi forma recomendada para detectar automáticamente las cosas
Algo así como ip r get 1.1.1.1
por lo general le informa que la interfaz que tiene la ruta por defecto.
Si desea recrear esto en su lenguaje de programación/scripting favorito, use strace ip r get 1.1.1.1
y siga la carretera de ladrillos amarillos.
Conjunto con /etc/hosts
Esta es mi recomendación si se quiere mantener el control
Puede crear una entrada en /etc/hosts
como
80.190.1.3 publicinterfaceip
continuación, puede utilizar este alias publicinterfaceip
para referirse a su interfaz pública.
Lamentablemente haproxy
no asimilo este truco con IPv6
Uso del entorno
Ésta es una buena solución para /etc/hosts
en caso de que no root
Mismo como /etc/hosts
. pero usa el entorno para esto. Puede intentar /etc/profile
o ~/.profile
para esto.
Por lo tanto, si su programa necesita una variable MYPUBLICIP
entonces se puede incluir código como (esto es C, se siente libre para crear C++ de ella):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
para que pueda llamar su script/programa /path/to/your/script
como esto
MYPUBLICIP=80.190.1.3 /path/to/your/script
esto funciona incluso en crontab
.
Enumerar todas las interfaces y eliminar las que no desea
La forma desesperada si no se puede utilizar ip
Si no sabe lo que no quiere, puede enumerar todas las interfaces y ignora todos los falsos.
Aquí ya parece haber una respuesta https://stackoverflow.com/a/265978/490291 para este enfoque.
Hazlo como DLNA
El camino del hombre borracho que intenta ahogarse en alcohol
Usted puede tratar de enumerar todas las puertas de enlace UPnP de la red y de esta manera saber una ruta adecuada para algo "externo". Esto incluso podría estar en una ruta a la que su ruta predeterminada no apunta.
Para más información sobre esto quizás ver https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
Esto le da una buena impresión cuál es su interfaz pública real, incluso si sus puntos de ruta por defecto en otros lugares.
hay aún más
donde la montaña se encuentra con el profeta
enrutadores IPv6 se anuncian para darle la derecha prefijo IPv6. Ver el prefijo le da una pista sobre si tiene alguna IP interna o global.
Puede escuchar las tramas IGMP o IBGP para encontrar una pasarela adecuada.
Hay menos de 2^32 direcciones IP. Por lo tanto, no lleva mucho tiempo en una LAN 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, debe 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 red. También podría ayudarte.
Puede usar la dirección de difusión de Ethernet para contactar a todos sus dispositivos de infraestructura de red que a menudo lo ayudarán, como DHCP (incluso DHCPv6), y así sucesivamente.
Esta lista adicional es probablemente interminable y siempre incompleta, porque cada fabricante de dispositivos de red está afanosamente inventando nuevos agujeros de seguridad sobre cómo detectar automáticamente sus propios dispositivos. Lo que a menudo ayuda mucho en cómo detectar alguna interfaz pública donde no debería haber una.
'Nuff dijo. Fuera.
¿Por qué marcar el popen de ifconfig? Es realmente lo correcto. Las bibliotecas cambian, pero ifconfig y popen siempre estarán ahí. –
No, 'ifconfig',' route', etc. están en desuso para el comando 'ip'. Ahora deberías usar eso en su lugar. – Anders
ifconfig todavía funciona hoy en más arquitecturas que cualquier otro enfoque. Así que cámbielo al comando ip.when/if appropriate. Popen sigue siendo la mejor solución. –