.. _redminima: Configuración de red ******************** Los sistemas *Linux* permiten una configuración amplísima de las interfaces de red, y profundizar en ello requeriría un tratamiento muchísimo más amplio del que aquí se mostrará. Bajo este epígrafe nos limitaremos a indicar cómo hacer una configuración simple de las interfaces, tanto con herramientas comunes a todas las distribuciones de *Linux* como con las herramientas que provee *Debian*. Tenga presente que los métodos de configuración son alternativos más que complementarios y, en consecuencia, **no deben mezclarse** (o al menos no deben mezclarse para configurar una misma interfaz). Por ese motivo, si una interfaz está activa porque se usó la herramienta :ref:`ifup ` de *Debian*, sólo debemos manipularña usando las herramientas generales, si previamente la desactivamos usando :ref:`ifdown `. .. warning:: El epígrafe está referido a interfaces de cable, que son las habituales en servidores. Las interfaces inalámbricas son más engorrosas ya que es común que cambien la red a la que están conectada con todo lo que ello supone (cambio del :abbr:`SSID (Service Set IDentifier)`, cambio de la contraseña de acceso, etc.). Aunque es posible configurar estas interfaces a través de la línea de órdenes y ficheros de configuración, lo más cómodo (y recomendable) es usar herramientas más amigables e inmediatas como las que se exponen en :ref:`el epígrafe referente a otros modos de configuración `. Interfaces presentes ==================== Antes de poner a configurar interfaces es indispensable saber qué interfaces hay presentes en nuestro sistema. Para que el sistema registre una interfaz es necesario que tal interfaz exista, pero también que haya un driver apropiado que nos permita usarla. Tradicionalmente, las interfaces ethernet cableadas se han venido llamando ``ethN`` siendo ``N`` un número correlativo empezando en 0 (*eth0*, *eth1*, etc.) y las interfaces inalámbricas ``wlanN``. Con el advenimiento de :ref:`systemd `, sin embargo, el nombre de las interfaces ha cambiado. Ahora se usa un sistema de nombres que intenta evitar el que el núcleo cambie el nombre de las interfaces al ser cambiar su número o hacerse sustituciones. .. https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ Para conocer cuáles son las interfaces presentes, basta con mirar dentro de :file:`/sys/class/net`:: $ ls /sys/class/net eth0 lo También es posible obtener las interfaces a través del comando :ref:`ip `:: # ip link show Configuración ============= Para la configuración básica de la interfaz de red cableada presentaremos (muy brevemente por ahora) tres alternativas: * :ref:`ifupdown `, que es el método tradicional para la configuración de interfaces de red en *Debian* y sigue siendo el oficial\ [#]_ * La :ref:`configuración directa ` que sirve para manipular en caliente y circunstancialmente las interfaces. Es interesante conocerla, aunque no sirva como método permanente de configuración. * :ref:`systemd-networkd ` que es la solución que facilita :ref:`SystemD ` y puede utilizarse en aquellas distribuciones que lo usan como proceso *init*. .. _ifupdown: ifupdown -------- *Debian* gestiona sus interfaces preferentemente a través de los *scripts* que proporciona el paquete **ifupdown**, los cuales consultan el contenido del fichero :file:`/etc/network/interfaces`\ [#]_. Por tanto, configurar las interfaces de red mediante este método supone fundamentalmente: - Saber cómo expresar la configuración de las interfaces dentro de :file:`/etc/network/interfaces`. - Utilizar las herramientas de activación (:ref:`ifup `) y desactivación (:ref:`ifdown `). - Saber cómo definir los servidores |DNS| para la resolución de nombres. .. rubric:: Herramientas Las fundamentables son: .. _ifup: .. index:: ifup :command:`ifup` Permite activar la interfaz suministrada (puede pasarse varias) con la configuración indicada en :file:`/etc/network/interfaces`:: # ifup eth0 Es interesante la opción ``-v`` que muestra información adicional sobre el proceso de activación. .. _ifdown: .. index:: ifdown :command:`ifdown` Permite desactivar una interfaz previamente activada con :command:`ifup`:: # ifdown eth0 Para que esto funcione la interfaz debió ser activada con :command:`ifup`. Si se activó de cualquier otro modo, la interfaz no estará registrada como activa, de modo que :command:`ifdown` no hará nada. Puede también incluirse la opción ``-v`` y otra de interés es ``--force`` que completa el proceso de desactivación incluso aunque se hayan producido errores. Por ejemplo, porque se desactivara la interfaz de forma manual y, cuando :command:`ifdown` intente desactivarla, se encuentre con que la interfaz no tiene configuración. .. _ifquery: .. index:: ifquery :command:`ifquery` Permite hacer consultas sobre las interfaces gestionadas. Lo más habitual es preguntar por cuál es la configuración de una interfaz:: $ ifquery eth0 address: 192.168.4.20/24 gateway: 192.168.4.253 up: iptables -t nat -A POSTROUTING -o $IFACE -j MASQUERADE down: iptables -t nat -D POSTROUTING -o $IFACE -j MASQUERADE .. warning:: La orden nos devuelve la configuración que se encuentra en :file:`/etc/network/interfaces`, no la que realmente tenga la interfaz, que pueden diferir, si se deshabilitó la interfaz con :ref:`ifdown ` y se volvió a configurar de modo diferente con las :ref:`herramientas generales `. También puede usarse:: $ ifquery --state lo=lo eth0=eth0 que nos devolverá la interfaces activas a través de :command:`ifup`. .. rubric:: Fichero de configuración En realidad, el meollo de la configuración está en la escritura de :file:`/etc/network/interfaces`. Mostremos un fichero con la interfaz de *loopback*, una interfaz *eth0* configurada de forma dinámica y una interfaz *eth1* configurada de forma estática: .. literalinclude:: docs/interfaces :language: bash La configuración es bastante elocuente. La segunda interfaz, al tener una configuración estática, necesita algunos datos (*ip* y máscara, y puerta de enlace). Obsérvese que no se incluyen los servidores :abbr:`DNS (Domain Name Service)`\ [#]_, porque estos no se expresan en este fichero, sino en :file:`/etc/resolv.conf`. Sí es pertinente aclarar por qué algunas interfaces van acompañadas de la palabra :kbd:`auto` y otras de la palabra :kbd:`allow-hotplug`. Incluso podría haber otras sin ninguna de esas dos líneas. En este último caso, la interfaz no se activará durante el arranque y tendrá que ser el usuario quien manualmente lo haga mediante :ref:`ifup `. En cambio, una de esas dos dos líneas, activa automáticamente en el arranque la interfaz, pero con un matiz diferente: :kbd:`allow-hotplug` activa la interfaz si se detecta que esta existe y, si no existe, no ocurrirá nada, mientras que :kbd:`auto` intentará activar la interfaz siempre y, si no existe, provocará un error visible. La regla general es que :kbd:`allow-hotplug` se usa con interfaces físicas, mientras que :kbd:`auto` se usa con interfaces virtuales que no existen previamente, sino que se crear al ser activadas y que, por tanto, no pueden existir con anterioridad. Es posible añadir también en la configuración de cada interfaz líneas que comiencen con :kbd:`pre-up`, :kbd:`up`, :kbd:`down` y :kbd:`post-down`. Estas líneas permiten ejecutar comandos arbitrarios justamente antes de activar la interfaz, tras haberlo hecho, justamente antes de desactivarla o después de haberlo hecho. Es bastante común el caso en que queremos añadir alguna regla en el :ref:`cortafuegos ` al levantar la interfaz y borrarla al desactivarla:: allow-hotplug eth0 iface eth0 inet dhcp pre-up iptables -A POSTROUTING -o $IFACE -j MASQUERADE post-down iptables -D POSTROUTING -o $IFACE -j MASQUERADE .. warning:: Si pretende cambiar la configuración de una interfaz, es muy importante que antes de editar el fichero, la desactive con :ref:`ifdown `. Esto es debido a que para desactivar una interfaz, este *script* no atiende a cómo se configuró la interfaz, sino a cual es la configuración escrita en el fichero en el momento de ejecutar :ref:`ifdown `. Por eso, si al activarse la interfaz, la configuración era estática, los *scripta* usarán internamente la orden :ref:`ip `. Si antes de desactivaer la interfaz, modifica el fichero y vuelve la configuración dinámica, al hacer :ref:`ifdown `. el *script* no desactivará la interfaz con :ref:`ip `, sino que intentará usar internamente :ref:`dhclient ` y, obviamente, fallará. .. rubric:: DNS Queda, por último, tratar la configuración de los servidores :abbr:`DNS (Domain Name Service)` en el fichero :file:`/etc/resolv.conf`. Si la configuración es dinámica, el propio cliente |DHCP| se encarga de escribir este fichero y no hay que hacer ninguna configuración. En cambio, si la configuración es estática, sí habrá que escribirlo o al menos cerciorarse que es válido. Se explicará su contenido :ref:`dentro del epígrafe siguiente `. .. _resolvconf: .. note:: Alternativamente se puede instalar y utilizar el programa :manpage:`resolvconf` que se encarga de gestionar por nosotros el fichero :file:`/etc/resolv.conf`. En este caso, no debe modificarse jamás a mano tal fichero y cuando la configuración de la interfaz sea estática incluir en la definición de la interfaz una línea que le indique a :program:`resolvconf` cuáles son los servidores de nombres:: allow-hotplug eth0 iface eth0 inet static address 192.168.1.4/24 gateway 192.168.1.1 dns-nameserver 1.1.1.1 dns-nameserver 1.0.0.1 .. _net-univ: Método universal ---------------- .. warning:: Recuerde que, para utilizar estas herramientas, debe cerciorarse primero de que la interfaz no se activó mediante :ref:`ifup ` y, si lo está, utilice :ref:`ifdown ` antes de empezar. Configuración dinámica '''''''''''''''''''''' El cliente más utilizado para la línea de órdenes es :ref:`dhclient ` que se encarga de configurar la interfaz y :ref:`modificar los servidores `. Las acciones básicas son dos: #. Configurar la interfaz (p.e. *eth0*):: # dhclient -v eth0 #. Desconfigurar la interfaz:: # dhclient -r eth0 .. seealso:: Para más información, consulte la :ref:`sección dedicada a clientes DHCP `. Configuración manual '''''''''''''''''''' Si la configuración es manual, debemos realizar tres labores: #. Configurar los parámetros de red de la interfaz. #. Añadir una entrada a la tabla de encaminamiento para indicar cuál es la puerta de enlace. #. Configurar los servidores |DNS| Así que supongamos que queremos fijar una dirección |IP| :kbd:`192.168.1.10/24`, la puerta de enlace es :kbd:`192.168.1.1` y los servidores |DNS| :kbd:`1.1.1.1` y :kbd:`1.0.0.1`. Para las dos primeras tareas, el comando apropiado es: .. _ip: .. index:: ip :command:`ip` Permite la configuración de distintos aspectos relacionados con la red: políticas de encaminamiento, parámetros de configuración de la interfaz, etc. Tiene un modo de funcionamiento similar a los comandos disponibles en sistemas *ios* de cisco. Para configurar la interfaz basta con:: # ip addr add 192.168.1.10/24 dev eth0 y para activarla con tal configuración:: # ip link set dev eth0 up Esto habrá configurado la interfaz lo que puede comprobarse a través de:: $ ip addr show [... Listado aquí ...] que muestra la configuración asignada y:: $ ip link show [... Listado aquí ...] que muestra el estado de la interfaz. En este caso ``UP`` nos informa de que la interfaz está activa y ``LOWER_UP`` de que tiene el cable conectado. En el caso de estos últimos comandos es posible añadir :kbd:`dev eth0` para obtener información solamente de esta interfaz. No obstante, aún es necesario añadir la entrada en la tabla de encaminamiento para configurar la puerta predeterminada:: # ip route add default via 192.168.1.1 Esta última orden provocará la adición de la entrada correspondiente:: $ ip route show [... Listado aquí ...] .. warning:: En tutoriales antiguos de *Linux* podrá ver que estas órdenes se hacen con :manpage:`ifconfig` y :manpage:`route`. Estas herramientas, sin embargo, hace tiempo que se marcaron como obsoletas y, de hecho, no están disponibles en *Debian* desde hace años. a menos que se instale expresamente el paquete **net-tools**. .. _bas-resolv.conf: .. rubric:: DNS En una configuración estática, es necesario definir los servidores |DNS|, para lo cual basta editar el fichero :file:`/etc/resolv.conf` e incluir las siguientes líneas:: nameserver 1.0.0.1 nameserver 1.1.1.1 .. _systemd-networkd: systemd-networkd ---------------- :ref:`SystemD ` (también) permite la gestión de interfaces de red mediante el servicio :manpage:`systemd-networkd`, al que habría que sumar :manpage:`systemd-resolved` si queremos también un |DNS| caché. El método es común a cualquier distribución que use este *init*, aunque como en el caso de *Debian*, puede encontrarse desactivo. .. warning:: Evite que :ref:`ifupdown ` active las mismas interfaces que piense gestionar con :program:`systemd-networkd`, para lo cual puede, simplemente , evitar que arranquen automáticamente comentando las líneas que contienen sus respectivas directivas :kbd:`auto` o :kbd:`allow-hotplug`. También se puede desinstalar el paquete *ifupdown* y prescindir por completo de su configuración. La filosofía de este método es crear archivos de extensión :kbd:`.network` dentro del directorio :file:`/etc/systemd/network` cada uno de los cuales configurará la red de una interfaz distinta. .. seealso:: En ese mismo directorio también puede haber archivos de extensión :file:`.link` que permiten configurar las características de una interfaz (nombre, velocidad, autonegociación, etc). Hay explicaciones adicionales en el :ref:`epígrafe dedicado a las interfaces de red `. Los archivos se estructuran en una sección :kbd:`[Match]` que permite definir a cuál interfaz afecta la configuración y una o varias sección que definen tal configuración. Lo primero que debemos hacer es habilitar el servicio:: # systemctl enable systemd-networkd # systemctl start systemd-networkd y también el de resolución de nombres:: # systemctl enable systemd-resolved # systemctl start systemd-resolved # ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf .. note:: La edición de :file:`/etc/systemd/resolved.conf` permite definir unos servidores |DNS| genéricos que se usarán en caso de que no se definan servidores particulares para las interfaces de red. Configuración dinámica '''''''''''''''''''''' Basta con crear un archivo :file:`/etc/systemd/network/10-eth0.network`: .. code-block:: ini [Match] Name=eth0 [Network] # yes, para ipv4 e ipv6 DHCP=ipv4 .. note:: La expresión de la interfaz a la que afecta la configuración puede ser mucho más rica. Por ejemplo, podríamos haber escrito: .. code-block:: ini [Match] Name=eth* que provocaría que todas las interfaces *ethernet* (supuesto que se llamen así) estén configuradas por |DHCP|. También podríamos haber utilizado alguna otra característica de la interfaz en vez del nombre, lo cual permitiría cambiar el nombre de la interfaz, sin necesidad de redefinir este archivo: .. code-block:: ini [Match] Path=pci-0000:03:00.0 Véase :ref:`interfaces ` para más información. Una vez creado o modificado el archivo, deberemos recargar la configuración:: # networkctl reload No es necesario especificar interfaz alguna, porque se recargarán las configuraciones de todas las interfaces que hayan sufrido algún cambio. Si se quiere activar o desactivar una interfaz individual, puede hacerse:: # networkctl down eth0 # networkctl up eth0 .. warning:: Pero si no ha recargado antes, se aplicará la configuración antigua. Para comprobar podemos consultar la configuración de la interfaz y de sus servidores |DNS|:: $ networkctl status eth0 $ resolvectl status eth0 Configuración estática '''''''''''''''''''''' Similar a la anterior, aunque habrá que ofrecer más información de configuración: .. code-block:: ini [Match] Name=eth0 [Network] Address=192.168.255.10/24 Gateway=192.168.255.1 DNS=1.1.1.1 1.0.0.1 DNSOverTLS=opportunistic .. note:: La dos últimas líneas sobre |DNS| no son necesarias si llegamos a definir una configuración global en :file:`/etc/systemd/resolved.conf`. Añadir esta configuración en la interfaz, provocará que se use tal configuración para el tráfico propio de ella. La segunda línea permite hacer consultas cifradas, si el servidor |DNS| las admite. .. _otros-conf-red: Otros métodos ------------- Existen otras aplicaciones para gestionar las interfaces de red: * NetworkManager_, usado principalmente en equipos de escritorio. Dispone de buenos *frontends* gráficos (de hecho, su origen está en el `proyecto GNOME <>`). * netplan_, que no es un gestor independiente, sino un *frontend* para la configuración de :ref:`systemd-networkd` o NetworkManager_, según lo que se quiera usar por debajo. Lo utiliza *Ubuntu* desde su versión *18.04*. .. _ej-redmin: .. include:: /99.ejercicios/082-redes.rst .. rubric:: Notas al pie .. [#] A fecha de redacción, la estable es Bullseye_. .. [#] En realidad en el contenido de todo el directorio :file:`/etc/network`. .. [#] Si se instala el paquete *resolvconf*, si pueden incluirse. .. _NetworkManager: https://networkmanager.dev .. _GNOME: https://www.gnome.org .. _netplan: https://netplan.io