martes, 17 de junio de 2008

INTERNET EN LINUX

¿Cómo funciona la red ethernet en el sistema operativo linux?

Tal y como suele ser normal en Linux, el sistema proporciona una interfaz virtual para enmascarar u ocultar las complejidades del hardware de comunicaciones. Los usuarios y aplicaciones utilizan estas abstracciones o interfaces para enviar y recibir datos, despreocupándose de las particularidades físicas.
Existen diferentes interfaces de red, en función de su uso y la tecnología empleada. Veámos las más utilizadas comunmente:


lo: localhost o interfaz de loopback. Se utiliza para referirnos a nosotros mismos. Esto es, cuando queramos establecer una conexión de red a nosotros mismos sólo tenemos que conectar con este interfaz y todo lo demás se realizará normalmente. Por convenio tiene la dirección IP 127.0.0.1.
ppp: peer-to-peer protocol, o protocolo de conexión punto a punto. Cuando hacemos una conexión mediante un modem a nuestro proveedor de Internet, establecemos un enlace punto a punto con él. Éste será el interfaz de red por el que típicamente se transmitirán los datos que deseemos cuando estemos conectándonos a una red por modem.
eth0: interfaz Ethernet. El número 0 indica que es el primer interfaz de red instalado, si tuviéramos varios interfaces de red Ethernet se llamarían eth1, eth2... Cuando nos conectemos a una LAN (Local Area Network) que utilice Ethernet (la mayoría de los casos), nuestras comunicaciones se transmitirán por este interfaz. Existen otros interfaces de red en nuestros sistemas Linux (dummy, slip...), si bien quedan fuera del alcance de este artículo.


Hace unos años la configuración de ppp en linux era un trabajo bastante costoso. A la inherente complejidad de las primeras versiones de las distribuciones de linux, se unía mi corta experiencia en Internet, por lo que cuando conseguí realizar una simple llamada a mi nodo local de la extinta infovía, sentí la misma satisfacción que si hubiese encontrado vida extraterrestre. Hoy en día esto ha cambiado radicalmente, existen infinidad de asistentes para la configuración de la conexión mediante ppp (kppp, reciéntemente explicado en +Linux) y todo se reduce a introducir nuestros datos de conexión y realizar la llamada. Por ello no vamos a ahondar más en este tema, sólo deciros que wvdial es un asistente muy recomendable si utilizáis este tipo de conexiones.
La configuración de un interfaz de red Ethernet en Linux es algo que todos deberíamos conocer ya que muchos de los sistemas Linux están en un entorno LAN, bien como servidores, bien como estaciones de trabajo. El primer factor que tendremos que tomar en cuenta es el modelo de tarjeta Ethernet que disponemos. Existen muchas distribuciones que nos ahorran conocer esto, pero vamos a ponernos en el peor de los casos: no disponemos de ningún asistente para instalar la tarjeta y no la hemos comprado nosotros mismos. A pesar de que esto pueda parecer un verdadero reto, con un par de trucos podremos salir de este embrollo fácilmente.
Lo primero en lo que deberemos fijarnos es en si es una tarjeta EISA o PCI. Si nuestro sistema Linux es un ordenador medianamente nuevo, casi sin lugar a dudas se tratará de una tarjeta PCI, pero si estamos en un 386, 486 o primeras versiones de Pentium, hay bastantes posibilidades de que sea una EISA. Lo mejor de todo es quitar la tapa del ordenador y mirar a dónde está conectada la tarjeta: si es un conector alargado, de unos 13 cms y típicamente negro, se tratará de un slot EISA; si por el contrario es un conector más pequeño, de unos 8 cms de largo y normalmente blanco, es un slot PCI.

Una vez hecha esta comprobación, deberemos cargar el módulo que dé soporte a nuestra tarjeta. Si se trata de una tarjeta EISA, intentaremos cargar el módulo para tarjetas "NE2000 compatibles" ("NE2000/NE1000 support", tened cuidado de no elegir NE2000 pci). En el caso de ser una tarjeta PCI, lo normal es que dispongan del chip 8029 si son de 10 Mbps o el 8139 si son de 100 Mbps.


Para probar el módulo y ver si el sistema reconoce la tarjeta haremos uso del comando "modprobe". Con él probaremos si el módulo es adecuado. Veámos cómo sería la sintáxis para cargar el módulo (desde una shell de root) necesario para una tarjeta pci con el chip 8139 (100 Mbps): # modprobe rtl8139
8139too Fast Ethernet driver 0.9.18a
PCI: Found IRQ 11 for device 00:0c.0
PCI: Sharing IRQ 11 with 01:00.0
eth0: RealTek RTL8139 Fast Ethernet at 0xda801000, 00:c0:26:a0:7f:fc, IRQ 11
eth0: Identified 8139 chip type 'RTL-8139B'


De esta manera hemos cargado el módulo para la tarjeta PCI y el sistema nos ha devuelto un mensaje confirmando que ha encontrado la tarjeta en la IRQ 11. Si el sistema nos indica algún error, deberemos asegurarnos de que ese es el módulo adecuado para nuestra tarjeta o probar otro similar. Para una tarjeta a 10 Mbps, en lugar de cargar ese módulo, cargaríamos normalmente el módulo "ne2k-pci".


Vamos a ver ahora un ejemplo para tarjetas EISA. En principio el proceso es muy similar, si bien habitualmente hay que especificar a mano la IRQ y la IO Address que utilizará la tarjeta. Para la gran mayoría de las tarjetas de red EISA, podremos utilizar los valores io=0x300 y irq=3, ó io=0x340 y irq=5 (consultad el manual de la tarjeta si podéis). Veámos cómo sería: # modprobe ne io=0x300 irq=3
NE*000 ethercard probe at 0x300: 00 c0 26 80 15 93
eth0: NE2000 found at 0x300, using IRQ 3.

Ya tenemos instalado el módulo de nuestra tarjeta, vamos a asegurarnos que lo hemos cargado correctamente. Para ello utilizamos el comando "lsmod" que muestra un listado de los módulos cargados: # lsmod
Module Size Used by
serial 19564 1 (autoclean)
ne 6272 1
8390 6040 0 [ne]
unix 10212 89 (autoclean)
En esta lista podemos observar como el módulo "ne" ha sido cargado correctamente.
Una vez aquí, podemos olvidarnos de todas las complicaciones a nivel de hardware. Centrémonos ahora en la configuración de nuestra dirección IP, máscaras de red, servidores DNS, etc. Para proporcionar una dirección IP a nuestro interfaz de red (eth0), utilizaremos el comando "ifconfig": # ifconfig eth0 192.168.0.3
Así habremos asignado al interfaz eth0, la IP 192.168.0.3. Si no definimos la máscara de red, ifconfig le asignará la que es propia a esa familia de direcciones IP (en este caso 255.255.255.0, por ser 192.168.0.3 de clase C). Si nuestro administrador de redes ha establecido subredes y debemos usar una máscara distinta a la estándar, podremos indicarlo en el comando ifconfig, por ejemplo: # ifconfig eth0 192.168.0.3 netmask 255.255.244.0

Nuestro interfaz de red ya tiene IP y podrá acceder a todos los equipos de su misma red, pero si quiere acceder a equipos de redes diferentes, necesitará establecer una dirección de pasarela (gateway) que nos comunique con otras redes. Para fijar nuestra dirección de pasarela, haremos uso del comando "route": # route add default gw 192.168.0.1
Es decir, añadimos una ruta diciendo que el gateway o pasarela por defecto será la IP 192.168.0.1. Todas las peticiones a IPs que no estén en nuestra red, las haremos a través de esa pasarela.
Después de configurar nuestra IP y la pasarela por defecto, estaremos en condiciones de llegar a cualquier IP a la que nos de acceso dicha pasarela. En este caso, los ejemplos de este artículo me han servido para configurar uno de mis ordenadores de mi pequeña LAN doméstica. A todos les he asignado una IP inventada por mí (en este caso 192.168.0.*), y mi router ADSL tiene como IP interna 192.168.0.1. Así, toda petición que no sea a otro ordenador de mi casa, se pedirá al gateway por defecto (192.168.0.1), y él (el router ADSL) lo encaminará hacia fuera (Internet). Para probar si llegamos desde nuestra máquina a otra máquina a través de la red, se suele utilizar el comando "ping": # ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.2: icmp_seq=0 ttl=255 time=0.7 ms
64 bytes from 192.168.0.2: icmp_seq=1 ttl=255 time=0.4 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=255 time=0.4 ms
--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.4/0.5/0.7 ms

Este comando lanzará un paquete ICMP de 64 bytes contínuamente al destino indicado, y verá si el destino nos responde, indicando el tiempo transcurrido (time=0.7 ms). Si no lo detenemos con Control+C, estará indefinidamente lanzando paquetes ICMP y esperando su respuesta.
Lo único que nos falta para terminar de configurar correctamente nuestra conexión Ethernet es establecer quién será nuestro servidor de nombres DNS. Para ello es necesario editar dos ficheros:
/etc/host.conf
/etc/resolv.conf El primero de ellos indica cuál será la fuente de las correspondencias dirección URL <-> dirección IP, ya que esta traducción puede hacerse preguntando a un servidor DNS o utilizando un fichero (/etc/hosts) que tenga esas correspondencias. Normalmente lo que se hace es utilizar ambas cosas, servidor y fichero, y poner en el fichero sólo las direcciones locales que no se preguntan al DNS. En el fichero /etc/resolv.conf indicaremos las direcciones IP de nuestros servidores DNS. Veámos unos ejemplos muy simples de lo que podría ir en cada uno de estos ficheros: # cat /etc/hosts
127.0.0.1 localhost
# cat /etc/host.conf
order hosts, bind
# cat /etc/resolv.conf
nameserver 194.179.1.100
nameserver 194.179.1.101
En el primer ficheros (/etc/hosts) únicamente tenemos la correspondencia entre nombre y dirección IP para 127.0.0.1, es decir, localhost. El resto se preguntará al servidor o servidores DNS. En el segundo fichero (/etc/host.conf) indicamos cuál será el órden para preguntar acerca de direcciones IP. En nuestro caso primero miraremos el fichero hosts (/etc/hosts) y posteriormente preguntaremos a los servidores DNS (bind). En el tercer fichero indicamos qué servidores DNS utilizaremos. El órden influye, por lo que 194.179.1.100 será nuestro servidor DNS primario, y 194.179.1.101 el secundario.
Ya está, si todo ha ido bien, nuestro navegador encontrará las páginas que solicitemos, podremos conectarnos a servidores ftp, pop3, etc. Para comprobarlo, vamos a ver si llegamos con un ping a www.linux.org, por ejemplo: # ping www.linux.org
PING www.linux.org (198.182.196.56): 56 data bytes
64 bytes from 198.182.196.56: icmp_seq=0 ttl=234 time=261.1 ms
64 bytes from 198.182.196.56: icmp_seq=1 ttl=234 time=257.9 ms
64 bytes from 198.182.196.56: icmp_seq=2 ttl=234 time=255.0 ms
64 bytes from 198.182.196.56: icmp_seq=3 ttl=234 time=258.5 ms
64 bytes from 198.182.196.56: icmp_seq=4 ttl=234 time=257.1 ms

--- www.linux.org ping statistics ---
6 packets transmitted, 5 packets received, 16% packet loss
round-trip min/avg/max = 255.0/257.9/261.1 ms

LISTO YA TENEMOS CONFIGURADO EL INTERNET :=)