Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[raw socket]
Envoyé par: youp

bonjour,

je souhaite envoyer un packet sur le port 53 utilisant le protocole udp.

j'utilise pour cela les raw socket.

le programme se lance mais aucun packet n'est envoyé !

#define __USE_BSD
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#define __FAVOR_BSD  /
#include <netinet/tcp.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

#define P 53


struct ipheader {
 unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */
 unsigned char ip_tos;
 unsigned short int ip_len;
 unsigned short int ip_id;
 unsigned short int ip_off;
 unsigned char ip_ttl;
 unsigned char ip_p;
 unsigned short int ip_sum;
 unsigned int ip_src;
 unsigned int ip_dst;
}; /* total ip header length: 20 bytes (=160 bits) */


struct udpheader {
 unsigned short int uh_sport;
 unsigned short int uh_dport;
 unsigned short int uh_len;
 unsigned short int uh_check;
}; /* total udp header length: 8 bytes (=64 bits) */


int 
main (void)
{
  int s = socket (PF_INET, SOCK_RAW, IPPROTO_UDP);	/* open raw socket */
  char datagram[4096];	/* this buffer will contain ip header, tcp header,
			   and payload. we'll point an ip header structure
			   at its beginning, and a tcp header structure after
			   that to write the header values into it */
  struct ipheader *iph   = (struct ipheader *) datagram;
  struct udpheader *udph = (struct udpheader *) datagram + sizeof (struct ipheader);
  struct sockaddr_in sin;
			/* the sockaddr_in containing the dest. address is used
			   in sendto() to determine the datagrams path */

  sin.sin_family = AF_INET;
  sin.sin_port = htons (P);/* you byte-order >1byte header values to network
			      byte order (not needed on big endian machines) */
  sin.sin_addr.s_addr = inet_addr ("127.0.0.1");

  memset (datagram, 0, 4096);	/* zero out the buffer */

/* we'll now fill in the ip header values, see above for explanations */
  iph->ip_hl = 5;
  iph->ip_v = 4;
  iph->ip_tos = 0;
  iph->ip_len = sizeof (struct ipheader) + sizeof (struct udpheader);	/* no payload */
  iph->ip_id = htonl (54321);	/* the value doesn't matter here */
  iph->ip_off = 0;
  iph->ip_ttl = 255;
  iph->ip_p = 6;
  iph->ip_sum = 0;		/* set it to 0 before computing the actual checksum later */
  iph->ip_src = inet_addr ("1.2.3.4");/* SYN's can be blindly spoofed */
  iph->ip_dst = sin.sin_addr.s_addr;
 
/* we'll now fill in the udp header values, see above for explanations */
  udph->uh_sport=12345;
  udph->uh_dport=htons(P);
  udph->uh_len=sizeof (struct udpheader);
  udph->uh_check=111;

      if (sendto (s,		/* our socket */
		  datagram,	/* the buffer containing headers and data */
		  iph->ip_len,	/* total length of our datagram */
		  0,		/* routing flags, normally always 0 */
		  (struct sockaddr *) &sin,	/* socket addr, just like in */
		  sizeof (sin)) < 0)		/* a normal send() */
	printf ("error\n");
  
   

  return 0;
}




avez-vous une idée ?

merci

Poste le Wednesday 7 February 2007 11:35:32
Répondre     Citer    
Re: [raw socket]

On n'utilise pas les RAW SOCKET pour du UDP (qui est au dessus de IP).

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Wednesday 7 February 2007 12:29:30
Répondre     Citer    
Re: [raw socket]
Envoyé par: youp

Citation
Basile STARYNKEVITCH
On n'utilise pas les RAW SOCKET pour du UDP (qui
est au dessus de IP).

Basile STARYNKEVITCH ---- où on trouve mon mél

N.B. N'hesitez pas à consulter aussi mes
contributions antérieures.

on peut le faire avec tcp, pourquoi pas avec udp ?

Poste le Wednesday 7 February 2007 13:03:12
Répondre     Citer    
Re: [raw socket]

Il te faut vérifier les erreurs (tester errno) après chaque appel système.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Wednesday 7 February 2007 13:06:50
Répondre     Citer    
Re: [raw socket]
Envoyé par: youp

Citation
Basile STARYNKEVITCH
Il te faut vérifier les erreurs (tester errno)
après chaque appel système.

Basile STARYNKEVITCH ---- où on trouve mon mél

N.B. N'hesitez pas à consulter aussi mes
contributions antérieures.

aucune erreur

Poste le Wednesday 7 February 2007 13:19:29
Répondre     Citer    
Re: [raw socket]

Verifie que l'appel système socket réussit. Eventuellement utilise un debogueur (ou strace) pour executer ton programme pas à pas.

Mais je ne suis pas sûr qu'on puisse faire du UDP en raw socket. Normalement c'est
int s;
s = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (s<0) perror("socket");
et le raw socket ne marche qu'en root.

Que cherches tu as faire exactement? Manifestement, tu n'as pas écrit ce bout de code... (probablement emprunté à tunnelcheck)


----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Wednesday 7 February 2007 13:32:15
Répondre     Citer    
Re: [raw socket]
Envoyé par: youp

Citation
Basile STARYNKEVITCH

Que cherches tu as faire exactement?

je veux faire un programme qui est capable d'envoyer d'injecter des packets... auparavant j'utilisais les sockets pour faire des clients, serveurs... Mais cette fois je veux remplir moi meme les entêtes de mes packets, donc on m'a dit d'utiliser les raw sockets et non plus les sockets. Mais je ne trouve pas de bonne documentation la dessus

Poste le Wednesday 7 February 2007 13:54:38
Répondre     Citer    
Re: [raw socket]
Envoyé par: youp

mais finalement, c'est quoi la différence entre sockets et raw sockets ? et donc peut-on dans mon cas juste utiliser les sockets ?

merci

Poste le Wednesday 7 February 2007 14:11:15
Répondre     Citer    
Re: [raw socket]

Il te faudrait lire un bon livre sur la programmation avancée sous Unix, et lire attentivement les pages de man et le code source de certains appels du noyau.

Personnellement je ne me lancerais pas dans la programmation des raw sockets avant d'eplucher très attentivement la documentation et le code source. Il existe des livres et des forums dédiés au noyau et/ou à ses couches réseaux.

Regards aussi dans le source de codes existants utilisant SOCKET_RAW

Par ailleurs il y a probablement une interaction entre les iptables et les raw sockets, et le filtrage ou autre que tu essaies de faire est peut-être accessible par les iptables.

Il me semble que les raw sockets sont bien moins normalisés que les sockets (voir peut-être [www.opengroup.org] ou ailleurs). Mais je dois avouer que je n'ai jamais codé du raw socket (juste du code utilisant UDP/IP & TCP/IP). Si tu y tiens vraiement, plonges toi assidument dans la documentation et dans le code source du noyau, et demande probablement ailleurs...

Le port 53 est celui du DNS. Essaies tu de coder un serveur DNS? Pourquoi ne pas utiliser ceux existants, ou au moins s'en inspirer?

Bref, tu n'as pas expliqué en détails ton véritable objectif, et il est probable que ta question soit trop technique ici.

En plus, si tu bogues sur le protocole DNS à un niveau si bas, tu risques t'empoisonner le réseau où tu es connecté (ou celui de ton FAI). Avant de m'y risquer, à ta place, je demanderais de l'aide et l'accord des adnministrateurs réseaux concernés.

Es tu déjà bien à l'aise avec les sockets, les protocoles réseaux (IP, UDP, TCP, ..), les services (DNS, ...)?

J'ai vraiement du mal à deviner ce que tu veux véritablement faire et pourquoi tu essaies comme ça....

J'espère que tu n'essaies pas de coder quelque chose de bizarre ou d'illicite.... ?-(


----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Wednesday 7 February 2007 14:53:46
Répondre     Citer    
Re: [raw socket]
Envoyé par: youp

Citation
Basile STARYNKEVITCH

J'espère que tu n'essaies pas de coder quelque
chose de bizarre ou d'illicite....


Basile STARYNKEVITCH ---- où on trouve mon mél

N.B. N'hesitez pas à consulter aussi mes
contributions antérieures.

non je voulais juste me familiariser avec les raw sockets pour etre capable de modéliser des packets. j'ai utilisé le port 53 parce qu'effectivement je voulais faire mes tests sur le protocole DNS. ca aurait tres bien pu etre un autre port.

Poste le Wednesday 7 February 2007 16:55:44
Répondre     Citer    
Re: [raw socket]

Le problème des raw sockets est qu'ils passent par dessus la couche IP du noyau. Pourquoi celle-ci ne te convient pas? Et si tu veux passer par dessus, tu dois bien la connaitre.

Bref, je n'ai toujours pas compris ce que tu veux faire...


----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Wednesday 7 February 2007 17:18:15
Répondre     Citer    
Re: [raw socket]
Envoyé par: youp

ben la question dans ce ca est : est-on obligé d'utiliser les raws sockets pour modifier l'entête des packets que l'on veut remplir à la main ? existe-il une autre librairie pour faire ca ?


Poste le Monday 12 February 2007 13:20:42
Répondre     Citer    
Re: [raw socket]

Il me semble (mais je peux me tromper, ça fait longtemps que j'ai regardé ça) que les règles IPTABLES peuvent modifier les entêtes des paquets.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Monday 12 February 2007 13:30:37
Répondre     Citer    
Re: [raw socket]
Envoyé par: youp

Citation
Basile STARYNKEVITCH
Il me semble (mais je peux me tromper, ça fait
longtemps que j'ai regardé ça) que les règles
IPTABLES peuvent modifier les entêtes des paquets.

Basile STARYNKEVITCH ---- où on trouve mon mél

N.B. N'hesitez pas à consulter aussi mes
contributions antérieures.

ok je vais me renseigner, merci.

Poste le Tuesday 13 February 2007 09:54:04
Répondre     Citer    
Filtrage de souce Multicast
Envoyé par: Diallo hamzata

Bonjour,
Je souhaiterais pouvoir faire du filtrage/basculement de source.
J'ai 2 sources de flux qui sont connectées à l'interface1 d'un routeur multicast (vyatta ou autre). Sur l'interface2 j'ai un groupe multicast qui devrait recevoir le flux. Je voudrais pouvoir basculer d'une source à l'autre, comme ça si par exple je choisis la souce 1 et que le flux n'arrive pas (à cause d'une panne par exple) au bout d'un certain tps, je veux que le routeur bascule sur la source2 pour router ses packets.

Pour cela je veux créer un processus daemon linux qui ouvre une socket sur l'interface où arrive les flux. La socket se met en attente des flux de la source1. Si au bout d'un certain temps aucun packet de cette source n'est reçu, alors je vais changer la config du routeur pour transmettre les packets de la source2.

Je voudrais savoir si qlq'1 d'autre voit une meilleure façon de faire cela ou bien si qlq'1 connaît des choses qui pourraient m'aider à faire cela.


Poste le Thursday 1 March 2007 13:57:17
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[raw socket]
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons