Comunicación mediante Socket BSD

Anuncio
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
Descargar