Ruteo en Linux vs Cisco – Parte 2

Para seguir evaluando las difrencias y similitudes en ambas plataformas (ver parte 1),  trataré de ir haciendo una muestra de equivalencias en ambos sistemas, para que pueda ser usado como “diccionario” para los habitantes de estos dos mundos.

Privilegios

En el mundo de los sistemas, conozco un solo sistema operativo anarquico, es decir, donde cualquier usuario puede llegar a cambiar cualquier configuración, pero no es el tema de este artículo, si no por el contrario, tanto linux como IOS (sistema operativo de CISCO), necesitamos ciertos privilegios en el sistema para poder cambiar una configuración.
Basicamente, en linux tenemos a los usuarios, los grupos, y el usuario root.
Los permisos se otorgan mediante distintos permisos en los archivos, siendo que los archivos tienen un dueño (un usuario), tambien tienen un grupo, el cual es un conjunto de usuarios. De esta manera, linux puede distribuir ciertas responsabilidades en distintos usuarios. Sin embargo, el poder de todo lo tiene el usuario “root” (esto no es nada particular de linux, si no mas bien de los sistemas operativos unix).

Así cuando querramos configurar algo en nuestro linux deberemos tener acceso al usuario root.

Podemos pasar de usuario común a root de la siguiente manera:

usuario@myhome:~$ su - root
Password:
myhome:~#

Tipicamente, en los unix, ver el signo  # significa tener los permisos de superusuario (root).
Algo parecido (en realidad identico pero enmascarado), sucede en los sistemas IOS.
Cuando iniciamos por primera vez un router cisco, y nos conectamos mediante una terminal (hyperterminal o minicom), vemos esto:

Router>

Que significa que solo tenemos acceso a un limitado número de comandos, para poder ejecutar comandos que afecten a la configuración del router debemos ejecutar el comando “enable”.

Router>enable
Router#

Como vemos el prompt, nos muestra el signo #, que nos indica que tenemos los permisos equivalentes a root, en un sistema unix.
En este caso, ejecutar el comando enable nos transforma automaticamente en superusuarios, sin embargo, cuando se configura un router, mas que para realizar unas pruebas, se establece una contraseña, asi mismo, se puede establecer una contraseña para el usuario mas básico, de forma tal que nadie que no conozca la contraseña pueda siquiera husmear en el router.

Router>enable
Password:
Router#

Al instalar un IOS, lo primero que debemos hacer es configurar una contraseña,
para estar mas seguros de que nadie meterá las narices donde no debe.

Tanto IOS como linux, tienen mecanismos similares de autenticación, en el caso de linux pueden ser mucho mas avanzado, sin embargo no suelen tener mucha reelevancia si queremos que actue solo como router.

Guardar Cambios

Una diferencia, que si bien es simple, pero importante, es como ambos sistemas, es la forma en que estos guardan los cambios efectuados.
En ambas plataformas,  los cambios de configuración se hacen inmediatamente al ejecutar el comando, sin embargo, este cambio solo dura, hasta que se reinicie el equipo. Para perdurar los cambios mas allá de los reinicios, en las plataformas cisco, debemos ejecutar el comando “write”, este comando guarda todas los cambios realizados en el equipo, y volveran a ser levantadas una vez que se reinicie.

En linux, no existe un comando tan general que guarde todos los cambios realizados, si no que cada configuración o variable, tiene su o sus archivo/s. En las siguientes secciones revisaremos esos archivos y la forma analoga de hacerlo en cisco.

Configuración de interfaces en [ Linux | Cisco ]

Algo fundamental en cualquier dispositivo de red, es poder configurar las interfaces de red.
Compararemos los siguientes puntos, para hace un primer “approach”, en estas equivalencias entre cisco y linux.

En este post nos encargaremos de analizar y comparar estos puntos.

Configuración básica

Salvado de información

Visualización de datos


Configuración básica

Para asignara una dirección de red a una interfaz en linux (como root):

ifconfig eth0 192.168.1.1 netmask 255.255.255.0

Aún que vale recalcar que esto se mantiene por compatibilidad con los unixs, ya que la mejor manera de configurar las interfaces en linux, es con el pack de utilidades iproute2, que se haría de la siguiente manera:

ip addres add 192.168.1.1 dev eth0

Para agregar una descripción podemos agregarla en los archivos de configuración que veremos mas abajo.

En un router cisco, lo hariamos de la siguiente manera:

Router>enable
Router#config t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#interface FastEthernet 0/0
Router(config-if)#no shutdown
Router(config-if)#ip address 192.168.1.1 255.255.255.0

Al momento de ejecutar el comando enable, el router puede pedirnos un password, este password se configurar
en la instalacion del router, aunque puede quedar sin password, como en este caso.

Para agregar una descripción podemos usar:

Router(config-if)#description "Ethernet conectada a la dmz"

Para configurar el hostname de un router Cisco:
Router>enable
Router#config t
Router(config)#hostname MyRouter
MyRouter(config)#exit
MyRouter#write

El "write" graba todos los cambios hechos, por lo cual insisto en ser cuidadosos con este comando, por que si ademas de cambiar el nombre, cambiamos otra cosa, quedará grabado al ejecutar "write"
En linux, necesitamos ser root,  y lo hacemos de la siguiente manera:

gustavo@Onix:~$ su -
Contraseña:
Onix:~# hostname MyHostname
Onix:~#

Como vemos, el comando es igual que en cisco, sin embargo, pareciera ser que no cambia automáticamente el hostname,  sin embargo si es asi, solo que el hostname que vemos en nuestra consola ( Onix:~# ) es una variable que se configura en el momento que iniciamos sesión. Por lo tanto, si ejecutamos el comando exit, y volvemos a loguearnos, ya aparecerá el nombre cambiado.
Otra forma de cambiar el hostname, es ejecutando:

Onix:~# echo "MyHostname"  > /proc/sys/kernel/hostname

De todos modos, el hostname no cambiara en nuestra consola, hasta que loguemos de nuevo.
Los comandos vistos recientemente,  no cambian el hostname de nuestro linux permanentemente. Para hacerlo permanente mente, debemos editar el archivo: /etc/hostname

En este caso no necesitamos editarlo con un editor, ya que es solo una linea la que hay que cambiar:

echo "MyHostname" > /etc/hostname

Salvado de configuración de las interfaces

Tanto en Cisco, como en Linux, los cambios explicados arriba, se pierden a la hora de reiniciar el equipo. Los dos sistemas tienen formas de guardar esta información, a saber:
En una distro tipo Debian el archivo es: /etc/network/interfaces
En los sistemas tipo RedHat el archivo es: /etc/sysconfig/network-scripts/ifcfg-[nombre de la intefaz]
Para poder editar estos archivos usamos cualquier editor de texto instalado. Generalmente Vi.
Una vez editado el archivo correspondiente, los cambios no se aplican hasta que reiniciemos los scripts de red.

En la plataforma Cisco, una vez realizado el cambio pretendido, si se quiere guardar dicho cambio, se hace de la siguiente manera:

Router(config-if)#ip address 192.168.1.1 255.255.255.0
Router(config-if)#exit
Router(config)#exit
Router#write
Building configuration...
[OK]
Router#

Este comando, guarda todos los cambios realizados en el router, por lo cual hay que tener cuidado al utilizarlo, por que podemos estar guardando algun otro cambio que hayamos realizado.

Visualización de datos

En ocaciones necesitamos visualizar cierta información de las interfaces, en Cisco podemos hacerlo de la siguiente manera:

Router>show interfaces
FastEthernet0/0 is administratively down, line protocol is down (disabled)
 Hardware is Lance, address is 00e0.8f0d.d501 (bia 00e0.8f0d.d501)
 Description: "Ethernet conectada a la dmz"
 Internet address is 192.168.1.1/24
 MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec, rely 255/255, load 1/255
 Encapsulation ARPA, loopback not set
 ARP type: ARPA, ARP Timeout 04:00:00,
 Last input 00:00:08, output 00:00:05, output hang never
 Last clearing of "show interface" counters never
 Queueing strategy: fifo
 Output queue :0/40 (size/max)
 5 minute input rate 0 bits/sec, 0 packets/sec
 5 minute output rate 0 bits/sec, 0 packets/sec
 0 packets input, 0 bytes, 0 no buffer
 Received 0 broadcasts, 0 runts, 0 giants, 0 throttles
 0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored, 0 abort
 0 input packets with dribble condition detected
 0 packets output, 0 bytes, 0 underruns
 0 output errors, 0 collisions, 1 interface resets
 0 babbles, 0 late collision, 0 deferred
 0 lost carrier, 0 no carrier
 0 output buffer failures, 0 output buffers swapped out
....

Este comando nos lista abundante información de todas las interfaces de red.

En Linux ejecutamos:

Para ver información sobre una sola interfaz:

/sbin/ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:16:17:77:cd:1b
 inet addr:192.168.1.3  Bcast:192.168.1.7  Mask:255.255.255.248
 inet6 addr: fe80::216:17ff:fe77:cd1b/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 RX packets:4606 errors:0 dropped:0 overruns:0 frame:0
 TX packets:3338 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:384745 (375.7 KiB)  TX bytes:602690 (588.5 KiB)
 Interrupt:250 Base address:0x2000

Para ver info de todas las interfaces:

/sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:17:77:cd:1b
 inet addr:192.168.1.3  Bcast:192.168.1.7  Mask:255.255.255.248
 inet6 addr: fe80::216:17ff:fe77:cd1b/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 RX packets:4606 errors:0 dropped:0 overruns:0 frame:0
 TX packets:3338 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000
 RX bytes:384745 (375.7 KiB)  TX bytes:602690 (588.5 KiB)
 Interrupt:250 Base address:0x2000

lo        Link encap:Local Loopback
 inet addr:127.0.0.1  Mask:255.0.0.0
 inet6 addr: ::1/128 Scope:Host
 UP LOOPBACK RUNNING  MTU:16436  Metric:1
 RX packets:4112 errors:0 dropped:0 overruns:0 frame:0
 TX packets:4112 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0
 RX bytes:176739 (172.5 KiB)  TX bytes:176739 (172.5 KiB)

Con el comando iproute, podemos visualizar sobre una sola interfaz de la siguiente manera:

ip address list eth0
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
 link/ether 00:16:17:77:cd:1a brd ff:ff:ff:ff:ff:ff

ó

ip address list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 inet6 ::1/128 scope host
 valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
 link/ether 00:16:17:77:cd:1b brd ff:ff:ff:ff:ff:ff
 inet 192.168.1.3/29 brd 192.168.1.7 scope global eth0
 inet6 fe80::216:17ff:fe77:cd1b/64 scope link
 valid_lft forever preferred_lft forever

para ver la info de todas las interfaces.

En los siguientes posts veremos algunos detalles mas avanzados, relacionados con el ruteo en ambos sistemas.

/* A partir de marzo nos estamos mudando a http://netsecure.com.ar o http://www.netvulcano.com.ar */

Anuncios

IProute, el gran director II

En el primer artículo sobre IpRoute pudimos aproximarnos al uso cotidiano  y casero que le podemos dar a esta poderosa herramienta,
pero en esta ocasión vamos a avanzar sobre utilidades mas avanzadas.

IpRoute no solo centraliza la administración de la red en nuestro linux, si no que nos brinda herramientas que antes uno
no podía ni imaginar, sin pagar un alto costo por sistemas dedicados. Por ejemplo: Proxy ARP, control del ancho de banda, multicasting,.. y una de las cosas que mas me interesa es la posibilidad de trabajar con múltiples tablas de ruteo (balanceo de carga).

Tablas de Ruteo

Con IProute podemos manejar las distintas tablas de ruteo del kernel de linux.
Simplificando ideas, tener varias tablas de ruteo, nos permite acceder a distintas redes con el agregado de poder elegir de forma minuciosa (ya sea por dirección de destino, Type of service, scope, o interfaz de salida) la ruta a seguir de un determinado paquete (como adelanto, imaginate si pudieras usar el poder de matcheado de iptables, para marcar un paquete, el cual direccionaremos a la tabla de router que querramos! ).

Ejemplos de uso:
Tipico ejemplo, tengo dos conexiones a internet, una de 3mb con Fibertel y una de arnet de 1mb.
Atraz de Linux’sBox tengo un servidor de juegos, y una red de maquinas que acceden para navegar y usar msn y otra que se conecta a juegos online.
Objetivo: Distribuir las maquinas entre las 2 conexiones para que la red no se me sature.

Otro ejemplo común, es cuando tengo dos conexiones, y quiero balancear el uso de p2p en la red.

En mi caso hoy quiero utilizar estas herramientas para balancear trafico http entre dos proxyweb

Comenzando:

El kernel soporta 256 tablas de ruteo (de la 0 a la 255), lo que es generalmente, mas que suficiente.
Por defecto se le asigna el numero 255 a la tabla de ruteo local,  la cual en la mayoría de los casos no tocaremos, ya que esta contiene los broadcast y direcciones de las interfaces locales, esta tabla es la que manejan los ip address e ifconfig, para poder verla usamos: ip route show table local.

El número 254 se lo gano la tabla principal (main) donde esta alojadas las rutas que soliamos ver en un route -n y finalmente, siempre hay algo que debermos explicar en otro momento, y en este caso nos referimos a las tablas 253 (default) y 0 (llamada para unspect , sirve para manejar todas las tablas! :s )

Esta configuración esta guardada en /etc/iproute2/rt_tables#
# reserved values
#
255     local
254     main
253     default
0       unspec
#

Y es justamente en este archivo donde definiremos nuestras tablas personalizadas.
Como es costumbre en un sistema *nix-like, usamos nuestro editor de texto preferido y nos disponemos a editar este archivo,
donde colocaremos un ID y un ALIAS, el ID debe estar entre 1 y 252 ya que los otros valores están ocupados, el alias sera el nombre que le asignaremos
a la tabla para llamarla de una forma amigable.
Una vez editado nuestro archivo puede quedar algo asi:# reserved values
#
255     local
254     main
253     default
0       unspec
#
# Tablas personalizadas
#
#  Tabla para Red Arnet
1 arnet
#  Tabla para red Fibertel
2 fibertel

Simple no? si, por ahora es asi de simple.
Usando ip route show table arnet/fibertel , podemos observar que no hay nada dentro de las tablas.
Ahora bien, dentro de cada tabla, puede haber varios tipos de rutas, y estos son:

Unicast:
La mas común de todas las tablas, tan común, que cuando no sepamos de que tipo es una ruta, muy probablemente sea Unicast.
Este tipo de rutas, establece una gateway para una red.
Por ejemplo, cuando queremos llegar a la red 10.1.1.0/27 (ver subnetting) atravez de nuestro router (cuya ip es 192.168.1.1) usaremos:
ip route add 10.1.1.0/27 via 192.168.1.1
Y el ejemplo mas común es el de la ruta de ultima milla, ruta por defecto, puerta de enlace, o default gateway:
ip route add default gw 192.168.1.1
ó bien
ip route add 0.0.0.0/0 via 192.168.1.1
Broadcast:
Otra ruta muycomún. Esta tipo de ruta, solo se encuentra en la tabla local, y especifica una dirección de broadcast de una interfaz.
Para mirar esas rutas podemos usar:
ip route show type broadcast table local
Lo que nos mostrara solo las rutas tipo broadcast de la tabla local
Local:
Tan comunes como las broadcast, las rutas del tipo local, quienes pueden ser un poco complicadas de explicar por un concepto poco logico, para la forma de pensar humana, ya que, esta ruta, dice, para llegar a la dirección 10.0.0.1 parta de la interfaz eth1 y use 10.0.0.1 como dirección de origen.
que??
Si bueno, miremos esto:
Agregamos una dirección ipv4 a nuestra interfaz eth1
ip addr add 10.0.0.1 dev eth1
Veamos lo siguiente:
ip route sh type local table local
Veremos que automaticamente, se ha agregado la si siguiente linea:
10.0.0.1 dev eth1  proto kernel  scope host  src 10.0.0.1
Con esto, si hacemos un ping a dicha ip (10.0.0.1) funciona de 10, pero si la borramos (ip route del 10.0.0.1 dev eth1 table local),
veremos como el tonto de nuestro kernel no sabe como llegar!!!!
Entonces, este tipo de rutas, como dijimos, le dicen al kernel, que para llegar a la ip 10.0.0.1 user la interfaz eth1, con la dirección 10.0.0.1.
Volvamos a los tipos de rutas

nat:
Tipo de ruta utilizada cuando se crea NAT
unreachable:
Este tipo de rutas se generan automáticamente cuando se recibe un paquete ICMP unreachable.
prohibit:
Exactamente igual a unreachable pero con ICMP prohibit
blackhole:
Este tipo de ruta es similar a /dev/null, es decir, lo que matchea contra esta ruta, es descartado
throw:
Si blackhole es un  /dev/null throw es un archivo tipo pipe (fifo), es decir, cuando una conexión llega a matchear contra esta ruta, se envia a la conexión nuevamente a ser manejada por el proceso de selección de ruta normal, con un destino especifico.

Pues bien, teniendo una idea, de como crear rutas, y de como funcionan (siempre teniendo en cuenta el comando ip route get), podemos crear las rutas que necesitemos en nuestras tablas personalizadas, por ejemplo:
Hagamos un mini ejemplo de como conectarnos a dos proveedores

#Vale aclarar primero, que si no tenemos una interfaz para llegar a 10.0.0.2 habrá un error
#además estoy suponiendo que ya creaste las tablas arnet y fibertel en /etc/iproute2/rt_tables

#Ahora si insertamos una ruta por defecto en la tabla arnet
ip route add default via  10.0.0.2  dev eth1 table arnet
# y otra en la tabla fibertel
ip route add default via 192.168.5.1 dev eth2 table fibertel

Ahora bien, antes de seguir, para entender la siguiente linea, quizas necesites leer los articulos de NetFilter, para comprender que estamos haciendo.
iptables -t mangle -A OUTPUT  -p tcp –dport 80 -j MARK  –set-mark 1
iptables -t mangle -A OUTPUT  -p tcp –dport 1863  -j MARK  –set-mark 2

Con esto solo nos falta unas lineas mas,

ip rule add fwmark 1 table arnet
ip rule add fwmark 2 table fibertel

Analicemos esto un poco:
Al igual que con los otros objetos, podemos listar el contenido de la tabla rule con
ip rule list
nos mostrará algo asi:
Onix:~# ip rule ls
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Estas reglas (rules) determinan la forma en que los paquetes ingresaran en una tabla u otra. Si ya te has familiarizado con el funcionamiento de tablas, podrás notar,
que en este caso, los paquetes entran primero en la tabla local, ya que de seguro, es la primera contra la cual matchearan (anteriormente explicamos su uso). Al salir de
esta tabla, pasaran a la tabla main, donde encontraran su destino.
Para entender de forma práctica el uso de ip rule, podemos ver una forma alternativa de hacer lo mismo que hicimos con ‘ip rule add fwmark……’:
ip rule add from 192.168.1.0/24 table arnet
Y con eso, diriamos que todo lo que venga de la red 192.168.1.0/24 pasa a ser controlado por la tabla arnet.
fwmark nos permite leer una marca (que asigno iptables, y que es solo de uso interno) a un determinado paquete, y según esa marca destinarlo a una tabla.

Ahora pensemos que el poder de matcheado de IPtables nos permitirá dirigir el tráfico de la forma que necesitemos.

Un resumen de todo:
Primero, definimos tablas de ruteos, a las cuales le asignamos un default gateway. De esta manera nuestras tablas quedaron listas!
Pero ahora teniamos que decirles a los paquetes que pasen por esas tablas, así que lo que hicimos fue usar iptables, para “encontrar” los paquetes que queriamos
encaminar por una tabla en particular, y les agregamos una marca (fwmark, que es una marca solo de uso interno).
Nos faltaba la conexion entre los paquetes marcados y nuestras tablas, por lo que usamos ip rule, para definir que los paquetes marcados, pasen por las tablas de ruteo correspondientes, y de esa manera se completo el circuito.

Bien, hemos visto un poco mas del poder del comando ip, si todo va bien seguiremos aprendiendo sobre iproute2 y la cantidad de cosas que podemos hacer con el!

Cualquier duda específica pueden dejar un comentario con su mail y me comunicaré con uds.

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

IPRoute el gran director I

IPRoute, la otra cara de la moneda

Por herencia de los ancestrales unixs, linux, tiene 3 herramientas fundamentales para la configuración de las redes:

ifconfig, route y arp.

Sin embargo, estos comandos, no nos pueden proveer de todo el potencial que el kernel linux puede darnos para nuestras redes.
He tratado de exponer en los artículos sobre Netfilet, la punta del iceberg de lo que Linux puede hacer en cuanto al manejo de paquetes de red.
IPRoute2, es el conjunto de herramientas que nos  terminará de dar el control completo sobre todo ‘paquetito’ que quiera circular por nuestra red.

Adiciono una lista de los programas que instala IProute2:

Programas instalados: arpd, ctstat (enlace a lnstat), genl, ifcfg, ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat (enlace a lnstat), ss y tc

Descripciones cortas

arpd Demonio ARP a nivel de usuario, útil en redes realmente grandes en las que la implementación ARP del núcleo es insufuciente, o cuando se configura un “honeypot”.
ctstat Utilidad para el estado de la conexión.
genl
ifcfg Un guión del intérprete de comandos que actúa como envoltorio para el comando ip.
ifstat Muestra las estadísticas de las interfaces, incluida la cantidad de paquetes enviados y recibidos por la interfaz.
ip El ejecutable principal. Tiene diferentes funciones:

ip link <dispositivo> permite a los usuarios ver el estado del dispositivo y hacer cambios.

ip addr permite a los usuarios ver las direcciones y sus propiedades, añadir nuevas direcciones y borrar las antiguas.

ip neighbor permite a los usuarios ver los enlaces de vecindad, añadir nuevas entradas de vecindad y borrar las antiguas.

ip rule permite a los usuarios ver las políticas de enrutado y cambiarlas.

ip route permite a los usuarios ver las tablas de enrutado y cambiar las reglas de las tablas.

ip tunnel permite a los usuarios ver los túneles IP y sus propiedades, y cambiarlos.

ip maddr permite a los usuarios ver las direcciones multienlace y sus propiedades, y cambiarlas.

ip mroute permite a los usuarios establecer, cambiar o borrar el enrutado multienlace.

ip monitor permite a los usuarios monitorizar continuamente el estado de los dispositivos, direcciones y rutas.

lnstat Proporciona estadísticas de redes Linux. Es un sustituto generalista y con características más completas para el antiguo programa rtstat.
nstat Muestra las estadísticas de la red.
routef Un componente de ip route. Este es para refrescar las tablas de enrutado.
routel Un componente de ip route. Este es para listar las tablas de enrutado.
rtacct Muestra el contenido de /proc/net/rt_acct.
rtmon Utilidad para la monitorización de rutas.
rtpr Convierte la salida de ip -o a un formato legible
rtstat Utilidad para el estado de rutas.
ss Similar al comando netstat. Muestra las conexiones activas.
tc Ejecutable para el control del tráfico. Este es para las implementaciones Quality Of Service (QOS, Calidad de Servicio) y Class Of Service (COS, Clase de Servicio).

tc qdisc permite a los usuarios establecer la disciplina de colas.

tc class permite a los usuarios establecer clases basadas en la planificación de las disciplinas de colas.

tc estimator permite a los usuarios hacer una estimacón del flujo de red en una red.

tc filter permite a los usuarios establecer el filtrado de paquetes QOS/COS.

tc policy permite a los usuarios establecer las políticas QOS/COS.

Como veran, iproute no es un tema trivial, la idea de este articulo es ver el manejo BÁSICO del comando ip.

Para comenzar a ver los primeros rayos de luz, comenzaremos por la administración mas básica y cotidiana.

Adios ifconfig

Repasemos el uso de ifconfig:

Onix:~# ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 00:00:01:51:31:61
          inet addr:10.6.1.1  Bcast:10.6.1.255  Mask:255.255.255.0
          inet6 addr: fe80::221:86ff:fe5c:3761/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:44098 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27090 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:16877090 (16.0 MiB)  TX bytes:6276440 (5.9 MiB)
          Memory:fe000000-fe020000

Ejecutando ifconfig con una interfaz como argumento nos muestra cierta cantidad de información, generalmente mas que suficiente para las tareas diarias.
Generalmente usaremos ifconfig, para configuar la dirección IP (direccion ip y mascara de de sub red), tambien para saber justamente cual es la dirección configurada, o bien para activar o desactivar una interfaz (up / down). Otra tarea, es la de crear interfaces virtuales o alias (ifconfig eth1:1 192.168.0.1).
Veamos como traducir esto a iproute, y luego explicamos como funciona!

Primeramente, iproute es un paquete que contiene 2 herramientas fundamentales ip y tc. En este momento nos centraremos en el comando ip que al igual que iptables, es una interfaz para el manejo que hace el kernel.

Basta de alaraca!

Lo que ante haciamos con un ‘ifconfig -a’ (mostrar la info de todas las interfaces), ahora podremos hacerlo con:

Onix:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
link/ether 00:00:01:51:31:61 brd ff:ff:ff:ff:ff:ff
inet 10.6.1.1/24 brd 10.6.1.255 scope global eth1
inet6 fe80::221:86ff:fe5c:3761/64 scope link
valid_lft forever preferred_lft forever

Probablemente te tire algo parecido, pero lo primero a recalcar, es que la información básica que encontrábamos en el comando ancestral, también la encontraremos aquí. Nos estamos refiriendo a la dirección ip (dirección y mascara), pero antes de ahondar, hagamos unos ejemplos mas.

Lo que antes haciamos con ‘ifconfig eth1’.. adivinen…

Onix:~# ip addr show eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
link/ether 00:00:01:51:31:61 brd ff:ff:ff:ff:ff:ff
inet 10.6.1.1/24 brd 10.6.1.255 scope global eth1
inet6 fe80::221:8
6ff:fe5c:3761/64 scope link
valid_lft forever preferred_lft forever

Eso es simple.. sigamos.

Lo que antes haciamos con ‘ifconfig eth1:1 10.0.0.1’ (un alias, o una interfaz virtual) ahora lo haríamos:

Onix:~# ip addr add 10.0.0.1 dev eth1 &&  ip addr show eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
link/ether 00:00:01:51:31:61 brd ff:ff:ff:ff:ff:ff
inet 10.6.1.1/24 brd 10.6.1.255 scope global eth1
inet 10.0.0.1/32 scope global eth1
inet6 fe80::221:8
6ff:fe5c:3761/64 scope link
valid_lft forever preferred

Vemos que se agrego una linea ‘inet 10.0.0.1/32 scope global eth1’, que si hacemos un ifconfig, es como si ni existiera.
Hasta ahi con el ifconfig, veamos como cambia el tema de las rutas.

‘route’, es un comando simple de usar, pero suficientemente potente para las tareas mas comunes, pero, no explota de forma completa lo que Linux puede hacer por nosotros.

Si antes haciamos ‘route -n’, ahora podemos hacer:

Onix:~# ip route list
10.1.1.0/24 dev eth1  proto kernel  scope link  src 10.1.1.1
default via 10.1.1.100 dev eth1

La informacion es casi la misma…

Bien ya vimos suficiente como para darnos cuenta que el comando ip centraliza las tareas, y trabaja de una forma distinta a la acostumbrada en los sistemas unix, sin embargo esto se adecua más a los sistemas embebidos, como por ejemplo los sistemas CISCO.
Ahora, ya dejemos las recetas prácticas y veamos un poco de teoria.

Primero, vamos a convencernos de que iproute2 no solo provee una nueva sintaxis, si no que tiene verdaderos beneficios.
Para varios, les sera de interés, saber que iproute provee la posibilidad de hacer balanceo de carga,  es decir, dividir la cantidad de tráfico en distintas conexiones.
Otro de los beneficios, es poder tener varias tablas de routeo, para configurar redes complejas, y algo de lo que se habla mucho en este tiempo, que es la posibilidad de usar QoS para limitar el ancho de banda de las conexiones.
Si comparamos esto, con las arcaicas herramientas, veremos que iproute2 es una herramienta poderosa.
Revisemos entonces la forma de trabajar de iproute2, en particular, del comando ip.

Sintanxis

El comando ip, concibe a todo como un objeto, al cuál le cambiará ciertas cualidades de dicho objeto.
Por lo cuál su sintaxis es la siguiente:

ip [ opciones ] Objeto [ Comando [ argumentos ]]

Los objetos son los siguientes (extraido de wikipedia):

  • link Para configurar los objetos físicos o lógicos de la red
  • address Manejo de direcciones asociadas a los diferentes dispositivos. Cada dispositivo debe tener al menos una dirección asociada.
  • neighbour Permite a los usuarios ver los enlaces de vecindad, añadir nuevas entradas de vecindad y borrar las antiguas.
  • rule Permite a los usuarios ver las políticas de enrutado y cambiarlas.
  • route Permite a los usuarios ver las tablas de enrutado y cambiar las reglas de las tablas.
  • tunnel Permite a los usuarios ver los túneles IP y sus propiedades, y cambiarlos.
  • maddr Permite a los usuarios ver las direcciones multienlace y sus propiedades, y cambiarlas.
  • mroute Permite a los usuarios establecer, cambiar o borrar el enrutado multienlace.
  • monitor Permite a los usuarios monitorizar continuamente el estado de los dispositivos, direcciones y rutas

Veamos el ‘objeto’ mas común: address

Desde aquí se administraran las direcciones del protocolo IP (v4 o v6) asignadas a los dispositivos (interfaces).
Como ya se mencionó cada dispositivo debe tener como mínimo una dirección, lo que significa que podrá tener mas de una también.
A diferencia de ‘ifconfig’, no se llama ‘alias’ a las direcciones agregadas, si no que iproute llama dirección primaria (a la dirección principal) y direcciones secundarias (a lo que llamabamos alias).

Address, también abreviado como ‘addr’, tiene los siguientes comandos:
‘add’, ‘del’, ‘show’, ‘flush’, ‘change’, y ‘replace’.
No son dificil de imaginar para que sirven cada uno, pero veremos algunos ejemplos.

Add:
Agrega una dirección a un dispositivo.

ip route add 10.0.0.1/24 broadcast 10.0.0.255 dev eth1

Como verán, no implica mucha complejidad.
Vimos en su sintaxis, que ‘route’ era el objeto, y ‘add’ es un comando.
Los argumentos usados para este comando, fueron:
10.0.0.1/24 : Dirección IPv4 en notación CDIR.
broadcast 10.0.0.255 : Dirección de broadcast
dev eth1 : Nombre del dispositivo

Existen otros argumentos opcionales para el comando add, y se pueden ver haciendo, como siempre.. un man ip

Del:

Borra una dirección de un dispositivo.

ip address del 10.0.0.1/24 dev eth1

El comando del, necesita que le mencionen el dispositivo al cual se le quiere borrar una dirección, y la dirección que se quiere borrar, que si no se mencionara, se borraría la primera.

Show:

Lista las interfaces y sus direcciones, y se especifica una en particular, se lista las características de esa.

Onix:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
    link/ether 00:11:46:6c:34:61 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.1/24 brd 10.1.1.255 scope global eth1
    inet6 fe80::221:86ff:fe5c:3761/64 scope link
      valid_lft forever preferred_lft forever

O bien podemos listar una sola usando ‘ip addr show eth1’, para mostrar solo la eth1.
El comando show, también soporta mostrar las interfaces que cumplen con una característica, por ejemplo:

ip addr show to 192.168.1.1/24

Me mostraría todas las interfaces con una dirección 192.168.1.1.
Algunas de las características que se pueden usar son:
dev: Nombre del dispositivo.
scope: Dispositivos que coincidan con ese ‘scope’ (ámbito)
to: Dispositivos que contengan la ip dada.
label: ‘etiqueta’ del dispositivo
Y aquí paramos un segundito, ya que es valido aclarar, que cuando agregamos una dirección secundaria, podemos asignarle una etiqueta.
Pensemos que cuando hacemos un ‘ifconfig eth1:1 192.168.1.11’, en realidad lo que hacemos es asignarle una dirección más a la interfaz eth1, la cual llamamos eth1:1 para identificarla de forma diferente. Con ‘ip’, podemos agregar una dirección, de forma lisa y llana, o bien, asignandole una etiqueta, la cual debe coincidir en las primeras letras con el nombre del dispositivo. Por ejemplo, una dirección secundaria a eth1, podria tener un ‘label’ que se llame eth1secu o bien eth1:1.

Flush:

Se darán cuenta que hace un flush (borrado, lavado) de las direcciones de una interfaz.

ip addr flush eth1

Con lo que eth1 quedaria sin ninguna dirección IP

Bien, con esto, solo hemos visto apenas como usar el comando ip, para manejar direcciones ip.
Veamos ahora un poquito acerca de las rutas.

Otro ‘objeto’ muy usado es ‘route’, desde el cual se puede controlar de forma avanzada el sistema de router del kernel. Para finalizar este pequeño articulo sobre iproute, veamos el manejo básico y estaremos en condiciones para el proximo artículo, de hablar de cosas un poco mas ‘avanzadas’.
Con ‘ip route’ así solito, el comando nos listará las rutas definidas. Usar ‘ip route’ es sinonimo de ‘ip route show’ ó ‘ip route list’.
Al igual que Netfilter, ‘ip’ utiliza tablas, que sirven para definir las reglas de  routeo.
Cada entrada de la tabla contiene un dato clave, que es la dirección de la red/host. Cuando un paquete matchea contra esa regla/ruta, (o matchea con el TOS, veremos mas adelante), se le aplica la ruta a dicho paquete.  En caso de encontrarse varias coincidencias, primero se observa la dirección de red, luego el TOS, y finalmente la preferencia)

Podemos ver, que los comandos que podemos tirar sobre este objeto son iguales a los de addres.
Flush, como es de esperar, borrará la ruta/s deseadas, o todas si no se pasan argumentos, y ya dijimos que show, ó list (también abreviado como s, sh, ó l, ls, list, nos muestra las rutas, y si lo indicamos, las rutas pertenecientes a algún criterio en particular como lo vimos con address. Se agrega un comando iteresante, que es get, el cual nos permite comprobar las rutas.
Para agregar una ruta, usamos:

ip route add 'ruta'

Donde en ‘ruta’, se definirán las distintas opciones que debe cumplir un paquete para matchear con la dicha ruta. Pero algo que no es opcional, es la dirección de la red, y justamente el destino que debe tomar los paquetes que matcheen con dicha ruta.
El uso mas común sería:

ip route add 10.0.0.0/24  via 192.168.1.2

Donde le decimos al kernel, que todo lo que quiera ir hacia la red 10.0.0.0/24, utilice de pasarela a la ip 192.168.1.2.
Para cambiar una ruta podemos usar, replace o change de la misma manera.
Y para borrar una ruta, cambiariamos el del, en lugar del add, y dejando todo lo demas igual.

Queda más por ver, pero trataremos de analizarlas de forma mas profunda en la segunda parte.

Todas las correcciones son bienvenidas! 😉

/* A partir de marzo nos estamos mudando a http://netsecure.com.arhttp://www.netvulcano.com.ar */

Publicado en Articulos. Etiquetas: , , , , , . 4 Comments »