¿Cómo configuro la prioridad de las conexiones de red en Ubuntu?


42

Si una máquina Ubuntu 11.04 está conectada a WiFi y 3G simultáneamente, ¿cómo configuro la prioridad para permitir que las aplicaciones (navegador, etc.) usen WiFi primero? Si eso no está disponible, debería usar el 3G.

Básicamente, me gustaría establecer el orden en que se usan las conexiones de red.

Editar: Estoy buscando un enfoque más fácil que sea útil para aquellos que se sienten cómodos y no expertos en Ubuntu / Linux.

Respuestas:


28

Me sorprende que nadie ha mencionado el comando simple de hacer esto: ifmetric. Se puede instalar usando sudo apt-get install ifmetric. Este comando se puede usar para cambiar la métrica de cualquier interfaz. La interfaz con métrica más baja es la preferida para Internet.

Para usar esto, primero vea las métricas usando el routecomando:

$ route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.42.0.1       0.0.0.0         UG    100    0        0 eth0
0.0.0.0         10.42.0.2       0.0.0.0         UG    600    0        0 wlan0

Aquí, eth0tiene una métrica más baja, por lo que se preferirá sobre wlan0. Si desea preferir wlan0, baje su métrica:

sudo ifmetric wlan0 50

Ahora, la tabla de enrutamiento se vería así:

$ route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.42.0.2       0.0.0.0         UG    50     0        0 wlan0
0.0.0.0         10.42.0.1       0.0.0.0         UG    100    0        0 eth0

Ahora Linux lo usará wlan0para Internet. El cambio se reflejará de inmediato.


1
Gran respuesta. Thx (también para la ruta -n). Tuve que reiniciar después de instalar ifmetric para que el comando cambie la métrica
Thorsten Niehues

Cómo hacer que este cambio sea permanente (no quiero usar accidentalmente mi punto de acceso de iPhone)
Thorsten Niehues

2
@ThorstenNiehues: Una solución rápida que viene a la mente para que sea permanente es añadir el comando ifmetric a su crontab, al hacerlo crontab -ey luego añadir la línea al final: @reboot sudo ifmetric wlan0 50.
Shivams

Funciona. Pero no puedo acceder a las máquinas locales después de esto (a través del navegador, por ejemplo). ¿Alguna idea? Gracias.
tomasb

@tomasb: duda interesante. Sin embargo, eso se espera, ya que cambiar la preferencia de interfaz lo llevará a la red local de la interfaz preferida. Una forma directa de acceder a las máquinas locales sería acceder a ellas utilizando una máquina virtual. Sin embargo, deben existir mejores soluciones. Déjame pensar y responder.
Shivams

14

Establecer las métricas es cómo cambiar las prioridades. La métrica más alta es más "costosa" de usar, por lo que el sistema operativo usará las interfaces con la métrica más baja si necesita enrutar el tráfico. En caso de que la interfaz de métrica inferior se apague, utilizará la interfaz de métrica superior, ya que es la única interfaz que se puede utilizar para enrutar el tráfico hacia esa red / destino en particular.

Las métricas se especifican en el archivo / etc / network / interfaces , puntos de enlace a la documentación.

Use cualquier editor de texto para editar el archivo, identificar las redes y simplemente cambiar el metricparámetro y guardar. Reiniciar es la forma más sencilla de restablecer todos los valores sin entrar en los detalles geek de reiniciar los servicios de red.


2
Harry - Gracias por la respuesta. La red que me interesa eth1 se muestra en "ifconfig", pero no en "/ etc / network / interfaces". ¿Qué se muestra en "ifconfig" y qué en "/ etc / network / interfaces"?
Praveen Sripati

1
Agregar eth0 a "/ etc / network / interfaces" es más arriesgado. Puede probar ifconfig como root para cambiar la métrica de la interfaz (verifique que permanezca allí después del arranque).
harrymc

Cuando ejecuté 'sudo ifconfig eth1 metric 4' recibí el siguiente error 'SIOCSIFMETRIC: Operación no admitida'. goo.gl/UhXBJ dice que 'Además, no todos los sistemas hacen uso del argumento métrico. ..... Al configurar un sistema Linux, agrega un comando de ruta explícito para cada interfaz. "Parece que no hay un enfoque directo en Ubuntu como desde una interfaz de usuario para un usuario novato.
Praveen Sripati

2
Parece que Linux se decide por el adaptador más rápido después de una prueba de velocidad rápida en todos los adaptadores. La métrica ya no es compatible con muchas distribuciones. Todavía puede intentar y dictar cosas a través de "/ etc / network / interfaces", pero no sé qué tan exitoso será. Ver también esta pregunta .
harrymc

3
La solución más simple, que todo el mundo hace, es simplemente apagar la interfaz que no desea usar, o limitarla a "Usar esta conexión solo para recursos en su red" (si también tiene su impresora o lo que sea sobre eso mismo enrutador).
harrymc

7
  1. La priorización de las interfaces para el tráfico general se realiza mediante la manipulación de las métricas de enrutamiento. Cada ruta tiene parámetros asociados, como conteo de saltos y anchos de banda. Consulte la opción "métrica" ​​en la página del manual para el routecomando.

    $ route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref     Use Iface
    0.0.0.0         192.168.1.254   255.255.255.255 U     0      0        0 eth0
    192.168.1.0     0.0.0.0         255.255.255.0   U     256    0        0 eth0
    
  2. La priorización del acceso de la aplicación a los recursos de la red a menudo se aborda mediante "modelado del tráfico": usaría un motor de búsqueda web para ver si Ubuntu o el enrutador pueden hacer eso.


Nota.

En MS Windows, pero no en Linux, el netstat -nrcomando genera la misma información que route print. Incluyendo las métricas de enrutamiento.


En la página de manual para la ruta "Métrica La 'distancia' al objetivo (generalmente contada en saltos). No es utilizada por los núcleos recientes, pero puede ser necesaria para enrutar demonios". No estoy seguro de si en un escritorio Ubuntu normal el parámetro Métrico tendrá algún efecto.
Praveen Sripati

1
¿Me puede dar el comando de ruta específico para hacer esto?
Praveen Sripati

11
@PraveenSripati: no creo que hayas dado un 100 de tu representante ganado con tanto esfuerzo por esa respuesta, técnicamente correcto, pero no nos ayuda a ti ni a mí. :-( Estoy buscando un comando específico también.
Lord Loh.

1
¿Realmente qué respuesta? También netstat -nr no muestra la métrica. Ver respuesta de @shivams
Thorsten Niehues

3

Realmente no lo he probado, pero NCD (Network Configuration Daemon - 1) puede usarse para este propósito. El sitio pretende facilitar la configuración de la red. La sintaxis parece ser simple.

# Espera alguna conexión de red. Prefiere eth1 poniéndolo delante de eth0.
list ("NET-eth1", "NET-eth0") pnames;

(1) - http://code.google.com/p/badvpn/wiki/NCD


Tienes razón, mi software NCD lo hace muy bien; El ejemplo allí funciona tal cual. Sin embargo, debo señalar que la pnameslista es, de hecho, solo un argumento para la multidepend()declaración en la siguiente línea: esta es la que implementa las prioridades. El mecanismo detrás de esto es que cuando eth1aparece cuando eth0ya está activado, se ejecutó multiprovide("NET-eth1");, porque NET-eth1está delante NET-eth0, multidepend()se desactivará y volverá a activarse de inmediato, pero en lugar de exponer variables del eth1proceso eth0.
Ambroz Bizjak

Lo miré pero no pude entenderlo. Esto no debería ser tan difícil.
SDsolar

3

Todo esto se debe a las métricas de ruta. Desea eliminar la ruta predeterminada con la métrica más baja y luego restablecer la ruta anterior con la métrica más alta. Por favor, siga los comandos a continuación.

Digamos que su tabla de enrutamiento se ve así:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.16.87.254    0.0.0.0         UG    100    0        0 ens38
0.0.0.0         192.168.151.2   0.0.0.0         UG    101    0        0 ens33
10.16.86.64     0.0.0.0         255.255.255.248 U     100    0        0 ens38
10.16.87.254    0.0.0.0         255.255.255.255 UH    100    0        0 ens38
10.16.88.6      10.16.87.254    255.255.255.255 UGH   100    0        0 ens38
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens38
192.168.151.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

Ahora elimine la puerta de enlace predeterminada

# route delete default gateway

Ahora restablezca la puerta de enlace predeterminada más antigua (tenga en cuenta que la métrica en este caso es mayor 102 que la ruta predeterminada actual 101)

# route add default gw 10.16.87.254 metric 102 dev ens38                                                              
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.151.2   0.0.0.0         UG    101    0        0 ens33
0.0.0.0         10.16.87.254    0.0.0.0         UG    102    0        0 ens38
10.16.86.64     0.0.0.0         255.255.255.248 U     100    0        0 ens38
10.16.87.254    0.0.0.0         255.255.255.255 UH    100    0        0 ens38
10.16.88.6      10.16.87.254    255.255.255.255 UGH   100    0        0 ens38
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens38
192.168.151.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

Esto funciona. Nota para cualquier otro principiante (tuve que leer esto un par de veces para seguir lo que estaba sucediendo): el paso 1 anterior elimina la entrada para Gateway= 10.16.87.254, que es UGla más baja Metric, y el paso 2 la vuelve a colocar con una más alta Metricpara que sea sigue disponible como respaldo en caso de 192.168.151.2que no esté disponible.
WillC

0

[Actualización] A partir de Ubuntu 18.04 LTS (servidor), netplanes el contenedor predeterminado para la administración de la red. La configuración de Netplan se realiza a través de un archivo YAML , de forma predeterminada /etc/netplan/01-netcfg.yaml(más detalles aquí ).

La métrica de enrutamiento se define mediante la metricopción " ", que espera un número entero positivo ( 100generalmente es el valor predeterminado). Aquí está el ejemplo de la página de referencia:

network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      addresses:
      - 10.0.0.10/24
      - 11.0.0.11/24
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
      routes:
      - to: 0.0.0.0/0
        via: 10.0.0.1
        metric: 100
      - to: 0.0.0.0/0
        via: 11.0.0.1
        metric: 100

La ruta con la menor metric(longitud de ruta) se convierte en la puerta de enlace "preferida". (Utilizar:sudo netplan try para habilitar cambios)

Tenga en cuenta que en un entorno de itinerancia (conexiones múltiples, encendido y apagado), es posible que desee establecer el optionalparámetro (booleano) en true(el valor predeterminado es falso):

network:
  version: 2
  ethernets:
    enred:
      dhcp4: yes
      dhcp4-overrides:
        route-metric: 100
    engreen:
      dhcp4: yes
      dhcp4-overrides:
        route-metric: 200
      # this is plugged into a test network that is often
      # down - don't wait for it to come up during boot.
      optional: true

Observe la sintaxis ligeramente diferente para la métrica de ruta en el caso de las conexiones DHCP.

También puede usarlo NetworkManagercomo renderizador, lo que supongo (aún no me he probado) le permitiría ver / editar esa parte de la configuración también a través de herramientas GUI.

renderer (escalar)

Use el backend de red dado para esta definición. Actualmente soportados son networkdy NetworkManager. Esta propiedad se puede especificar globalmente en networks:, para un tipo de dispositivo (por ejemplo, en ethernets:) o para una definición de dispositivo particular. Por defecto es networkd.

(El último ejemplo 'grande' en la página de referencia muestra un uso híbrido de ambos renderizadores).

Ver también esta pregunta (askubuntu) .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.