Para que una máquina sea capaz de encontrar otra máquina remota a través de la red debe existir mecanismo que describa cómo llegar del origen al destino. Este mecanismo se demonina routing o encaminamiento. Una “ruta” es un par definido de direcciones: una dirección de “destino” y una dirección de “pasarela”. Éste par indica que para llegar a dicho destino debe efectuarse una comunicación previa con dicha pasarela. Exiten tres tipos distintos de destinos: máquinas individuales, subredes y “por defecto”. La “ruta por defecto” se utiliza sólamente cuando no se puede aplicar ninguna de las otras rutas existentes. El tema de las rutas por defecto se tratará más adelante con más detalle. También existen tres tipos de pasarelas distintas: máquinas individuales, interfaces (también llamados “enlaces”) y direcciones hardware de ethernet (direcciones MAC).
Para ilustrar diferentes aspectos del sistema de
encaminamiento veamos el siguiente ejemplo obtenido mediante
netstat
.
%
netstat -r
Routing tables
Destination Gateway Flags Refs Use Netif Expire
default outside-gw UGSc 37 418 ppp0
localhost localhost UH 0 181 lo0
test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77
10.20.30.255 link#1 UHLW 1 2421
ejemplo.com link#1 UC 0 0
host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0
host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 =>
host2.ejemplo.com link#1 UC 0 0
224 link#1 UC 0 0Las primeras dos líneas especifican la ruta por
defecto (la cual se comenta en la
siguiente
sección) y la ruta de máquina
local
.
La interfaz (columna Netif
) que
especifica esta tabla de rutas
para el destino localhost
se denomina
lo0
,
y también se conoce como el dispositivo de “
loopback” a de bucle de retorno. Esto viene a decir que
el tráfico no debe entregarse a la red puesto que
dicho tráfico va destinado a la misma máquina
que lo originó.
Lo siguiente que podemos observar son las direcciones
que comienzan por
0:e0:
. Son direcciones hardware de
Ethernet, llamadas también se direcciones MAC.
FreeBSD identifica automáticamente cualquier
máquina (test0
en el ejemplo anterior)
que se encuentre en la red local y
crea una ruta del estilo que estamos comentando, para entregar
el tráfico directamente a través del
correspondiente interfaz Ethernet, en este caso
ed0
. Existe también
un contador (Expire
) asociado con este tipo
de rutas que se usa para borrarlas cuando dicho contador expira.
Las rutas para las máquinas de nuestra propia red de
de área local se crean dinámicamente
utilizando el protocolo ARP (Address Resolution Protocol o
Protocolo de Resolución de Direcciones),
que se encarga de averiguar la dirección MAC que se
corresponde con la dirección IP de la máquina
destino.
FreeBSD tambíen utiliza rutas de subred para
direccionar la subred local (10.20.30.255
es la dirección
de broadcast para la subred
10.20.30
, y
ejemplo.com
es el nombre de
dominio asociado con dicha subred.)
La notación link#1
se refiere a la
primera tarjeta Ethernet de la máquina.
En este tipo de redes no se especifica ningún interfaz
en el campo de Netif
.
Las rutas de subredes aparecen cuando se asigna una dirección IP a una interfaz, utilizando una máscara de red. También se pueden aprender dinámicamente utilizando demonios de encaminamiento, como routed. Por último estas rutas pueden crearse manualmente de forma explícita; es lo que se conoce con el nombre de rutas estáticas.
La línea de host1
se refiere a
nuestra máquina, que el sistema identifica por la
correspondiente dirección Ethernet de la tarjeta de red.
FreeBSD sabe que debe utilizar la interfaz de loopback
(lo0
) en vez de enviar los paquetes a
a través de red.
Las dos líneas que comienzan por
host2
son ejemplos del uso de alias de
ifconfig(8) alias (consultar la sección sobre
Ethernet para averiguar por qué nos podría
interesar hacer esto.) El símbolo
=>
después de la interfaz
lo0
especifica que no sólo
estamos utilizando la interfaz de loopback, si no que
además especifica que se trata de un alias. Estas rutas
sólo aparecen en las máquinas que implementan el
alias, el resto de las máquinas de la subred local
solamente poseerán una línea
link#1
para dichas rutas.
La última línea (destino de subred 224
) trata sobre encaminamiento
multicast, que cubriremos en otra sección.
Finalmente, se pueden observar varios atributos
relacionados con las rutas en la columna de
Flags
. A continuación se muestra una
pequeña tabla con el significado de algunos de esos
de los atributos o “flags”.
U | Up: La ruta está activa. |
H | Host: El destino de la ruta es una única máquina. |
G | Gateway: Envía cualquier cosa para éste destino a través de la pasarela especificada, la cual decidirá cómo encaminar el paquete hasta que eventualmente se alcance el destino. |
S | Static: Esta ruta se configuró manualmente, y no se ha generado de forma automática por el sistema. |
C | Clone: Genera una nueva ruta para la máquina a la que nos queremos conectar basándose en la ruta actual. Este tipo de ruta se utiliza normalmente en redes locales. |
W | WasCloned: Indica una ruta que se auto-configuró basándose en una ruta de red de área local con etiqueta Clone. |
L | Link: Esta ruta posée referencias a hardware de Ethernet. |
Cuando el sistema local necesita realizar una conexión con una máquina remota se examina la tabla de rutas para determinar si se conoce algún camino para llegar al destino. Si la máquina remota pertenece a una subred que sabemos cómo alcanzar (rutas clonadas) entonces el sistema comprueba si se puede conectar utilizando dicho camino.
Si todos los caminos conocidos fallan al sistema le queda una
única opción: la “ruta por defecto”.
Esta ruta está constituída por un tipo especial de
pasarela (normalmente el único “router”
presente en la red
área local) y siempre posée el “flag”
c
en el campo de “flags”.
En una LAN, la pasarela es la máquina que posée
conectividad con el resto de las redes (sea a través de un
enlace PPP, DSL, cable modem, T1 u otra interfaz de red.)
Si se configura la ruta por defecto en una máquina que está actuando como pasarela hacia el mundo exterior la ruta por defecto será el “router” que se encuentre en posesión del proveedor de servicios de internet (ISP).
Vamos a examinar un ejemplo que utiliza rutas por defecto. A continuación se muestra una configuración bastante común:
Las máquinas Local1
y
Local2
se encuentran en nuestro sitio u
organización. Local1
se conecta con un ISP
a través de una conexión de modem PPP.
El servidor PPP del ISP se conecta a través de una red de
área local a otra pasarela utilizando una interfaz
externa.
Las rutas por defecto para cada una de las máquinas son las siguientes:
Host | Default Gateway | Interface |
---|---|---|
Local2 | Local1 | Ethernet |
Local1 | T1-GW | PPP |
Una pregunta bastante frecuente es “?Por
qué (o cómo) hacer que la máquina
T1-GW
sea el ‘router’ por defecto para
Local1
en vez de que sea el servidor del ISP
al cual se está conectando?”.
Recordemos que, como la interfaz PPP está utilizando una
dirección de la red local del ISP en nuestro lado de la
las rutas para cualquier otra máquina en la red local del
proveedor se generarán de forma automática. De este
ya sabemos el modo de alcanzar la máquina
T1-GW
, de tal forma que no se necesita un paso
intermedio para enviar tráfico al servidor del ISP.
Es frecuente utilizar la dirección X.X.X.1
como la dirección de
la pasarela en la red local. Siguiendo con el ejemplo anterior, si
nuestro espacio de direccionamiento local fuera la clase C
10.20.30
y nuestro ISP estuviera
utilizando 10.9.9
las rutas por
defecto serían:
Host | Default Route |
---|---|
Local2 (10.20.30.2) | Local1 (10.20.30.1) |
Local1 (10.20.30.1, 10.9.9.30) | T1-GW (10.9.9.1) |
Se puede especificar fácilmente la entrada de la
ruta por defecto utilizando el fichero
/etc/rc.conf
. En nuestro ejemplo
en la máquina Local2
, se añadió
la siguiente línea en dicho fichero:
También se puede hacer directamente desde la línea de órdenes mediante route(8):
#
route add default 10.20.30.1
Para obtener más información sobre la manipulación de tablas de rutas se ruega consultar la página de manual route(8).
Existe otro tipo de configuración que debemos describir y que se produce cuando una máquina se sitúa en dos redes distintas al mismo tiempo. Técnicamente hablando cualquier máquina que actúa como pasarela (en el caso anterior utilizando un enlace de PPP) pertenece al tipo de máquinas con doble pertenencia, pero normalmente el término sólo se aplica para describir máquinas que se encuentran directamente conectadas con dos redes de área local.
En un caso la máquina posée dos tarjetas de red Ethernet, cada una de ellas con una dirección de red independiente. En otro caso la máquina puede tener sólo una tarjeta de red, pero utilizar “ aliasing” (ifconfig(8)). El primer caso se utiliza cuando se necesita usar dos redes Ethernet al mismo tiempo mientras que el segundo caso se utiliza cuando se dispone de un único segmento de red físico pero se han definido dos redes lógicas distintas
En cualquier caso la tabla de rutas se construye de tal forma que cada subred sepa que la máquina es la pasarela definida definida (“inbound route”) para la otra subred. Ésta configuración en la que la máquina actúa como “router” entre las dos subredes se usa a menudo cuando queremos implementar filtrado de paquetes o cortafuegos seguridad en un sentido o en ambos.
Si queremos que dicha máquina encamine paquetes entre las dos interfaces es necesario decirle a FreeBSD que active dicha funcionalidad. En la siguiente sección se explica cómo hacerlo.
Un “router” de red, también llamado pasarela o
“route”, es simplemente un sistema que reenvía
paquetes desde un interfaz hacia otro interfaz. Los estándares
Internet y el sentido común aplicado a la ingeniería de
redes impiden que FreeBSD incluya por defecto ésta
característica. Se puede activar cambiando a
YES
el valor de la siguiente variable en el fichero
rc.conf(5):
Esta opción modificará la variable de
sysctl(8) net.inet.ip.forwarding
al valor
1
. Si en algún momento se necesita
detener el “router” de forma temporal basta con
asignar a dicha
variable el valor 0
. Consulte sysctl(8) para
más detalles.
Nuestro recién activado “router”
necesita rutas para
saber a dónde debe enviar el tráfico recibido.
Si nuestra red es ña se pueden definir rutas estáticas.
FreeBSD incluye por defecto el dæmon de encaminamiento BSD,
routed(8), que admite RIP (versión 1 y versión 2)
e IRDP. El paquete net/zebra
le
permitirá usar otros protocolos de encaminamiento
dinámico como BGP v4, OSPF v2 y muchos otros.
En caso de necesitar características avanzadas de
gestión puede usted recurrir a productos comerciales como
GateD®.
Incluso cuando FreeBSD se configura del modo descrito no se cumple completamente con los estándares de Internet respecto a los “routers”. Bastará no obstante para poder usarse.
Vamos a suponer que tenemos la siguiente topología de red:
INTERNET | (10.0.0.1/24) Router por defecto para Internet | |Interfaz xl0 |10.0.0.10/24 +------+ | | RouterA | | (pasarela FreeBSD) +------+ | Interfaz xl1 | 192.168.1.1/24 | +--------------------------------+ Red Interna 1 | 192.168.1.2/24 | +------+ | | RouterB | | +------+ | 192.168.2.1/24 | Red Interna 2
En este escenario RouterA
es nuestra
máquina FreeBSD que actúa como pasarela para acceder al
resto de internet. Tiene una ruta por defecto que apunta a
10.0.0.1
que le permite conectarse
con el mundo exterior. Vamos a suponer también que
RouterB
se encuentra configurado de forma adecuada
que sabe cómo llegar a cualquier sitio que necesite.
Esto es sencillo viendo nuestra topología de red, basta
con añadir una ruta por defecto en la máquina
RouterB
utilizando
192.168.1.1
como
“router”.
Si observamos la tabla de rutas de
RouterA
veremos algo como lo siguiente:
%
netstat -nr
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.0.0.1 UGS 0 49378 xl0
127.0.0.1 127.0.0.1 UH 0 6 lo0
10.0.0/24 link#1 UC 0 0 xl0
192.168.1/24 link#2 UC 0 0 xl1Con la tabla de rutas actual RouterA
no es capaz de alcanzar la red interna 2. Esto es así
porque no posee ninguna ruta para la red
192.168.2.0/24
. Una forma de
mitigar esto es añadir de forma manual la ruta que falta. La
siguiente orden añade la red interna 2 a la tabla de rutas
de la máquina RouterA
utilizando 192.168.1.2
como siguiente salto:
#
route add -net 192.168.2.0/24 192.168.1.2
Ahora RouterA
puede alcanzar cualquier
máquina en la red
192.168.2.0/24
.
El ejemplo anterior es perfecto en tanto que resuelve el
problema de encaminamiento entre redes pero existe un problema.
La información de encaminamiento desaparecerá si se
reinicia la máquina. La forma de evitarlo es
añadir las rutas estáticas a
/etc/rc.conf
:
La variable de configuración
static_routes
es una lista de cadenas
separadas por espacios. Cada cadena identifica un nombre para la
ruta que se desea definir. En el ejemplo anterior sólamente
se dispone de una cadena dentro de la variable
static_routes
.
Esta cadena es redinterna2
. A
continuación se añade otra variable de
configuración denominada
route_
donde se escriben todos los parámetros de
configuración que normalmente utilizaríamos
normalmente utilizaríamos con route(8).
En el ejemplo que estamos comentando se utilizaría la
siguiente orden:redinterna2
#
route add -net 192.168.2.0/24 192.168.1.2
De tal forma que la variable debería contener
"-net 192.168.2.0/24 192.168.1.2"
.
Como ya se ha comentado anteriormente podemos especificar
más de una cadena en la variable
static_routes
. Esto nos permite crear varias
rutas estáticas. Las siguientes línas muestran
un ejemplo donde se añaden rutas estáticas para las
redes 192.168.0.0/24
y 192.168.1.0/24
en un
“router”imaginario:
Ya hemos comentado cómo se definen las rutas para el mundo exterior pero no hemos comentado nada sobre cómo haremos que el mundo exterior nos encuentre a nosotros.
También hemos aprendido que las tablas de rutas se pueden construír de tal forma que un grupo de tráfico (perteneciente a un espacio de direcciones determinado) se reenvíe a una máquina específica de la red, que se encargará de reenviar los paquetes hacia adentro.
Cuando se obtiene un espacio de direcciones para la organización el proveedor de servicios modifica sus tablas de rutas para que todo el tráfico para nuestra subred se encamine a través del enlace PPP hasta alcanzarnos. Pero ?cómo conocen las organizaciones dispersas a través del país que deben enviar los paquetes dirigidos a nosotros hacia nuestro ISP?
Existe un sistema (muy similar al sistema de nombres de dominio, DNS) que se encarga de controlar todos los espacios de direcciones que se encuentran actualmente repartidos y que además define sus puntos de conexión con el “backbone” de internet. El “backbone” está formado por las principales líneas de de comunicacion que se encargan de transportar el tráfico de internet a través del país y del mundo entero. Cada máquina del “backbone” dispone de una copia de un conjunto maestro de tablas de rutas gracias a las cuales pueden dirigir el tráfico para una red particular hacia una determinada red de transporte de dicho “backbone”. Una vez en la red de transporte adecuada el tráfico se encamina a través de un número indeterminado de redes de proveedores de servicio hasta que se alcanza la red de destino final.
Una de las tareas que debe realizar el proveedor de servicio servicio consiste en anunciarse a las organizaciones del consiste en anunciarse a las organizaciones del “backbone” como el punto de conexión principal (y por tanto como el camino de entrada) para alcanzar las redes de sus clientes. Este proceso se denomina propagación de rutas.
En algunas ocasiones surgen problemas con la propagación de las rutas y algunas organizaciones son incapaces de conectarse con nuestra subred. Quizá la orden más útil para averiguar dónde se está interrumpiendo el sistema de encaminamiento sea traceroute(8). Se puede usar también cuando somos nosotros los que no podemos alcanzar alguna red externa (por ejemplo cuando ping(8) falla).
traceroute(8) se ejecuta pasandole como parámetro el nombre de la máquina remota a la que nos queremos conectar. Esta orden muestra por pantalla lás máquinas que actúan de pasarela a lo largo del camino. El proceso termina bien porque se alcanza el destino o bien porque algún “router” intermedio no puede conectarse con el siguiente salto, o lo desconoce.
Si quiere saber más sobre esto consulte la página man de traceroute(8).
FreeBSD soporta tanto aplicaciones multicast como encaminamiento multicast de forma nativa. Las aplicaciones multicast no necesitan ninguna configuración especial en FreeBSD; estas aplicaciones se ejecutan tal cual. El encaminamiento multicast necesita para ser usado que se compile dicho soporte en el núcleo de FreeBSD:
Se debe configurar además el dæmon de
encaminamiento multicast, mrouted(8), para establecer
túneles y ejecutar DVMRP utilizando
/etc/mrouted.conf
. Se pueden encontrar
más detalles sobre cómo realizar una
configuración de multicast en mrouted(8).
Puede descargar éste y muchos otros documentos desde ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/
Si tiene dudas sobre FreeBSD consulte la
documentación antes de escribir a la lista
<questions@FreeBSD.org>.
Envíe sus preguntas sobre la documentación a
<doc@FreeBSD.org>.