IP del servidor local

IP del servidor local

¿Cómo determina una instancia de Linux su dirección IP?

Es decir, no el 127.0.0.1.

¿Está esto almacenado en un archivo o ifconfig lo calcula de alguna manera en cada invocación?

Logré resolverlo solo para demostrar que hice un esfuerzo, pero no es algo que pondría en una aplicación seria:

sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4

Respuesta1

Hay un defecto fundamental en su pregunta. En primer lugar, los hosts pueden (y probablemente tendrán) más de una dirección (por ejemplo, múltiples interfaces) e incluso más de una dirección por interfaz. Esto es un problema aún mayor con IPv6, donde cada host conectado globalmente al menosdosdirecciones.

En segundo lugar, la "mejor" manera de hacer esto desde un shell variará de un sistema a otro.

Linux:

/sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}'

>= Solaris 11:

ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}'

MacOS X/Darwin:

ipconfig getifaddr en0

Incluso usar el mínimo común denominador y usarlo ifconfigno será consistente porque el formato de salida puede cambiar. Sin embargo, para limpiar su ejemplo, use esto:

ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}'

Si está utilizando un lenguaje más sofisticado como Perl, Ruby, Java, etc., en lugar del shell, cada lenguaje tendrá su propia forma de obtener estos datos del kernel. Dejaré que tú busques esto.

Respuesta2

La información puede cambiar en cualquier momento, por lo que es necesario recuperarla del kernel, no se puede almacenar en un archivo.

No existe una forma realmente agradable de obtener esta información. Su análisis es tan bueno como cualquier otro, excepto que la codificación de la segunda línea es incorrecta: no hay garantía de que las interfaces se enumeren en un orden particular. Es bastante común que una máquina tenga más de una interfaz: puede tener varias tarjetas de red o interfaces virtuales.

A menudo, la dirección IP que le interesa es la asociada con la ruta predeterminada. Con la mayoría de las configuraciones, puede obtener la interfaz correcta con el routecomando y luego extraer la dirección IP de esa interfaz con ifconfig.

/sbin/ifconfig $(/sbin/route -n |
                 awk '$1 == "0.0.0.0" {print $8}') |
awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}'

Tenga en cuenta que no es necesario llamar sudo. ifconfigy routea menudo no están predeterminados PATHpara usuarios que no son root, pero puedes usarlos sin privilegios especiales siempre y cuando solo leas información y no cambies la configuración.

En variantes de Unix distintas de Linux, es posible que tengas que modificar los comandos anteriores. La mayoría tiene comandos llamados ifconfigy route, pero el formato de salida puede ser diferente.

En Linux, en lugar de ifconfigy route, puede utilizar el ipcomando deliproute2conjunto de herramientas. Si bien los autores de iproute2 consideran ifconfigque y routeestá en desuso, de hecho hay pocas ventajas en usar ip, ya que la salida de ipno es mucho más fácil de analizar y siempre están disponibles, ifconfigmientras routeque algunas instalaciones simplificadas de Linux omiten ip.

Respuesta3

Todas las respuestas aquí son técnicamente correctas, pero no son lo que yo consideraría la respuesta "correcta". Desafortunadamente, su pregunta es extremadamente vaga (lo cual puedo entender si no sabe muy bien cómo funcionan las redes en Linux), por lo que daré algunas respuestas a posibles interpretaciones de la pregunta.


La IP principal de la máquina.

La máquina tiene una IP por encima de todas las demás, que se considera la IP principal de la máquina. Sin embargo, tenga en cuenta que esto no tiene mucho sentido, ya que una caja puede tener múltiples IP y cuál se usa varía (hablaré de esto en un momento).

La IP principal es simplemente la IP asociada con el nombre de host de la máquina. Puede encontrar esta IP ejecutando lo siguiente

getent hosts "$(hostname)" | awk '{ print $1 }'

Ahora, lo que esto hace es buscar la IP del nombre de host de la máquina según /etc/nsswitch.conf. En la mayoría de los casos, el /etc/nsswitch.confarchivo contiene hosts: files dns. Esto significa que cuando intente realizar cualquier tipo de búsqueda de nombre de host o dirección, buscará /etc/hostsprimero y luego consultará DNS (según lo configurado por /etc/resolv.conf).
Por lo tanto, es probable que el comando getent hosts "$(hostname)"obtenga la entrada coincidente de /etc/hosts. Simplemente awktoma la IP de esa línea.

( getentes solo una utilidad simple para consultar las 'bases de datos' enumeradas en /etc/nsswitch.conf)


La IP utilizada para comunicarse con el mundo exterior.

Como mencioné anteriormente, la IP principal de la máquina no tiene prácticamente ningún significado. La máquina puede utilizar cualquiera de las múltiples IP para la comunicación. En su caso, es probable que solo tenga una interfaz y una IP (no localhost). Sin embargo, un servidor puede tener múltiples interfaces o IP (a veces múltiples IP en una sola interfaz).
La IP que se utiliza está determinada por la tabla de enrutamiento del kernel. No voy a entrar en detalles sobre cómo funciona la tabla de enrutamiento porque no es simple (hay varias tablas de enrutamiento y cuál se usa depende de las reglas de selección de tablas). Sólo te diré cómo encontrar qué IP se usaría.

Para saber qué IP se utilizará para comunicarse con un destino específico, use el siguiente comando:

ip route get 1.2.3.4

( 1.2.3.4siendo la IP del destino)

En mi máquina, si hago esto con una de las IP de google.com ( 74.125.139.102), obtengo lo siguiente:

74.125.139.102 via 192.168.0.1 dev wlan0  src 192.168.0.24 
    cache 

Lo que esto me dice es que la IP 192.168.0.24se utilizará cada vez que mi máquina vaya a hablar 74.125.139.102.

Si solo quieres la IP, puedes agregar una extra grepal final.

ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'

grepse usa en lugar de an awkporque es menos propenso a errores. Es posible que la línea cambie y la IP no esté en el mismo lugar, pero siempre seguirá a "src", por lo que simplemente tomamos el valor inmediatamente después de "src".


IP de puerta de enlace predeterminada

Por último, está la puerta de enlace predeterminada. Si no tiene un destino específico al que consultar para ver qué IP se utilizará, puede elegir el de la puerta de enlace predeterminada. Si sólo tienes una interfaz, esto es todo lo que importará de todos modos.
Esto es básicamente exactamente lo mismo que el anterior, simplemente usando la puerta de enlace predeterminada como nuestro destino para buscar.

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')"

Esto le dará una línea como la de la sección anterior. El srcvalor es la IP que se utilizará para el tráfico que fluye a través de la puerta de enlace predeterminada.

Como en la sección anterior, para obtener solo la IP, agregue un archivo grep.

ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'

Respuesta4

Su solicitud es ambigua, generalmente con la palabra "localhost" la gente se refiere a la interfaz loopback y 127.0.0.1 es la respuesta más común y correcta.

Lo que te falta es:

  • El hecho de que cada interfaz puede tener una IP diferente, la interfaz loopback es una interfaz de red como su tarjeta Ethernet o su receptor USB inalámbrico.
  • Como consecuencia, una sola PC no tiene una única IP, todo depende de qué interfaz esté considerando y cuántas interfaces esté utilizando en su sistema operativo.

Probablemente esté interesado en el tema "Tablas de enrutamiento del kernel", que es una buena manera de comenzar a comprender cómo el kernel maneja su actividad de red.

información relacionada