Administración de redes en GNU/Linux La configuración de una red en UNIX/Linux es en cierta medida más compleja que en sistemas Microsoft. Sin embargo para numerosos administradores tiene un mayor grado de flexibilidad y fiabilidad, permitiendo diseñar fácilmente herramientas a medida que faciliten su control y administración. La configuración de la mayor parte de los servicios y recursos de un sistema UNIX se guarda en ficheros planos, ficheros de texto que podemos modificar con cualquier editor de texto ( Ej.- vi ). La localización de estos archivo se sitúa normalmente en el directorio /etc. En el propio sistema y en Internet podemos encontrar abundante documentación sobre administración de redes, existiendo numeras listas de distribuciones, canales de chat o news donde podemos solicitar información. Los parámetros básicos de configuración son los mismos de cualquier equipo sobre TCP/IP • • • • • Nombre del host Dirección IP Mascara de red Servidores DNS Rutas por omisión. Principales ficheros: /etc/hostname /etc/hosts /etc/resolv.conf /etc/host.conf /etc/sysconfig/network /etc/inetd.conf /etc/init.d Guarda el nombre del equipo Guarda el nombre y la dirección IP de los equipos de la red, puede ser utilizado tanto si tenemos o no configurado un servidor DNS Guarda el nombre del dominio principal y la dirección de los servidores de nombres (DNS) Guarda el orden de los métodos de resolución de nombre y direcciones IP Contiene los archivos de configuración de cada interfaz de conexión de red. ifcfg-lo ( Configuración TCP/IP de loopback) ifcfg-eth0 (Configuración TCP/IP de primer intefaz Ethernet) ifcfg-ppp0 (Configuración TCP/IP de la conexión PPP ) routes ( Rutas estáticas de encaminamiento de paquetes) Configuración de los servicios TCP/IP Asignación de servicios y programas que los tratan Comandos de arranque y parada de los distintos servicios del sistemas ( demonios de UNIX) /etc/init.d/network ( arranca y para los interfaces de red) El nombre y localización de estos ficheros y el contenido de los mismos puede variar en función de la versión de UNIX: en las distintas distribuciones GNU/Linux (Mandrake, Rethat, Debian, SuSe, Linex,..) o en la versiones de HP (HP-UX), IBM (AIX), Sun ( SunOS), UNIX SCO, FreeBSD, etc. PRINCIPALES COMANDOS DE ADMINISTRACIÓN DE RED: ifup, ifdown, ifstatus: Arranca, para o muestra el estado de un interfaz de red, utilizando la configuración predefinida en los archivos /etc/sysconfig/network. Se suelen ejecutar automáticamente durante el arranque del sistema. Ej- ifup eth0 , Arranca el interfaz de red de la primera tarjeta Ethernet ifconfig: Permite activar o desactivar el interfaz de red, fijar manualmente todos los parámetros de configuración básicos de TCP/IP la dirección IP, la mascara y la dirección de broadcast. Se puede activa la interfaz de red manualmente asociándole la dirección IP junto con la máscara de red y la dirección de broadcast: Sintaxis básica: ifconfig <Interfaz> <dir_IP> netmask <máscara> broadcast <broadcast> Ej.- ifconfig eth1 138.100.58.45 netmask 255.255.255.0 broadcast 138.100.58.255 Para mostrar la configuración actual: ifconfig –a Para activa o desactivar un interfaz de red: ifconfig eth1 up ifconfig eth1 down Una mismo interfaz de red eth0 puede tener varias IP o alias si definimos los archivos correspondientes. Por ejemplos si definimos los ficheros: ifcfg-eth0 ifcfg-eth0:0 La misma tarjeta Ethernet eth0 tendrá dos IP cada uno configurado en su archivo. route: Permite gestionar las rutas estática de encaminamiento de los paquetes IP. Ejemplos: route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0 -- Los paquetes de a la red 192.56.76.0 se envía directamente por la tarjeta eth0 route add default gw 192.56.76.1 -- El gateway/router por omisión es el 192.56.76.1 route add -net 192.168.12.0 netmask 255.255.255.0 gw 192.168.1.3 eth1 -- Para enviar paquetes por a la red 192.168.12 los envío por la tarjeta eth1 a través del gateway 192.168.1.3 route del -net 192.168.1.0 netmask 255.255.252.0 -- Borra la ruta hacia la red 192.168.1.0 route -n -- Muestra las rutas activas HERRAMIENTAS DE MONITORIZACIÓN Y CONTROL netstat: Permite ver el estado de la red: Interfaces de red, conexiones activas, tablas de rutas Ejemplos: netstat -i -- Estado de los interfaces de red netstat -nt -- Tabla de rutas netstat -t inet -a Conexiones activas vía TCP/IP arp: Maneja la tabla de asignación direcciones MAC : direcciones IP ping: Comando estándar de envío de mensajes ICMP de solicitud de eco. traceroute: Permite comprobar la ruta de los paquetes a través de la red. HERRAMIENTAS DE ANÁLISIS DEL TRÁFICO EN LA RED Modo texto: tcpdump, iptraf Modo gráfico: Ethereal ( Sniffer con licencia GNU) PROGRAMAS CLIENTES DE RED: UNIX/LINUX suelen incluir la mayoría de los clientes y servidores de aplicaciones en sobre TCP/IP : telnet, ftp, ssh, scp, mail, news, irq, dhcp, http, etc. UTILIDADES DE ADMINISTRACIÓN: La mayor parte de las versiones de UNIX/LINUX incluyen utilidades de administración que facilitan el manejo de la red sin tener que acceder directamente a los archivos de configuración. • • • • • • netconf / linuxconf ( Mandrake / Redhat) yast ( SuSe) sam (HP-UX) scoadmin (SCO UNIX) ( SunOS) webmin (Administración mediante una página web ) COMUNICACIÓN EN LA RED 1.- Sockets : Modelo IPC de 4.3BSD permite la comunicación entre procesos dentro de una misma máquina o en máquinas distintas conectadas mediante distintos tipos de redes, soportando múltiples protocolos. Ventajas de los sockets - Transparentes: Un proceso que lee o escribe de la entrada y salida estándar puede hacerlo directamente de un sockets sin cambiar una sola línea de código. - Eficiente: No genera una gran carga al sistema operativo. - Alto nivel: Ofrece una librería a nivel de transporte - Compatible: Permite utilizar múltiples protocolos El uso sockets es un modelo estándar de trabajo sobre redes TCP/IP tanto en intranet como Internet existiendo librerías de sockets en casi todos los sistemas operativos: Unix, Linux, MacOS, Windows XX. Es la base sobre la que se han desarrollado la mayor parte de las aplicaciones cliente - servidor de Internet: páginas web, correo, chat, ftp, telnet, etc. Ofrece un modelo compatible con la E/S estándar sobre ficheros. Un programa que lee y escribe de la entrada y salida estándar puede hacerlo igualmente sobre un socket. Procedimiento básico: Abrir y configurar los sockets, crear un proceso hijo, redireccionar, y arrancar mediante exec: la entrada y salida estándar de cualquier proceso puede estar redireccionada a un sockets. Ej .- telnet redirecciona la entrada y salida del al shell ( bash) MODELO ISO / OSI y su correspondencia con las REDES TCP/IP Aplicación Aplicación: http,ftp,smtp Presentación Sesión Transporte TCP / UDP Red IP Enlace Acceso a Red Físico Los sockets constituyen una Librería de acceso al Nivel 4: a los protocolos de Transporte TCP y UDP Una conexión mediante sockets TCP/IP se establece definiendo: La comunicación mediante Socket se realiza indicando: dirección IP , puerto, dirección IP , puerto, protocolo (tcp/udp) 194.35.135.5 Puerto 1256 Puerto 80 Ej.- Conexión a un servidor de páginas web: protocolo http sobre tcp 200.4.120.10 TCP/IP En UNIX y GNU/Linux Ficheros de configuración: /etc/hosts Tabla estática con la dirección de los servidores en la red. Formato: DirecciónIP Nombre.dominio alias 127.0.0.1 localhost 192.168.1.10 foo.mydomain.org foo 192.168.1.13 bar.mydomain.org bar 216.234.231.5 master.debian.org master 205.230.163.103 www.opensource.org /etc/services Descripción de los servicios predefinidos nombre puerto / protocolo Campo informativo alias Ej.ftp-data 20/tcp File Transfer [Default Data] ftp 21/tcp File Transfer [Control] ssh 22/tcp Secured Shell telnet 23/tcp Telnet smtp 25/tcp Simple Mail Transfer time 37/tcp/udp Time nameserver 42/tcp/udp Host Name Server nicname 43/tcp/udp Who Is domain 53/tcp/udp Domain Name Server Numeración de los Puertos 1-1024 Privilegiados: sólo un proceso perteneciente al superusuario (root) puede enlazarse y ser servidor de uno de estos puertos ( medida de seguridad). Predefinidos en la norma RFC 1700 /etc/inetd.conf Fichero de configuración del superservidor inetd ( En Mandrake se utiliza otro sistema ) servicios, tipo de protocolos, modo de arranque, usuario, programa, parámetros ftp telnet talk stream stream dgram tcp tcp udp nowait nowait wait root root root /usr/bin/ftpd ftpd /usr/bin/telnetd telnetd /usr/bind/talkd talkd Todos los servicios suelen tener un proceso cliente y otro servidor: Ej .- ssh (cliente) y sshd (demonio o servidor ) Todos estos servidores no están siempre activos si no que son arrancados por el superservidor inetd cuando hay alguna petición para ellos Ej.- ftp, telnet Hay servicios que pueden estar configurados para estar siempre activos y no ser arrancados por inetd, son arrancando automáticamente durante el inicio del sistema, para tenerlos siempre activos a la espera de peticiones Ej.- httpd (apache) y sendmail (correo electrónico ), proftpd (ftp en Mandrake). Es decisión del administrador que servicios están siempre activos o son arrancados automáticamente por el inetd /etc/protocol Identificación de los distintos protocolos También existen ficheros similares sobre Windows 98: en c:\windows hosts, services y protocol SOCKETS (Conectores, enchufes ) Un sockets establece una conexión virtual entre dos procesos, es labor del programador definir el tipo de información que se intercambian: son los protocolos de nivel superior http, ftp, pop, smtp Mediante sockect se puede establecer comunicaciones con distintas familias de protocolos: PF_UNIX / PF_LOCAL ( socket dentro de la misma maquina, similar a la FIFO pero Bidireccional o Dúplex) PF_INET ( socket sobre TCP/IP) incluye los protocolos TCP y UDP PF_INET6 ( socket sobre Internet versión 6) PF_IPX ( socket sobre redes IPX ( Novell/ netware) PF_X25 ( socket sobre X25 ) Nivel 3 de la ISO PF_SNA ( socket sobre SNA ) Red de IBM FAMILLIA PF_INET Protocolo de red: IP : Paquetes de datos que van de origen a destino, no se controla el orden, la pérdida o duplicación de lo mismos, este protocolo de red realiza el encaminamiento y controla si hay errores en la datos contenidos en cada paquete. Protocolos de transporte: TCP : Controla la secuencia y el orden ( modo conexión ) pero no los límites del mensaje UDP: Simular a IP, pero no controla el orden ni la pérdida ( sin conexión) si controla los límites del mensaje Una conexión mediante sockets TCP/IP se establece definiendo: < dirección IP , puerto, dirección IP , puerto, protocolo (tcp/udp) > Una misma máquina (una dirección IP) puede tener múltiples conexiones con otra máquina ( otra dirección IP) si se utilizan distintos puertos FORMATO DE DIRECCIONES DE SOCKETS /* Formato general */ struct sockaddr { short sa_family; char sa_data[14]; } /* Dirección en sockets PF_UNIX */ struct sockaddr_un { short sa_family; char sun_path[108]; /* Ruta al archivo socket */ } /* Dirección en sockets PF_INET */ struct sockaddr_in { short sin_family; /* Familia */ short sin_port; /* Puerto */ long sin_addr; /* Dirección IP, En algunos : struct in_addr sin_addr; */ char sin_zero[8]; } struct in_addr { long s_addr; /* 4 bytes 192.168.12.100 */ } TIPOS DE SOCKETS BÁSICOS : - SOCK_STREAM ( Circuitos virtuales , con conexión ) Bidireccional, Entrega fiable y ordenada, se detecta la pérdida de paquetes y los paquetes duplicados, no mantiene los limites de los mensajes, comunicación orientada a conexión envío y recepción al mismo destino, comunicación 1 a 1 - SOCK_DGRAM ( Modo datagrama, Conmutación de paquetes, sin conexión ) Bidireccional, No fiable, no se garantiza el orden y puede existir duplicidad y paquetes perdidos, se mantiene los límites de los mensaje, comunicación sin conexión Se puede enviar y recibir cada mensaje de destinos y orígenes diferentes, 1 socket - > N destinos o Ndestinos -> sockets - SOCK_RAW ( Crudo sin tratar) permite accede al protocolo interno IP FUNCIONES PARA EL MANEJO DE SOCKETS Básicas : socket - Crea el canal o socket ( Sin configurar ni conectar con nada ) (C/S) bind - Define o asigna un puerto a socket y lo hace público (S) listen - Define una lista de espera para pendientes de conexión al sockets (S) accept - Acepta conexiones devuelve un sockets nuevo con la conexión establecidad (S) conect - Intenta establecer una conexión con a un puerto determinado read, recv, recvmsg - Recibir / leer mensajes del sockets, write, send, sendmsg - Enviar / Escribir mensaje al sockes close - Cierra la conexión y libera el descriptor de fichero shutdown - Cierra un socket para envio recepción o ambos FUNCIONES SOBRE DIRECCIONES Y SERVICIOS : 1.Obtener información sobre un servidor struct * hostent gethostbyname ( const char *nombre ) // Apartir del nombre struct * hostent gethostbyaddr (const void *addr, int len, int type); // A partir de la dirección struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; } /* nombre oficial del anfitrión */ /* lista de alias */ /* tipo dirección anfitrión */ /* longitud de la dirección */ /* lista de direcciones */ Esta funciones acceden al fichero /etc/hosts y realizan peticiones al servidor de nombres DNS. int gethostname( char *nombre, int longitud ) Obtiene el nombre del host del equipo local 2.Obtener el puerto que trata un servicio especifico Consulta del fichero /etc/services struct servent *getservbyname(const char *name, const char *proto); struct servent *getservbyport(int port, const char *proto); Estructura devuelta por la funciones anteriores: struct servent { char *s_name; /* nombre oficial del servicio */ char **s_aliases; /* lista de alias */ int s_port; /* número de puerto */ char * s_proto; /* protocolo a usar */ } 3.Transformar el formato de direcciones Existen tres posibles formatos de una dirección IP: -En forma de cadena “192.168.15.14” -Como long en formato interno del equipo (En PC procesadores Intel Primero se almacena el byte de menor peso ) -Como long en formato del red ( Primero se almacena el byte de mayor peso ) unsigned long int inet_addr (const char *cp); char * inet_ntoa (struct in_addr in); “192.168.1.10” -> dirIP en formato Red dirIP en formato Red -> “192.168.1.10” Funciones para cambiar: entero corto y largo entre formato interno y el de la red. unsigned long int htonl(unsigned long int hostlong); unsigned short int htons(unsigned short int hostshort); unsigned long int ntohl(unsigned long int netlong); unsigned short int ntohs(unsigned short int netshort); long de host a net short de host a net long de net a host short de net a host FUNCIONES BASICAS socket - Crea el canal o socket ( Sin configurar ni conectar con nada ) (C/S) #include <sys/types.h> #include <sys/socket.h> int socket(int dominio, int tipo, int protocolo); DESCRIPCIÓN Socket crea un extremo de una comunicación y devuelve un descriptor. bind - Define o asigna un puerto a un socket y lo hace público (S/C) int bind(int fd, struct sockaddr * dirección, socklen_t tamaño); DESCRIPCIÓN bind da al conector fd la dirección local midirección. Que tiene una longitud de tamaño bytes. Tradicionalmente, esto se conoce como "asignar un nombre a un conector." listen - Define una lista de espera para pendientes de conexión al sockets (S) int listen(int s, int backlog); DESCRIPCIÓN Para aceptar conexiones, primero se crea un conector con socket(2), luego se especifica con listen el deseo de aceptar conexiones entrantes y un límite de la cola para dichas conexiones accept - Acepta conexiones devuelve un socket nuevo con la conexión establecida (S) int accept(int s, struct sockaddr *addr, socklen_t *addrlen); DESCRIPCIÓN La función accept se usa con conectores orientados a conexión (SOCK_STREAM). Extrae la primera petición de conexión de la cola de conexiones pendientes, le asocia un nuevo conector con las misma propiedades que s y reserva un nuevo descriptor de fichero para el conector. El parámetro de sálida addr contiene la dirección del equipo remoto que ha realizado la conexión. connect - Intenta establecer una conexión con a un puerto determinado int connect ( int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); (C) DESCRIPCIÓN El descriptor de fichero sockfd debe referenciar a un conector. Si el conector es del tipo SOCK_DGRAM entonces la dirección serv_addr es la dirección a la que por defecto se envían los datagramas y la única dirección de la que se reciben datagramas. Si el conector es del tipo SOCK_STREAM, esta llamada intenta hacer una conexión a otro conector. El otro conector está especificado por serv_addr, la cual es una dirección (de longitud addrlen) en el espacio de comunicaciones del conector. read, recv, recvmsg - Recibir / leer mensajes del sockets, int recv (int s, void *buf, size_t lon, int flags); int recvfrom (int s, void *buf, size_t lon, int flags, struct sockaddr *desde, socklen_t *londesde); int recvmsg (int s, struct msghdr *msg, int flags); DESCRIPCIÓN Las llamadas recvfrom y recvmsg se emplean para recibir mensajes desde un conector (``socket''), y pueden utilizarse para recibir datos de un conector sea orientado a conexión o no. write, send, sendmsg - Enviar / Escribir mensaje al sockes in send (int s, const void *msg, size_t len, int flags); int sendto (int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); int sendmsg (int s, const struct msghdr *msg, int flags); DESCRIPCIÓN Send, sendto y sendmsg son utilizados para transmitir un mensaje a otro conector. Send solo puede ser usado cuando un conector está en un estado connected mientras sendto y sendmsg pueden ser utilizados en cualquier momento, enviando los datos a distintas direcciones. shutdown - Cierra un socket para envío recepción o ambos int shutdown(int s, int como); DESCRIPCIÓN La llamada a shutdown causa que se cierre completamente o en parte una conexión bidireccional en el zócalo asociado con s. Si como es 0, no se permitirán más recepciones. Si como es 1, no se permitirán más envíos. Si como es 2, no se permitirán más envíos ni recepciones. close - Cierra la conexión y libera el descriptor de fichero int close(int fd); DESCRIPCIÓN close cierra un descriptor de fichero ( o socket asociado) de forma que ya no se refiera a fichero o conexión alguno y pueda ser reutilizado. ESQUEMA CLIENTE – SERVIDOR CON SOCK_STREAM (TCP) CLIENTE Actividad Crear el socket Solicitar conexión Enviar datos Recibir datos Desconectar SERVIDOR Llamada al sistema Actividad socket() Crear el socket Fijar la dirección del sockets, indicar IP y puerto a reservar Definir la cola de espera de peticiones de conexión connect() Aceptar conexión write() Leer datos send() read() Enviar datos recv() close() Desconectar Llamada al sistema socket() bind() listen() accept() read() recv() write() send() close() ESQUEMA CLIENTE – SERVIDOR CON SOCK_DGRAM (UDP) CLIENTE Actividad Crear el socket Fijar la dirección del sockets, indicar IP y puerto a reservar Enviar mensaje Recibir mensaje Desconectar ( cerrar socket) SERVIDOR Llamada al sistema Actividad socket() Crear el socket bind() Fijar la dirección del sockets, indicar IP y puerto a reservar sendto() Recibir mensaje recvform() Enviar mensaje close() Desconectar ( cerrar socket) Llamada al sistema socket() bind() recvform() sendto() close() En socket UDP, el cliente puede utilizar la función connect si va a enviar y recibir mensaje a la misma dirección. En este caso puede utilizar funciones write, read o send, recv sin especificar el origen o el destino del mensaje. EJEMPLOS: 1. Obtener información a partir de un nombre : consultarNombre 2. Obtener información de un servidor a partir de una dirección IP : consultarDir 3. Ver formatos de los datos enteros en PC y en RED : formatos 4. Escanear una serie de puertos TCP para intentar conectarnos: scanTCP 5. Cliente y servidor interactivo TCP: clienteTCP y servidorTCP 6. Servidor concurrente. servidorMTCP 7.Cliente y servidor de un minichat : michatS y michatC 8. Cliente y servidor interactivo sobre UDP: clienteUDP y servidorUDP