Configuración de interfaces de red a bajo nivel. [Solucionado]
Hola a todos.
Estoy realizando una aplicación que permita la configuración de los interfaces de red en un entorno de texto ncurses y me gustaría saber si existe alguna biblioteca de C/C++ que me ayude a gestionar la configuración de los interfaces de red en Debian.
El tema de la configuración inalámbrica está solucionado con "iwlib", que permite la configuración del punto de acceso, la frecuencia y todos los parámetros de una red wifi, el problema viene en el siguiente paso, una vez establecida la configuración inalámbrica, cuando hay que configurar los parámetros de acceso a la red. No encuentro la manera de asignar la dirección ip a un adaptador, o la máscara de red, si no es a través de llamadas al sistema con la función system(), utilizando la orden ifconfig.
En definitiva, lo que busco es una biblioteca que facilite la configuración de red de los interfaces del sistema.
Espero haberme explicado con claridad, si hay alguna duda, por favor preguntadme.
Un saludo.
- Inicie sesión o regístrese para enviar comentarios
- 721 lecturas


Hola marmaraba
Si, con libpcap se puede hacer esto y unas cuantas cosillas más, puedes ver en la página 10 de este manual como obtener algunos datos sobre las interfaces, así pues deduzco que te será posible configurarlas (y dado que la mayoría de sniffers se basan en esta librería es más que seguro...)
Aquí el ejemplo:
/**********************************************************************
* Fichero: lsdevs.c
* Fecha: Alejandro Lopez Monge
* Orignal: Martin Casado http://www.cet.nau.edu/˜mc8/Socket/Tutorials/section1.html
*
* Compilacion: gcc lsdevs.c -lpcap
*
* Descripcion:
* Buscamos la primera interfaz de red disponible y lista su direccion de red
* (que no su direccion IP) y su mascara de subred.
*
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pcap.h>
int main(int argc, char **argv) {
char *net;
char *mask;
char *dev;
int ret;
char errbuf[PCAP_ERRBUF_SIZE];
bpf_u_int32 netp;
bpf_u_int32 maskp;
struct in_addr addr;
if ((dev = pcap_lookupdev(errbuf))== NULL) {
printf("ERROR %s\n",errbuf);
return -1;
}
printf("Nombre del dispositivo: %s\n",dev);
if ((ret = pcap_lookupnet(dev, &netp, &maskp, errbuf)) == -1) {
printf("ERROR %s\n",errbuf);
return -1;
}
addr.s_addr = netp;
if ((net = inet_ntoa(addr))==NULL) {
perror("inet_ntoa");
return -1;
}
printf("Direccion de Red: %s\n",net);
addr.s_addr = maskp;
mask = inet_ntoa(addr);
if ((net=inet_ntoa(addr))==NULL) {
perror("inet_ntoa");
return -1;
}
printf("Mascara de Red: %s\n",mask);
return 0;
}
EDITO
Más fácil:
http://www.fys.uio.no/studier/kurs/fys4220/docs/vxworks/ref/ifLib.html
Gracias por tu respuesta E0N.
He estado echando un vistazo a las librerías que me has recomendado.
Te agradezco mucho el interés, he estado echando un vistazo a la información que me has pasado. Por lo que veo libpcap es una biblioteca para capturar los paquetes que circulan a través de un interfaz de red, he estado investigando el API y no he encontrado ninguna función para configurar un interfaz, tan solo he visto que hay funciones para consultar información de la configuración actual. El resto son para realizar la captura de los paquetes.
En cuanto a la otra biblioteca, iflib, tiene muy buena pinta, son exactamente las funciones que necesito, la única pega que encuentro es que se trata de una implementación, por lo que he podido averiguar, para WxWorks, un sistema operativo para sistemas embebidos. O si existe una versión portada a Linux yo no he sido capaz de encontrarla.
Agradecería cualquier información que me pudierais ofrecer sobre el tema.
Un saludo.
Huy si, perdona
Efectivamente pcap (packet capture) es una librería usada para sniffar paquetes, siempre que la he usado para obtener datos de las interfaces con pcap_findalldevs(), así que había presupuesto que también se podrían modificar, y si, en lo de iflib tienes razón, perdona, fallo mio...
Lo único de provecho que he encontrado googleando ha sido el código de ifconfig, donde hay funciones del tipo set_netmask...
Me auto-contesto...
Tras mucho investigar, ayer, en el IRC de debian, charlando con DrDub (gracias por la inspiración) descubrimos que desde el propio código de net-tools se puede compilar una librería perfectamente utilizable con acceso a las todas las funcionalidades disponibles.
Aunque la interfaz que te ofrece no es muy amigable sí que se puede realizar cualquier funcionalidad, al menos lo que he probado hasta ahora... No da las funciones que serían, por decirlo de alguna forma, lógicas como if_set_config() o if_get_config(), pero no parece difícil crear una biblioteca a medida para un uso personalizado.
El proceso es sencillo, lo primero es obtener el código fuente de net-tools, por ejemplo desde http://ftp.de.debian.org/debian/pool/main/n/net-tools/net-tools_1.60.ori..., es la versión 1.60. Al descomprimirlo (
tar xvfz net-tools_1.60.orig.tar.gz) obtenemos la estructura de directorios típica de un paquete de código fuente con los directoriosincludede ficheros de cabecera,libcon bibliotecas utilizadas,mancon ficheros de manual, en este casopocon ficheros para internacionalización, etc.Lo que tenemos que hacer es compilar, directamente, en este caso no hay que utilizar el típico
./configure, pues la configuración es "manual" al ejecutarmake. Lo hacemos, pues, lo primero que hacemos es decir que protocolos queremos utilizar y alugnas cosas más, podemos dejar las opciones por defecto pulsando unos cuantos intros y amén.Cuando comienza la compilación nos encontramos con que nos sale con errores. Es extraño que un código tan "trillado" como el que nos ocupa dé errores durante la compilación, pero para lo que necesitamos no es difícil de solventar. Como lo primero que compila son las librerías vemos en el directorio
libnos ha creado unos cuantos ficheros .o, vamos pues a solucionar los problemas. El primero fichero que nos falla eslib/inet_sr.c, sólo tenemos que introducir tras eldefault:de la línea 107 unbreak;. El otro fichero que falla (al menos en mi caso) eslib/x25_sr.c, en este tenemos que cambiar la línea 80 (memcpy(&rt.address, &sx25.sx25_addr, sizeof(x25_address));) pormemcpy(&rt.address, &sx25.sx25_addr, sizeof(struct x25_address));.Con estos pequeños cambios ya podemos compilar la librería que necesitamos, pero esta vez no vamos a utilizar el Makefile del directorio raíz sino el que hay dentro del directorio
lib. Primero limpiamos,make cleany después compilamos conmake. No olvidemos hacerlo desde dentro del directoriolib.Tras este proceso tendremos dentro del directorio
libel ficherolibnet-tools.aque será el que finalmente utilizaremos para nuestro proyecto. Los ficheros de cabecera los obtenemos del directorioinclude.Es importante al menos ejecutar una vez
makeen el directorio raíz para establecer la configuración de compilación posterior, el Makefile del directoriolibtambién utiliza el ficheroconfig.hque se crea al ejecutar el primermake. Si tras hacer los cambios mencionados en el código vemos que no acaba de compilar el proyecto completo es por que hay otros errores, pero no me he puesto a intentar resolverlos.Espero que sea de ayuda para alguien, me ha llevado un buen tiempo encontrarlo.
Un saludo.
MarMarAba
[...] Espero que sea de ayuda para alguien, me ha llevado un buen tiempo encontrarlo.
Un saludo.
MarMarAba
No soy desarrollador y dudo que yo vaya a usar esto alguna vez, pero te agradezco mucho el tiempo y detalle para haber compartido la solución .... no parece difícil arreglarlo según como lo has explicado.
Saludos y éxito en tu proyecto,
Sidd.