PDF de programación - Routing avanzado con el núcleo Linux

<<>>
Imágen de pdf Routing avanzado con el núcleo Linux

Routing avanzado con el núcleo Linuxgráfica de visualizaciones

Actualizado el 2 de Abril del 2019 (Publicado el 14 de Enero del 2017)
845 visualizaciones desde el 14 de Enero del 2017
60,5 KB
19 paginas
Routing avanzado con el

núcleo Linux
Eric Van Buggenhaut

Andago

[email protected]

El núcleo Linux, a partir de la versión 2.4 nos ofrece una interfaz que
permite implementar herramientas profesionales de alto nivel en cuanto
a la gestión del tráfico de paquetes IP. Nos permite hacer cosas como
túneles IP, tablas de routing múltiples, reserva de ancho de banda,
multicasting, proxy ARP y mucho más. Esas funcionalidades estaban
hasta ahora solo disponibles en routers propietarios de gama alta y de
precio casi prohibitivo. El núcleo linux nos permite implementarlas de
modo más seguro, mas económico y con más rendimiento, además de
desarrollar nuestras propias herramientas específicas.

1. Introducción

A partir de la versión 2.4 del núcleo Linux, está disponible un socket llamado
NETLINK que permite implementar en espacio usuario (user space) código de gestión
de paquetes y tráfico IP. Teóricamente, este socket, por su naturaleza, nos permite
implementar cualquier código.

Sin embargo, nos vamos a centrar en el código escrito por Alexey Kuznetsov y
disponible bajo el nombre ’iproute’ bajo licencia GPL. Está accesible en
ftp://ftp.inr.ac.ru/ip-routing

El código está disponible como paquete Debian iproute*deb

Vamos a ver a lo largo de esta charla algunas de las cosas que nos permite hacer este
código:

1

Routing avanzado con el núcleo Linux

• unificar los comandos relacionados con la gestión del tráfico IP, sea de redes, de

interfaces, ...

• monitorización de los periféricos, direcciones y rutas.

• gestión de tablas ARP

• uso de tablas de routing múltiples

• creación de túneles IP



reserva de ancho de banda

2. Configurar el sistema

Para que funcione el iproute, necesitamos configurar el núcleo para que provea el
socket NETLINK que nos interesa. En /usr/src/linux/.config vienen bastante opciones
que nos permiten adaptar el kernel a nuestras necesidades:

CONFIG_NETLINK=y
CONFIG_RTNETLINK=y
# CONFIG_NETLINK_DEV is not set
CONFIG_NETFILTER=y
CONFIG_NETFILTER_DEBUG=y
# CONFIG_FILTER is not set
CONFIG_UNIX=y
CONFIG_INET=y
# CONFIG_IP_MULTICAST is not set
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_RTNETLINK=y
CONFIG_NETLINK=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_FWMARK=y
CONFIG_IP_ROUTE_NAT=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_TOS=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_LARGE_TABLES=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE=m
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set

2

3. El comando ip

Routing avanzado con el núcleo Linux

Actualmente usamos varios comandos para gestionar el tráfico IP y todo lo que le
rodea: interfaces, rutas, túneles, ... Se decidió unificar el conjunto y proveer así un sólo
comando con una sintaxis coherente y global. El comando se llama ’ip’ y tiene la
siguiente sintaxis:

ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]

3.1. OPTIONS

Son varias opciones que influyen el comportamiento general de la herramienta. Todas
las opciones empiezan por el carácter ’-’ y se pueden abreviar. Algunas opciones son:







-s, -stats, -statistics obtener más información

-f, -family especifica que familia de protocolo usar: inet, inet6 o link.

-r, -resolve imprime nombres DNS en lugar de direcciones de host

3.2. OBJECT

Es el objeto que queremos manejar o del cual buscamos informaciones. He aquí
algunos ejemplos que también pueden ser abreviados:



link,l -- periférico de red

• address,a -- dirección (IPv4 o IPv6) de periférico





route,r -- entrada en la tabla de routing

rule,ru -- regla en la base de datos de política (policy database)

• maddress,maddr -- dirección multicast



tunnel,t -- tunnel sobre IP

3.3. COMMAND

Es el comando que se aplica al objeto. Se puede abreviar también:

3

Routing avanzado con el núcleo Linux

• add,a -- añadir un objeto

• del,d -- borrar un objeto

• set,s -- ajustar un objeto

• show,list,l -- ver un objeto

3.4. Mensajes de error
Algunos posibles errores son:

• Wrong syntax of command line -- problema de sintaxis

• el núcleo devuelve un error a una petición NETLINK -- En este caso, ip imprime el

mensaje de error prefijado por "RTNETLINK answers:"

• Cannot open netlink socket: Invalid value -- Netlink no está configurado en el núcleo

• Cannot talk to rtnetlink: Connection refused -- RTNETLINK no está configurado en

el núcleo

• Cannot send dumb request: Connection refused -- RTNETLINK no está configurado

en el núcleo

• RTNETLINK error: Invalid argument -- CONFIG_IP_MULTIPLES_TABLES no

está configurado en el núcleo

4. ip link -- manejar las interfaces

4.1. ip link set -- cambiar los atributos de la interfaz

• dev NAME: especifica de que interfaz se trata

• up/down: cambiar el estado de la interfaz

• name NAME: cambiar nombre de la interfaz

• mtu NUMBER: cambiar MTU de la interfaz

• ejemplo:

4

ip link set dummy up

Routing avanzado con el núcleo Linux

4.2. ip link show -- ver los atributos

• dev NAME: mostrar la interfaz especificada

• up: mostrar solo las interfaces ’up’

• ejemplos:

[eric@mrmime:~]$ ip l l
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc

pfifo_fast qlen 100

link/ether 00:05:1c:01:b1:33 brd ff:ff:ff:ff:ff:ff
[eric@mrmime:~]$

La primera linea de cada entrada da un número único a la interfaz, su nombre (que
puede ser cambiado), así como varias informaciones sobre el estado de la interfaz. La
segunda línea da informaciones sobre el tipo de interfaz de que se trata, la dirección de
la interfaz a nivel de la capa ’layer’ (en el caso de ethernet, la dirección MAC).

La opción -s nos permite ver estadísticas de la interfaz:

[eric@mrmime:~]$ ip -s l l
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes
1368991
TX: bytes
1368991

packets errors dropped overrun mcast
5872
packets errors dropped carrier collsns
5872

0

0

0

0

0

0

0

0

2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc

pfifo_fast qlen 100

packets errors dropped overrun mcast

link/ether 00:05:1c:01:b1:33 brd ff:ff:ff:ff:ff:ff
RX: bytes
1789685066 1975826 99656
TX: bytes
1619835989 2304565 69

packets errors dropped carrier collsns
1762589

16

0

0

0

4

[eric@mrmime:~]$

Los parámetros son similares al antiguo comando ’ifconfig’.

5

4.3. ip address -- gestión de las direcciones de interfaz

Routing avanzado con el núcleo Linux

ip addr permite ver las direcciones de interfaz, añadir nuevas direcciones o borrarlas. Es
importante destacar que a partir de iproute, las interfaces físicas y las direcciones son
totalmente disociadas, eso significa que una interfaz puede tener varias direcciones sin
necesitad de crear un alias como ocurría en el caso anterior.



ip addr show: ver direcciones de protocolo

mrmime:~# ip a l
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc

pfifo_fast qlen 100

link/ether 00:05:1c:01:b1:33 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.71/24 brd 192.168.2.255 scope global eth0

mrmime:~#



ip addr add: añadir nueva dirección

mrmime:~# ip a l
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc

pfifo_fast qlen 100

link/ether 00:05:1c:01:b1:33 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.71/24 brd 192.168.2.255 scope global eth0

mrmime:~# ip a a 10.0.0.1 dev eth0
mrmime:~# ip a l
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc

pfifo_fast qlen 100

link/ether 00:05:1c:01:b1:33 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.71/24 brd 192.168.2.255 scope global eth0
inet 10.0.0.1/32 scope global eth0

mrmime:~#

6

Routing avanzado con el núcleo Linux



ip addr del: borrar una dirección

mrmime:~# ip a d 10.0.0.1 dev eth0
mrmime:~# ip a l
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc

pfifo_fast qlen 100

link/ether 00:05:1c:01:b1:33 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.71/24 brd 192.168.2.255 scope global eth0

mrmime:~#

5. Gestión de tablas ARP

Las tablas ARP establecen enlaces entre las capas de protocolo y de ’link’ (en caso de
una red local Ethernet, sería entre dirección IP y dirección MAC). Cada host de una
subred necesita conocer la dirección física de los demás para poder mandar paquetes a
los destinatarios adecuados. Estas direcciones se almacenan en un caché ARP.

En caso de no conocer la dicha dirección MAC, se hace una petición de broadcast (por
ejemplo cuando se enciende el equipo) que sería cómo "Hola ! Quién es la dirección IP
w.x.y.z ?". La máquina con tal dirección IP contesta : "Yo soy la máquina w.x.y.z y mi
MAC es 00:ad:f3:b1:22:4e". Entonces, nuestra máquina almacena esta MAC en su
caché.

El Objeto ’neighbour’ del comando ip gestiona el cache ARP. Estos son algunos
ejemplos:

mrmime:~# ip neigh ls
192.168.2.5 dev eth0 lladdr 00:c0:ca:15:80:9c nud reachable
192.168.2.34 dev eth0 lladdr 00:05:1c:01:9d:c3 nud delay
192.168.2.72 dev eth0 lladdr 00:05:1c:01:6c:a9 nud reachable
192.168.2.1 dev eth0 lladdr 00:c0:ca:15:81:07 nud reachable
192.168.2.3 dev eth0 lladdr 00:01:02:ad:08:da nud stale
192.168.2.70 dev eth0 lladdr 00:40:f6:2c:27:13 nud reachable
192.168.2.21 dev eth0 lladdr 00:50:fc:42:07:b4 nud reachable
192.168.2.52 dev eth0 lladdr 00:05:1c:01:5e:1b nud delay
mrmime:~#

7

Routing avanzado con el núcleo Linux

Puedo borrar una entrada:

mrmime:~# ip n d 192.168.2.52 dev eth0
mrmime:~# ip n l
192.168.2.5 dev eth0 lladdr 00:c0:ca:15:80:9c nud reachable
192.168.2.34 dev eth0 lladdr 00:05:1c:01:9d:c3 nud reachable
192.168.2.72 dev eth0 lladdr 00:05:1c:01:6c:a9 nud reachable
192.168.2.1 dev eth0 nud failed
192.168.2.3
  • Links de descarga
http://lwp-l.com/pdf761

Comentarios de: Routing avanzado con el núcleo Linux (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad