¿Cómo cambiar el enrutamiento en el PC? II: Netsh

Spread the love

En una entrada anterior describí lo que significa enrutamiento en un PC, algunos autores llaman a éste enrutamiento de nivel 0. Estudiamos el problema de tener dos accesos a Internet pero no poder usarlos simultáneamente y cómo cambiar de uno a otro. En ésta entrada continúo explorando el tema y exploro una potente utilidad que viene con WinXP llamada netsh. Disfrútenlo.

Introducción

Antes de empezar hay que recordar que ésta es la continuación de una entrada anterior en la que describí un PC que tiene acceso a Internet de dos formas: la red del proveedor de internet propio y por una red inalámbrica de un vecino que amablemente me ofrece su conexión para cuando yo tenga problemas con la mía. El problema es que yo puedo estar conectado simultáneamente a las dos conexiones pero sólo se usa una a la vez, eso no lo podemos cambiar a menos que implementemos algo llamado balanceo de cargas que por lo pronto está fuera de nuestro alcance, pero sí podría cambiar rápidamente de una conexión a otra ejecutando un guión (script) rápido.

La vez pasada mostré el uso del comando route change para hacer el cambio rápido con dos consecuencias no muy deseables: 1) pierdo conectividad a los recursos de una de las redes 2) no puedo correr ese comando con un acceso directo (o no sé cómo hacerlo). Yo ya probé la segunda opción y me imagino que se puede hacer, pero lo que vamos a ver hoy es un poco más avanzado y se puede usar en contextos más complejos y para más cosas que sólo cambiar de una puerta de enlace a otra.

¿Cómo verificar el enrutamiento?

De la entrada anterior también hay que retomar ésto. Para verificar el enrutamiento usamos dos comandos: route print (igual que netstat -r), con eso nos damos cuénta cómo y por qué interfaz de red (tarjeta o NIC) accede nuestro PC a las diferentes redes conectadas. El otro comando es tracert <dominio>, donde <dominio> puede ser google.com o lo que se les ocurra que esté en Internet, la idea es que ese comando muestra los saltos (enrutadores) por los que pasa cada paquete destinado a esa dirección, en nuestro caso nos interesa saber sólo cuál es el primer salto, con eso sabemos por cuál interfaz salen los paquetes.

Y también retomamos el concepto de métrica, que es la forma en que una tabla de enrutamiento prefiere una interfaz en vez de otra cuando por varias interfaces se puede acceder a una misma red, se asimila al concepto de costo. Esta idea también aplica a enrutadores de verdad, como los de Internet, ¡los de Cisco!. Vimos que el PC usa la métrica para ordenar las rutas y que el enrutamiento en el PC se basa en la ruta por defecto, que si el PC tiene varias rutas por defecto, va a usar la de menor valor, recuerden concepto de costo -preferimos el menor. La métrica se encuentra en la última columna de la salida de los comandos route print o netstat -r.

¿Qué es netsh?

Ahora vamos abordar el tema nuevo: netsh. La idea de ésta entrada y lo que describo en la anterior y en ésta proviene de un artículo que leí en Techrepublic y que traduje acá llamado 10 cosas que hay que saber sobre netsh. Si no la han leído es buen momento para que lo hagan.

Netsh es lo que los técnicos llamamos un intérprete o para los más esnobistas shell de Windows. Un intérprete es un programa que intermedia entre comandos escritos por un usuario regular usando su teclado y lo que hace el sistema. Existen muchos intérpretes, el famoso cmd o command es un intérprete y bien podríamos cambiarlo por otro programa (de hecho los virus a veces lo hacen) y los usuarios regulares de Linux sí que saben de intérpretes de comandos: sh, bash, tcsh, csh y otros que no recuerdo ahora. Netsh es un intérprete de comandos de red, lo que se deduce de su nombre NET+SH(ell). No voy a extenderme sobre netsh, entre otras cosas porque no sé mucho sobre él, pero si algún lector nos quiere ilustrar, todos se lo agradeceremos 🙂

El caso de netsh es que se puede usar para hacer guiones (scripts) que se ejecuten como programas y ésto es muy útil para automatizar trabajos en redes medianas o grandes o incluso para usuarios que regularmente usan diferentes parámetros de red porque trabajan con diferentes redes. Lo que vamos a hacer es construir dos pequeños guiones que vincularemos a enlaces directos en el escritorio para cambiar rápidamente de una puerta de enlace a la otra. Se pueden hacer cosas más sofisticadas, por ejemplo alguien con experiencia en intérpretes de windows puede crear un sólo guión que cada vez que se ejecute conmute de una puerta de enlace a la otra en vez de los dos guiones separados que yo propongo, el algoritmo sería muy simple -obtener la puerta de enlace, si la puerta de enlace es A cambiar a B-, pero no sé programar en el intérprete de windows así que no lo voy a hacer.

El ejemplo

Nuestro caso de estudio es un PC que tiene dos interfaces, una interfaz inalámbrica de dirección 192.168.2.101/24 cuya GW es 192.168.2.1 y una interfaz fastethernet conectada al cablemodem con dirección 192.168.1.2/24 y GW 192.168.1.1. Cuando verificamos la tabla de enrutamiento, observamos que existen dos redes 0.0.0.0 con máscara 0.0.0.0 que se diferencian en la puerta de acceso, interfaz y métrica. Lo que hace preferir una sobre la otra es la métrica, en nuestro caso 20 para la LAN y 25 para la WLAN, al final de la tabla dice qué dirección tiene la puerta de enlace predeterminada y a esa se enviarán los paquetes salientes de éste PC. La conexión de red a la LAN se llama «Conexión de área local» y la inalámbrica se llama «Conexiones de red inalámbricas», eso es importante porque con eso identificaremos la interfaz en el comando.

Usando netsh, escribiríamos el siguiente comando para cambiar la puerta de enlace:

  • netsh interface ip set address name=»Conexión de área local» gateway=»192.168.1.1″ gwmetric=30

Por lo tanto, como la idea es subir una y bajar la otra tendríamos que ejecutar inmediatamente el otro comando correspondiente

  • netsh interface ip set address name=»Conexiones de red inalámbricas» gateway=»192.168.2.1″ gwmetric=20

Los comandos anteriores cambian la puerta de enlace, pasando de ser la 192.168.1.1 a la 192.168.2.1, es decir, el enrutador inalámbrico en vez del Cablemodem. Una ventaja de netsh es que netsh permite exportar archivos de configuración, entonces cuando configuro una red y ejecuto netsh dump >> redA.netsh, él genera el guión llamado redA.netsh para configurar el PC con todos los parámetros de red necesarios (ojo, no el navegador), en otras palabras, podemos dejar todos los comandos necesarios para reconfigurar las interfaces cada vez que la configuramos para una red particular, luego cuando cambiamos de red sólo ejecutamos el archivo generado previamente y no tenemos que configurar manualmente de nuevo. Éste archivo contiene todos los parámetros de red, incluso los del firewall y de algunos protocolos especiales, así que no es recomendable usarlo antes de conocer bien la herramienta. Para recuperar la configuración se ejecuta netsh exec redA.netsh.

Si no entiende bien la estructura de ese comando tan complicado, tal vez sea de ayuda leer la entrada 10 cosas que hay que saber sobre netsh. Lo que yo hice en mi casa es mucho más simple, creé dos archivos llamados usarWL.netsh y usarLan.netsh que contienen lo siguiente:

usarWl.netsh

  • interface ip set address name=»Conexión de área local» gateway=»192.168.1.1″ gwmetric=30
  • interface ip set address name=»Conexiones de red inalámbricas» gateway=»192.168.2.1″ gwmetric=20

usarLan.netsh

  • interface ip set address name=»Conexiones de red inalámbricas» gateway=»192.168.2.1″ gwmetric=30
  • interface ip set address name=»Conexión de área local» gateway=»192.168.1.1″ gwmetric=20

El primero baja la métrica de la GW inalámbrica (por lo tanto la convierte en la preferida) y el segundo hace lo propio con la LAN. La ventaja de estos guiones es que no perdemos conectividad con ninguna de las dos redes.

Finalmente, puse dos enlaces directos en el escritorio (Wl.lnk y Lan.lnk) y los apunté a netsh -f c:/usarWL.netsh y netsh -f c:/usarLan.netsh, la opción -f es equivalente a exec. Entonces, teniendo las dos interfaces activas y conectadas, si la conexión a Internet por medio del cablemodem falla, yo doy doble clic al enlace directo wl.lnk y comienzo a usar la red inalámbrica como salida a Internet sin perder conectividad con los otros PCs de mi casa y cuando quiero verificar si se arregló la conexión a Internet por el cablemodem doy doble clic a lan.lnk.




He tenido un efecto indeseado: la interfaz inalámbrica se reasocia cuando ejecuto cualquiera de los enlaces, es decir hay una desconexión durante uno o dos segundos.

Conclusiones

Tenemos muchas herramientas a disposición para hacer usos creativos de los recursos a mano, nada más interesante que ver un uso diferente o inesperado de una cosa tan cotidiana para nosotros como el PC y éste sí que permite hacer cosas novedosas.

Próximamente haré una comparación de éstas entradas con la forma de hacer lo mismo en Linux, ya que titulé esta entrada como «¿cómo cambiar el enrutamiento en el PC?» y no en Windows. Seguro que será igual o más interesante, estén pendientes.

6 comentarios en “¿Cómo cambiar el enrutamiento en el PC? II: Netsh”

  1. Hola que tal, hace rato que adanba buscando algo asi. Resulta que por ciertas cuestiones en mi hogar tengo una red entre mi PC, la PC de mi hermana y una portatil. Las pc’s se conectan con una inteface ethernet y la portail por wlan con un router D-Link DI-524. Bueno resulta que mi pc es la que tiene la conexion a internet (hasta conseguir un modem router ya que tengo un winmodem esos usb) asi que configure la pc de mi hermana con ip estatica y y mi pc es la GW. El tema viene con la portatil, en mi casa la uso con ip fija y le debo asignar el GW pero en mi trabajo no, es DHCP, entonces debo cambiar cuando estoy en el trabajo y volver a cambiar cuando llego a casa, es tedioso. Buscando por ahí encontre el comando Netsh y que se puede hacer un .bat con cada configuracion.

    Bueno eso es todo te queria comentar. Y ademas, tu hiciste un link que ejecuta el comando Netsh ¿No pensaste tambien en hacer un .bat? Bueno para mi el tema del .bat es que hay que saber bien como programarlo, cosa que no tengo idea, pero anduve probando. Si llego a algo te comento.

    Saludos.

  2. Hola Luis,

    gracias por el comentario, efectivamente el netsh es para eso y para usarlo en archivos por bloques (batch o .bat). Pues yo creo que lo único que hay que hacer es poner en el archivo lo mismo que te escribí en la entrada. Por ejemplo, el archivo .bat para cambiar a la inalámbrica sería

    netsh interface ip set address name=»Conexi¢n de  rea local» gateway=»192.168.1.1″ gwmetric=30
    netsh interface ip set address name=»Conexiones de red inal mbricas» gateway=»192.168.2.1″ gwmetric=20

    Hombre Luis, no había caído en la cuenta que era así de simple, gracias. Lo que falta agregarle es que sea un sólo guión que autodetecte cuál es la GW actual y alterne entre una y otra, es decir, cuando se ejecute vea si está en WL y cambie a LAN o si está en LAN cambie a WL.

    Gracias y hasta pronto.

  3. Hola amigo muy bueno tu articulo, pero quisiera comentarte si lo puedes actualizar a Windows 7, ya que con windows XP funcionaba perfectamente, yo tenia configurado dos redes una LAN(red del trabajo) y la WLAN(con la que podia salir a internet) cambiaba el gateway a la de la inalambrica y asignaba unas rutas estaticas para poder acceder a los servidores de la red del trabajo y todo OK, pero de que me cambiaron el equipo que trae Windows 7 el script del netsh ya no funciona, podrias poner como se hace en windows 7.

  4. Buenas tardes,

    La presente es antes que nada para agradecerte por el post y extenderte un cordial saludo. Aprovecho también para hacer una cosulta:

    Tengo como mencionas 2 redes: una Wifi abierta y una local Ethernet. La Ethernet Local tiene menor Métrica (20), por lo que su Gateway es la salida por default. La Wifi abierta tiene mayor métrica (25). Lo que quiero es invertirlas como muestras en el ejemplo, pero ante cualquier intento me envía que la sitaxis es incorrecta, Intenté hacerlo como tu ejemplo pero me aparece:

    netsh interface ip set address name=»Conexión de red inalámbrica» gateway=”192.168.1.254″ gwmetric=25
    La sintaxis proporcionada para este comando no es valida. Consulta la ayuda correspondiente a este comando (y pone todo la sintaxis)

    El problema es que ya revisé la sintaxis, hasta entré directo al Netsh:

    c:>netsh
    netsh>interface
    netsh interface>ip
    netsh interface ipv4>set address name=»Conexión de red inalámbrica» gateway=”192.168.1.254″ gwmetric=20

    Y me sigue apareciendo el mismo error de que la sintaxis no es correcta. Ya quité y puse comillas, para hacer pruebas y sigue el error, hasta revisé letra por letra a como lo tienes en el ejemplo pero sigue igual.

    Los comandos que quiero ejecutar son para voltear las métricas y cambiar la salida por default:

    netsh interface ip set address name=»Conexión de área local» gateway=»10.64.4.248″ gwmetric=25

    netsh interface ip set address name=»Conexión de red inalámbrica» gateway=”192.168.1.254″ gwmetric=30

    Cuál pudiera ser mi problema con el comando???

  5. He estado navegando por internet durante más de dos horas hoy, y no
    he hallado un post tan sensato como el tuyo.Según entiendo, si todos los bloggers escribiesen tan
    genial contenido, internet sería mucho más útil.
    Quisiera felicitarte por esta entrada. Me ha resultado muy útil, saludos y suerte.

  6. Creo que el ejemplo y la creacion de un shell data para simplificar las opciones de conexion a internet no estan mal, lo que si creo que esta mal es la desviacion del verdadero sentido al tema, porque si en algo hay que estar claros es, hacer una seleccion de conexion ya sea at0 y wlan ó hacer un enrutamiento o forwanding que es otra cosa, el tema esta desviado con respecto a su publicacion de entrada, de todas meneras se le agradece la iniciativa del tema, pero por favor no confundir a quien busca la informacion del cual hace usted mencion al inicio del blog (Enrutamiento).

Responder a Luis Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.