Configuración de red en Linux — teoría con ip, ifcfg y resolv.conf (y la IP que desapareció al reiniciar)
En la segunda práctica de redes conseguí que mi estación hiciera ping a la pasarela a la primera. ip addr add, ip route add, ping, todo verde. Apagué el ordenador contento. A la semana siguiente lo encendí, hice ping… y nada: la tarjeta no tenía IP. Todo lo que había configurado se había evaporado. La lección: las órdenes ip cambian la red ahora, en memoria; lo que quieres que sobreviva a un reinicio va en un archivo de configuración.
En el artículo de vi editamos el ifcfg-enp2s0 sin saber del todo qué significaba cada línea. Hoy lo descubrimos: cómo ver la red de una máquina Linux, cómo configurarla al momento con ip y cómo dejarla fija con ifcfg y /etc/resolv.conf. Después, en la práctica, montamos una estación entera.
Tabla de Contenidos
El laboratorio de este tema
Configurar la red de tu propio ordenador para hacer pruebas es la forma más rápida de quedarte sin internet. Por eso todo lo de este artículo se ha ejecutado en un laboratorio virtual aislado: tres máquinas simuladas dentro de un mismo Linux con network namespaces (cada una tiene su propia pila de red) unidas por cables virtuales (veth). Reproduce el montaje de las prácticas de IC2: una estación, una pasarela y el router del aula.
La estación es el puesto 7: su red es la 10.110.7.0/24 y su IP será la 10.110.7.4. La pasarela tiene dos tarjetas, una en cada red, y reenvía paquetes de una a otra. Todas las salidas que verás son reales, de una única ejecución.
Como las tarjetas son virtuales, en las salidas aparecerán dos detalles que en el aula no verás: un sufijo @if49 (el número de la tarjeta del otro extremo del cable) y link-netns pasarela (en qué máquina está ese otro extremo). Las órdenes se dan como root (prompt #): cambiar la red exige ser administrador. Los tiempos de ping y los números de tarjeta te saldrán distintos.
Cuatro ideas antes de teclear
- Interfaz (tarjeta): la puerta de la máquina a una red.
loes especial: la loopback, la propia máquina (127.0.0.1). - Dirección IP y máscara:
10.110.7.4/24dice «soy la 10.110.7.4 y mi red son las direcciones que comparten los primeros 24 bits»./24es lo mismo que la máscara255.255.255.0: 8 + 8 + 8 + 0 = 24 bits a 1. Mi red va de10.110.7.0a10.110.7.255. - Puerta de enlace (gateway): la máquina de mi red a la que mando todo lo que no es de mi red. Aquí, la pasarela
10.110.7.1. - DNS: el servidor que traduce nombres a IP. Se configura en
/etc/resolv.conf.
Cómo se llaman las tarjetas
Antes las tarjetas se llamaban eth0, eth1 (cableadas) y wlan0 (inalámbricas). El problema: el número dependía del orden en que el sistema las detectaba al arrancar, y la que hoy era eth1 mañana podía ser eth0. Ahora el nombre dice qué es y dónde está:
| Parte | Significa | Ejemplo |
|---|---|---|
en / wl | Ethernet (cable) / WLAN (wifi) | |
p<bus>s<slot> | posición física en el bus PCI | enp2s0: Ethernet, bus 2, ranura 0 |
o<índice> | integrada en la placa | eno1 |
lo | loopback, la propia máquina |
Así, wlp9s0 es la wifi del bus 9, ranura 0. El nombre no cambia de un arranque a otro.
La orden ip: ver la red
La orden moderna es ip (del paquete iproute2). Su forma es:
ip [opciones] objeto orden
El objeto es de qué hablas: link (las tarjetas), address (las IP), route (las rutas). Se puede abreviar: address, addr y a son lo mismo. Si no pones orden, se sobreentiende show. Las opciones van antes del objeto: -br (resumen, una línea por tarjeta), -s (estadísticas), -c (colores). Y ip address help te enseña la ayuda de cada objeto.
Esta es la estación recién encendida, sin nada configurado:
# @lab base # Una estación recién encendida: la tarjeta existe, pero está apagada y sin IP ip link # objeto link: las tarjetas y su estado ip addr # objeto address: lo mismo y además las IP ip -br addr # -br (brief): una línea por tarjeta ip route # la tabla de rutas: vacía
La sesión real:
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
50: enp2s0@if49: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 08:00:27:a1:07:04 brd ff:ff:ff:ff:ff:ff link-netns pasarela
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
50: enp2s0@if49: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 08:00:27:a1:07:04 brd ff:ff:ff:ff:ff:ff link-netns pasarela
# ip -br addr
lo UNKNOWN 127.0.0.1/8
enp2s0@if49 DOWN
# ip route
Leámosla por partes:
ip linkenseña dos tarjetas:loyenp2s0. La de red tienestate DOWNy en sus flags faltaUP: está apagada.ip addrrepite lo mismo y añade las IP:lotiene127.0.0.1/8,enp2s0no tiene ninguna (no hay líneainet).ip -br addrlo resume en una tabla: nombre, estado, direcciones.ip routeno imprime nada: la tabla de rutas está vacía. Esta máquina no sabe llegar a ningún sitio.
ip -br addr es la orden que más vas a usar. En una línea ves si la tarjeta está UP y qué IP tiene.
Configurar al momento: link, addr y route
Para que la estación hable con la pasarela hacen falta tres pasos: encender la tarjeta, darle IP con máscara y, para salir de su red, una puerta de enlace.
# @lab base ip link set enp2s0 up # encender la tarjeta ip addr add 10.110.7.4/24 dev enp2s0 # IP y máscara (/24 = 255.255.255.0) ip addr show enp2s0 # solo esa tarjeta ip route # el núcleo ha añadido una ruta solo ping -c 3 10.110.7.1 # la pasarela, en mi misma red ping -c 1 10.110.1.1 # el router, en OTRA red ip route add default via 10.110.7.1 # puerta de enlace: lo que no sea de mi red, a la pasarela ip route ping -c 3 10.110.1.1 # ahora sí
La sesión real:
# ip link set enp2s0 up
# ip addr add 10.110.7.4/24 dev enp2s0
# ip addr show enp2s0
54: enp2s0@if53: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 08:00:27:a1:07:04 brd ff:ff:ff:ff:ff:ff link-netns pasarela
inet 10.110.7.4/24 scope global enp2s0
valid_lft forever preferred_lft forever
# ip route
10.110.7.0/24 dev enp2s0 proto kernel scope link src 10.110.7.4
# ping -c 3 10.110.7.1
PING 10.110.7.1 (10.110.7.1) 56(84) bytes of data.
64 bytes from 10.110.7.1: icmp_seq=1 ttl=64 time=0.342 ms
64 bytes from 10.110.7.1: icmp_seq=2 ttl=64 time=0.064 ms
64 bytes from 10.110.7.1: icmp_seq=3 ttl=64 time=0.043 ms
--- 10.110.7.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2050ms
rtt min/avg/max/mdev = 0.043/0.149/0.342/0.136 ms
# ping -c 1 10.110.1.1
ping: connect: Network is unreachable
# ip route add default via 10.110.7.1
# ip route
default via 10.110.7.1 dev enp2s0
10.110.7.0/24 dev enp2s0 proto kernel scope link src 10.110.7.4
# ping -c 3 10.110.1.1
PING 10.110.1.1 (10.110.1.1) 56(84) bytes of data.
64 bytes from 10.110.1.1: icmp_seq=1 ttl=63 time=0.386 ms
64 bytes from 10.110.1.1: icmp_seq=2 ttl=63 time=0.067 ms
64 bytes from 10.110.1.1: icmp_seq=3 ttl=63 time=0.072 ms
--- 10.110.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2039ms
rtt min/avg/max/mdev = 0.067/0.175/0.386/0.149 ms
Vamos línea a línea:
ip link set enp2s0 upno imprime nada (en Linux, el silencio es éxito), pero ahora la tarjeta tieneUP,LOWER_UP: encendida y con cable.ip addr add 10.110.7.4/24 dev enp2s0añade la IP.ip addr show enp2s0la enseña en la líneainet.ip routeya no está vacío: el núcleo ha añadido solo la ruta10.110.7.0/24 dev enp2s0. Al decirle «soy la .4 de una /24», entiende que las 256 direcciones de esa red se alcanzan directamente porenp2s0.ping -c 3 10.110.7.1(3 paquetes) funciona: la pasarela está en mi red.ttl=64es el valor de salida típico de Linux: el paquete no ha cruzado ningún router.ping -c 1 10.110.1.1falla conNetwork is unreachable: el router está en otra red y la tabla no tiene ninguna ruta que lo cubra. El ping ni siquiera llega a enviar nada.ip route add default via 10.110.7.1añade la ruta por defecto: «todo lo que no sepas dónde va, a la pasarela».- Ahora el router contesta, con
ttl=63: 64 − 1, porque el paquete ha atravesado un router (la pasarela) por el camino.
Aquí tienes la salida de ip addr show desmontada:
Fíjate en que nuestra línea inet no tiene brd (dirección de difusión). ip solo la pone si se la pides con brd +, que la calcula a partir de la máscara (lo verás en los ejercicios).
| Quiero… | Orden |
|---|---|
| encender / apagar la tarjeta | ip link set enp2s0 up / down |
cambiar la MAC (con la tarjeta en down) | ip link set enp2s0 address 12:34:56:78:90:ab |
| añadir / quitar una IP | ip addr add 10.110.7.4/24 dev enp2s0 / ip addr del … |
| quitar todas las IP de la tarjeta | ip addr flush dev enp2s0 |
| añadir / quitar la puerta de enlace | ip route add default via 10.110.7.1 / ip route del default |
| ver qué camino tomaría un paquete | ip route get 10.110.1.1 |
Olvidar el /24. ip addr add 10.110.7.4 dev enp2s0 pone /32: una red de una sola dirección. No se crea la ruta de la red y ni la pasarela contesta. Lo verás en directo en los ejercicios.
Deshacer: quitar la IP y apagar la tarjeta
Igual de importante es saber qué pasa al quitar cosas. Partimos de la estación ya configurada:
# @lab conf ip addr del 10.110.7.4/24 dev enp2s0 # quitar la IP ip route # se van también las rutas que dependían de ella ip addr add 10.110.7.4/24 dev enp2s0 # la ponemos otra vez ip link set enp2s0 down # y ahora apagamos la tarjeta ip -br addr # la IP sigue ahí, pero la tarjeta está DOWN ip route ping -c 1 10.110.7.1
La sesión real:
# ip addr del 10.110.7.4/24 dev enp2s0 # ip route # ip addr add 10.110.7.4/24 dev enp2s0 # ip link set enp2s0 down # ip -br addr lo UNKNOWN 127.0.0.1/8 enp2s0@if61 DOWN 10.110.7.4/24 # ip route # ping -c 1 10.110.7.1 ping: connect: Network is unreachable
Dos cosas que sorprenden:
- Al quitar la IP con
ip addr del,ip routese queda vacío: la ruta de la red y la ruta por defecto dependían de esa IP y el núcleo las borra con ella. Si vuelves a poner la IP, la puerta de enlace hay que añadirla otra vez. - Al apagar la tarjeta con
ip link set enp2s0 down, la IP sigue (ip -br addrla muestra junto aDOWN), pero las rutas desaparecen y el ping falla conNetwork is unreachable. Una tarjeta apagada es como un cable desenchufado.
ifconfig y route: las órdenes de antes
En muchos apuntes, tutoriales y máquinas antiguas verás ifconfig y route (paquete net-tools). Están obsoletas, pero conviene leerlas. Con la estación configurada:
# @lab conf # Las órdenes antiguas (paquete net-tools) siguen funcionando en muchas máquinas ifconfig enp2s0 # lo mismo que ip addr show enp2s0, con otro formato route -n # lo mismo que ip route, en forma de tabla
La sesión real:
# ifconfig enp2s0
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.110.7.4 netmask 255.255.255.0 broadcast 0.0.0.0
ether 08:00:27:a1:07:04 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.110.7.1 0.0.0.0 UG 0 0 0 enp2s0
10.110.7.0 0.0.0.0 255.255.255.0 U 0 0 0 enp2s0
ifconfig da la misma información con otro formato: inet y netmask por separado (la máscara escrita entera, 255.255.255.0), ether para la MAC y contadores de paquetes. El broadcast 0.0.0.0 es lo que comentábamos: no pedimos dirección de difusión. route -n enseña la tabla de rutas: la línea 0.0.0.0 con Gateway 10.110.7.1 y el flag G es la ruta por defecto; la 10.110.7.0 con U y sin gateway es la red directa. -n pide números en lugar de nombres.
| net-tools (antigua) | iproute2 (actual) |
|---|---|
ifconfig | ip addr (ip a) |
ifconfig enp2s0 up | ip link set enp2s0 up |
ifconfig enp2s0 192.168.0.2 netmask 255.255.255.0 | ip addr add 192.168.0.2/24 dev enp2s0 |
route -n | ip route |
route add default gw 10.110.7.1 | ip route add default via 10.110.7.1 |
Temporal frente a permanente
Todo lo que hemos hecho con ip vive en la memoria del núcleo: funciona al instante y desaparece al reiniciar (la historia del principio). Para que la configuración sea permanente se escribe en archivos que el sistema lee al arrancar:
En CentOS (el sistema de las prácticas), cada tarjeta tiene su archivo /etc/sysconfig/network-scripts/ifcfg-<nombre>. Este es el de nuestra estación, con los datos que acabamos de probar a mano:
# @lab conf cat ifcfg-enp2s0 # la configuración permanente (en CentOS, en /etc/sysconfig/network-scripts/) cat /etc/resolv.conf # los servidores DNS que se preguntan cat /etc/hosts # nombres que se resuelven sin preguntar a nadie ping -c 2 router # un nombre en lugar de una IP
La sesión real:
# cat ifcfg-enp2s0 DEVICE=enp2s0 BOOTPROTO=none ONBOOT=yes IPADDR=10.110.7.4 NETMASK=255.255.255.0 GATEWAY=10.110.7.1 # cat /etc/resolv.conf nameserver 193.145.147.22 nameserver 193.145.138.100 nameserver 193.145.138.200 # cat /etc/hosts 127.0.0.1 localhost 10.110.7.4 estacion 10.110.7.1 pasarela 10.110.1.1 router # ping -c 2 router PING router (10.110.1.1) 56(84) bytes of data. 64 bytes from router (10.110.1.1): icmp_seq=1 ttl=63 time=0.372 ms 64 bytes from router (10.110.1.1): icmp_seq=2 ttl=63 time=0.065 ms --- router ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1025ms rtt min/avg/max/mdev = 0.065/0.218/0.372/0.153 ms
Las claves del ifcfg:
| Clave | Qué indica | Valores |
|---|---|---|
DEVICE | el nombre de la tarjeta | enp2s0 |
BOOTPROTO | de dónde sale la IP | none (la del archivo), dhcp (la da un servidor), bootp |
ONBOOT | si se activa al arrancar | yes / no |
IPADDR | la IP | 10.110.7.4 |
NETMASK | la máscara (o PREFIX=24) | 255.255.255.0 |
GATEWAY | la puerta de enlace | 10.110.7.1 |
NETWORK | la dirección de la red (opcional) | 10.110.7.0 |
Después de editar el archivo (con vi, claro), se aplica reiniciando el servicio de red: systemctl restart network. En el aula, además, se para y desactiva NetworkManager (systemctl stop NetworkManager y systemctl disable NetworkManager) para que no pise la configuración de los archivos.
El laboratorio de este artículo no es un CentOS, así que systemctl restart network no se ha ejecutado: el archivo se enseña como texto. En la práctica escribimos un script que hace exactamente lo que hace ese servicio con cada ifcfg, y lo ejecutamos de verdad.
Los otros dos archivos de la sesión:
/etc/resolv.conf: una líneanameserverpor servidor DNS, que se prueban en orden. Son los de la universidad./etc/hosts: nombres que la máquina resuelve sola, sin preguntar a ningún DNS. Por esoping -c 2 routerfunciona: el sistema mira primero/etc/hosts, encuentra10.110.1.1 routery hace ping a esa IP (la salida dicePING router (10.110.1.1)).
ping: la prueba de que hay red
ping envía paquetes ICMP de «eco» y espera la respuesta. Lo que hay que mirar:
| En la salida | Significa |
|---|---|
64 bytes from 10.110.7.1: icmp_seq=1 ttl=64 time=0.342 ms | ha contestado; ttl baja 1 por cada router atravesado; time es el tiempo de ida y vuelta |
3 packets transmitted, 3 received, 0% packet loss | el resumen: aquí no se perdió ninguno |
connect: Network is unreachable | no hay ruta: falta la IP, la máscara o la puerta de enlace |
Destination Host Unreachable | hay ruta, pero la máquina a la que hay que entregar el paquete en tu red local no responde (o no existe) |
En Linux, ping no para solo: usa -c N para enviar N paquetes, o Ctrl-C para cortarlo.
Errores típicos
ip addr add 10.110.7.4 dev enp2s0 pone /32. Escribe siempre /24 (o el prefijo que toque).
La IP está bien puesta pero la tarjeta sigue DOWN. Primero ip link set enp2s0 up.
El gateway tiene que ser alcanzable directamente. ip route add default via 10.110.1.1 desde la estación da Error: Nexthop has invalid gateway.
Lo que haces con ip desaparece al reiniciar. Cuando funcione, pásalo al ifcfg y pon ONBOOT=yes.
Las órdenes que cambian algo dan Operation not permitted. Mirar sí puedes como usuario normal.
Pruébalo en tu terminal
Estas órdenes son seguras: solo miran, y puedes darlas en tu propio Linux sin miedo. Así salieron en la estación, como usuario normal (prompt $):
# @lab conf # @sergio ip -br addr # mirar no necesita ser root ip route ping -c 3 127.0.0.1 # lo: la propia máquina ip addr add 10.110.7.9/24 dev enp2s0 # cambiar sí
La sesión real:
$ ip -br addr lo UNKNOWN 127.0.0.1/8 enp2s0@if69 UP 10.110.7.4/24 $ ip route default via 10.110.7.1 dev enp2s0 10.110.7.0/24 dev enp2s0 proto kernel scope link src 10.110.7.4 $ ping -c 3 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.233 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.043 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.050 ms --- 127.0.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2044ms rtt min/avg/max/mdev = 0.043/0.108/0.233/0.087 ms $ ip addr add 10.110.7.9/24 dev enp2s0 RTNETLINK answers: Operation not permitted
Qué observar:
ip -br addryip routefuncionan sin ser root: consultar la red no necesita permisos. En tu máquina verás tus tarjetas (probablemente unawlp…si usas wifi).- En tu
ip route, la líneadefault via …es tu router de casa o de la universidad: tu puerta de enlace. ping -c 3 127.0.0.1siempre funciona si la pila de red está viva: es la propia máquina, a través delo. Los tiempos son minúsculos.- La última orden intenta cambiar algo y el núcleo se niega:
RTNETLINK answers: Operation not permitted. No la des consudoen tu ordenador si no quieres cambiar tu red de verdad. - Prueba también
cat /etc/resolv.conf: en muchos Linux de escritorio verásnameserver 127.0.0.53, un intermediario local (systemd-resolved) que reenvía las consultas a los DNS reales.
Resumen
| Concepto | Lo esencial |
|---|---|
| Nombres | enp2s0 = Ethernet, bus 2, ranura 0; wl… wifi; lo la propia máquina |
| Ver | ip -br addr, ip link, ip route, ip route get IP |
| Configurar al momento | ip link set X up, ip addr add IP/24 dev X, ip route add default via GW |
| Deshacer | ip addr del, ip addr flush dev X, ip route del default, ip link set X down |
| Antiguas | ifconfig, route -n (net-tools, obsoletas) |
| Permanente | ifcfg-X (BOOTPROTO, ONBOOT, IPADDR, NETMASK, GATEWAY) + systemctl restart network; DNS en /etc/resolv.conf |
| Comprobar | ping -c N: ttl, % packet loss, Network is unreachable |
Tres ideas para llevarte:
- Tres pasos para tener red: tarjeta
up, IP con máscara, puerta de enlace (que esté en tu red). ipcambia la red al momento y en memoria; elifcfgconONBOOT=yesla deja fija.- Cuando algo falle, mira en orden:
ip -br addr(¿UP? ¿IP/prefijo?),ip route(¿default?),pinga la pasarela y después más lejos.
En la práctica de configuración de red ponemos en marcha la estación paso a paso, arreglamos una mal configurada y convertimos el ifcfg en órdenes con un script. Con este tema se cierra la parte práctica de Linux de IC2; lo siguiente es la teoría de redes que hay detrás de todo esto.
¿Te ha servido este artículo? Así puedes apoyar SergioLearns →




El hardware que sostiene al sistema operativo — teoría con la práctica de IC2 en la impresora, una interrupción que lo para todo y una caché que acierta (y el bucle infinito que no colgó mi portátil)