Manual:Partes/Redes/Avanzado
Readers should not try to follow instructions directly from the Handbook:Parts namespace (which is THIS page!). The sections displayed below are used as a skeleton for transcluding information into the computer architecture specific handbooks and are therefore lacking critical information.
Please visit the Handbook list to read instructions for a relevant computer architecture.
Configuración Avanzada
La variable config_{interface} (donde {interface}
es el nombre de una interfaz, p. ej., eth0
) es el núcleo de la configuración de una interfaz. Su valor es una lista de instrucciones de alto nivel para configurar la interfaz especificada.
Aquí tiene una lista de instrucciones integradas:
Valor | Descripción |
---|---|
null
|
No hacer nada |
noop
|
Si la interfaz está funcionando y existe una dirección entonces aborta la configuración con éxito |
Una dirección IPv4 o IPv6 | Añade la dirección a la interfaz |
dhcp , adsl o apipa (o un valor propio perteneciente a un módulo de terceras partes)
|
Ejecuta el módulo que proporciona la ofrece DHCP (p. ej. a través de dhcpcd, dhclient, etc.). |
Para gestionar el fallo de uno de los comandos, se puede especificar el valor de respaldo correspondiente mediante la variable fallback_{interface}. El valor debe coincidir exactamente con la estructura de la variable config_{interface}.
Puede encadenar estos valores. A continuación se muestran algunos ejemplos reales.
/etc/conf.d/net
Ejemplos de configuración# Añadir tres direcciones IPv4
config_eth0="192.168.0.2/24
192.168.0.3/24
192.168.0.4/24"
# Añadir una dirección IPv4 y dos IPv6
config_eth0="192.168.0.2/24
4321:0:1:2:3:4:567:89ab
4321:0:1:2:3:4:567:89ac"
# Mantener la dirección asignada por el núcleo, a menos que la
# interfaz se caiga, entonces asignar otra vía DHCP. Si DHCP falla entonces
# añadir una dirección estática determinada mediante APIPA
config_eth0="noop
dhcp"
fallback_eth0="null
apipa"
¡La orden de retorno es importante! Si no especificamos la opción null, la orden
apipa
se ejecutaría solo si la orden noop
falla.Cuando se utiliza el módulo
ifconfig
y se añade más de una dirección, se crean alias de interfaz para cada dirección extra. De esta manera los dos ejemplos anteriores tendrán interfaces eth0, eth0:1 y eth0:2. No se puede hacer nada especial con estas interfaces ya que el núcleo y otros programas simplemente tratan eth0:1 y eth0:2 como eth0.Dependencias de red
Los guiones en /etc/init.d/ pueden depender de una interfaz de red específica o, simplemente, de "net" (red). Todos los interfaces de red en el sistema de inicio de Gentoo proporcionan algo llamado "net".
Si, en /etc/rc.conf, la variable rc_depend_strict se establece en YES
, entonces todas las interfaces de red que proporcionan "net" deben estar activas antes de que se asuma que se cumple una dependencia de "net". En otras palabras, si un sistema tiene net.eth0 y net.eth1 y un script de inicio depende de "net", ambos deben estar habilitados.
Por otro lado, si está configurado rc_depend_strict="NO"
, entonces la dependencia de "net" se considera cumplida al momento de estar activo al menos uno de los interfaces de red.
Pero, ¿y qué pasa si net.br0 depende de net.eth0 y net.eth1? net.eth1 podría ser un dispositivo inalámbrico o ppp que necesita configurarse antes de añadirse al puente. Esto no puede hacerse en /etc/init.d/net.br0 ya que es un enlaces simbólico a net.lo.
La respuesta es definir un ajuste rc_net_{interface}_need en /etc/conf.d/net:
/etc/conf.d/net
Añadir una dependencia de net.br0rc_net_br0_need="net.eth0 net.eth1"
Lo anterior no es suficiente. Los guiones de inicio de Gentoo utilizan una dependencia virtual llamada "net" para informar al sistema cuando está disponible la conexión a red. Claramente, en el caso de arriba la conexión a red debería marcarse como disponible cuando net.br0 está funcionando, no cuando lo están las otras. Por lo que tenemos que indicar también esto en /etc/conf.d/net:
/etc/conf.d/net
Actualizar las dependencias y provisiones para los servicios de redrc_net_eth0_provide="!net"
rc_net_eth1_provide="!net"
Para una explicación más detallada sobre las dependencias, consulte la sección sobre cómo escribir guiones de inicio en el Manual de Gentoo.
Nombres de variables y valores
Los nombres de las variables son dinámicos. Normalmente siguen la estructura: {variable}_{interface|mac|essid|apmac}
. Por ejemplo, la variable dhcpcd_eth0 contiene el valor de las opciones de dhcpcd para eth0 y dhcpcd_essid contiene el valor de las opciones de dhcpcd cuando cualquier interfaz se conecta al ESSID "essid".
Sin embargo, no existe ninguna regla que establezca que los nombres de las interfaces deban tener el formato ethx
. Por ejemplo, por defecto, el núcleo asignará a las interfaces inalámbricas nombres como wlanx
. También, algunas interfaces definidas por el usuario como pueden ser puentes puede tener cualquier nombre. Para hacer la vida un poco más interesante, los puntos de acceso inalámbricos pueden tener nombres con caracteres no alfanuméricos - esto es importante porque se pueden configurar los parámetros de red por ESSID.
Sin embargo, Gentoo usa variables de Bash para la red, y los nombres de las variables en Bash solo pueden contener caracteres alfanuméricos del inglés. Para evitar esta limitación, cambiamos cualquier carácter que no sea alfanumérico del inglés por un _
(guión bajo).
Además, algunos valores de las variables de Bash requieren el uso de ciertos caracteres de escape: "
(comillas dobles), '
(comillas simples) y \
(barra invertida). Esto se puede lograr colocando la barra invertida (\) delante del carácter que se debe escapar.
Por ejemplo, para especificar el ESSID Mi "\ RED
:
/etc/conf.d/net
Nombre de variable# Esto funciona, pero el dominio no es válido
dns_domain_My____NET="My \"\\ NET"
Lo que hay arriba configura el dominio dns a My "\ NET cuando una tarjeta inalámbrica se conecta a un AP cuyo ESSID es My "\ NET.
Nombrado de las interfaces de red
Cómo funciona
Los nombres de la interfaces de red no se obtienen de forma arbitraria: el núcleo Linux y el gestor de dispositivos (la mayoría de sistemas utilizan udev como gestor de dispositivos, aunque existen otros) obtiene el nombre de la interfaz mediante una serie de reglas prefijadas.
Cuando se detecta una interfaz en un sistema, el núcleo Linux recolecta los datos disponibles para esa tarjeta de red. Estos datos incluyen:
- El nombre registrado de tarjeta de red (en la propia interfaz) y que más tarde se podrá obtener a través del valor de ID_NET_NAME_ONBOARD.
- La ranura en la cual se ha insertado la tarjeta de red y que más tarde se podrá obtener a través del valor de ID_NET_NAME_SLOT.
- La ruta a través de la cual se accede a la tarjeta de red y que más tarde se podrá obtener a través del valor de ID_NET_NAME_PATH.
- La dirección MAC de la tarjeta (que ofrece el fabricante) que más tarde se podrá obtener mediante el valor de ID_NET_NAME_MAC.
Basándose en esta información, el gestor de dispositivos decide como nombrar a las interfaces presentes en el sistema. Por defecto, utiliza el primero de las tres primeras variables que se muestran arriba (ID_NET_NAME_ONBOARD, _SLOT o _PATH). Por ejemplo, si se encuentra un valor para ID_NET_NAME_ONBOARD y éste es eno1
, entonces la interfaz de red se llamará eno1.
Si sabe el nombre de su interfaz, puede ver los valores de las variables mediante la orden udevadm:
root #
udevadm test-builtin net_id /sys/class/net/enp3s0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc. ID_NET_NAME_PATH=enp3s0
Como la primera (y realmente la única) de las tres variables es ID_NET_NAME_PATH, su valor se utiliza para nombrar al interfaz de red. Si ninguna de las variables tienen valor, entonces el sistema utiliza los nombres que ofrece el núcleo (eth0, eth1, etc.)
Utilizar el nombrado del núcleo al viejo estilo
Antes de este cambio, era el núcleo el que ponía los nombres a las tarjetas de red, dependiendo del orden en el que se cargaran sus controladores (entre otras, probablemente oscuras razones). Este comportamiento se puede aún activar definiendo el parámetro net.ifnames=0
en el gestor de arranque.
Usar sus propios nombres
La idea detrás de este cambio en el nombrado es la de no confundir a la gente y hacer los cambios de nombre de forma fácil. Suponga que tiene dos interfaces que se llamarían eth0 y eth1. Una se utiliza para acceder a la red a través de cable y la otra es inalámbrica. Con el soporte para el nombrado de interfaces, puede llamarlas lan0 (cableada) y wifi0 (inalámbrica, es mejor evitar usar los nombres anteriores bien conocidos como eth* y wlan* ya que todavía pueden parecerse a los nombres que hemos sugerido).
Todo lo que necesita ahora es encontrar los parámetros para las tarjetas y utilizar esta información para definir su propia regla de nombrado:
root #
udevadm test-builtin net_id /sys/class/net/eth0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc.
root #
vim /etc/udev/rules.d/70-net-name-use-custom.rules
# El primero utiliza la información MAC y el número 70- para que se lance antes que otras reglas de red SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="c8:0a:a9:42:9d:76", NAME="lan0"
root #
vim /etc/udev/rules.d/76-net-name-use-custom.rules
# El segundo utiliza la información de ID_NET_NAME_PATH y el número 76- para estar entre los dos # 75-net-*.rules y 80-net-*.rules SUBSYSTEM=="net", ACTION=="add", ENV{ID_NET_NAME_PATH}=="enp3s0", NAME="wifi0"
Debido a que las reglas se disparan antes de la regla por defecto (las reglas se disparan en orden alfanumérico, por lo que la 70 se lee antes que la 80), los nombres ofrecidos en el fichero de reglas se utilizarán en lugar de los que se usan por defecto. El número asignado al fichero debería estar entre 76 y 79 (las variables de entorno se definen mediante una regla que comienza por 75 y el nombrado por defecto lo realiza una regla con el número 80).