Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

simuler un paquet ethernet

4 réponses
Avatar
pornin
Je cherche à fabriquer de faux paquets ethernet. J'ai un FreeBSD 4.8
sous la main ; il est relié à un réseau local par une banale carte
3Com (3c905C-TX).

Avec /dev/bpf*, je peux avoir une copie des paquets ethernet reçus
par cette carte, et je peux aussi en fabriquer de nouveaux. Je peux
même changer l'adresse MAC des paquets que j'émets.

Avec ça, je peux simuler, vis-à-vis des autres hôtes sur le même lien,
la présence sur le lien d'une autre carte ethernet, virtuelle, avec
comme adresse MAC celle que j'ai choisie. J'ai pu comme ça répondre à
une requête ARP, et, avec un peu de boulot en plus, je pourrais renvoyer
un ICMP echo reply (autrement dit, avoir une IP sur ma carte virtuelle,
et répondre au ping).

Mon problème est que ça ne marche que vis-à-vis des autres hôtes,
mais pas pour celui sur lequel je fais tourner ma carte virtuelle.
C'est assez logique : quand j'émets un paquet ethernet depuis ma carte
virtuelle, ce paquet passe physiquement par la carte 3Com, et donc
ladite carte fait comme pour tous les paquets qu'elle émet : elle ferme
les yeux pour ne pas les voir.

Donc il faudrait que je simule l'arrivée d'un paquet ethernet sur la
carte 3Com (une copie du paquet que cette même carte vient d'émettre).
Y a-t-il moyen de faire ça ? Je pourrais patcher le noyau (il y a
dans src/sys/net/if_loop.c une fonction if_simloop() qui fait un
peu le même boulot, je n'aurais plus qu'à ajouter un ioctl() au bon
endroit pour l'appeler) mais ça m'arrangerait qu'il existe une solution
standard implémentable en userland et fonctionnant avec une installation
canonique (id est, le noyau GENERIC et ses modules chargeables).

De même, je pourrais magouiller avec tun* (en prenant en charge
directement tout le trafic ethernet, en faisant l'ARP moi-même pour à la
fois mon IP virtuelle et l'IP normale de la machine) mais c'est un peu
lourd à mettre en place, et ça peux poser des problèmes de performances
(ça veut dire que tout le trafic passe par mon programme userland) voire
de deadlocks (si je lance le programme depuis un filesystem monté en
NFS).

Est-ce que quelqu'un a une idée ?


--Thomas Pornin

4 réponses

Avatar
Vincent RIEDWEG
En cette belle journée du Jeudi 26 Juin 2003 12:29, Thomas Pornin écrivait
sur fr.comp.os.bsd :
Je cherche à fabriquer de faux paquets ethernet. J'ai un FreeBSD 4.8
sous la main ; il est relié à un réseau local par une banale carte
3Com (3c905C-TX).

Avec /dev/bpf*, je peux avoir une copie des paquets ethernet reçus
par cette carte, et je peux aussi en fabriquer de nouveaux. Je peux
même changer l'adresse MAC des paquets que j'émets.

Avec ça, je peux simuler, vis-à-vis des autres hôtes sur le même lien,
la présence sur le lien d'une autre carte ethernet, virtuelle, avec
comme adresse MAC celle que j'ai choisie. J'ai pu comme ça répondre à
une requête ARP, et, avec un peu de boulot en plus, je pourrais renvoyer
un ICMP echo reply (autrement dit, avoir une IP sur ma carte virtuelle,
et répondre au ping).

Mon problème est que ça ne marche que vis-à-vis des autres hôtes,
mais pas pour celui sur lequel je fais tourner ma carte virtuelle.
C'est assez logique : quand j'émets un paquet ethernet depuis ma carte
virtuelle, ce paquet passe physiquement par la carte 3Com, et donc
ladite carte fait comme pour tous les paquets qu'elle émet : elle ferme
les yeux pour ne pas les voir.

Donc il faudrait que je simule l'arrivée d'un paquet ethernet sur la
carte 3Com (une copie du paquet que cette même carte vient d'émettre).
Y a-t-il moyen de faire ça ? Je pourrais patcher le noyau (il y a
dans src/sys/net/if_loop.c une fonction if_simloop() qui fait un
peu le même boulot, je n'aurais plus qu'à ajouter un ioctl() au bon
endroit pour l'appeler) mais ça m'arrangerait qu'il existe une solution
standard implémentable en userland et fonctionnant avec une installation
canonique (id est, le noyau GENERIC et ses modules chargeables).

De même, je pourrais magouiller avec tun* (en prenant en charge
directement tout le trafic ethernet, en faisant l'ARP moi-même pour à la
fois mon IP virtuelle et l'IP normale de la machine) mais c'est un peu
lourd à mettre en place, et ça peux poser des problèmes de performances
(ça veut dire que tout le trafic passe par mon programme userland) voire
de deadlocks (si je lance le programme depuis un filesystem monté en
NFS).

Est-ce que quelqu'un a une idée ?


utilises hping2...

Vincent.

Avatar
Thierry Herbelot
[en quotant un peu mieux ;-DD]

bonsoir,

as-tu regardé du coté de netgraph ? (j'imagine que dans l'outillage de
plomberie associé, on doit pouvoir trouver un truc qui renvoie un paquet
qu'on vient de recevoir)

bon courage quand même

TfH

PS : j'ai réussi à perdre les accents circonflexes sous KDE (pourtant en
version récente / portupgrade est passé par là)
si quelqu'un a une idée ... à vot' bon coeur !
Avatar
pornin
According to Thierry Herbelot :
as-tu regardé du coté de netgraph ? (j'imagine que dans l'outillage de
plomberie associé, on doit pouvoir trouver un truc qui renvoie un paquet
qu'on vient de recevoir)


Yes ! Ça ressemble à ce qu'il faut. Je vois ceci dans la page de man
de ng_ether(4) :

<< The upper hook is a connection to the upper protocol layers. When
connected, all outgoing packets are diverted out this hook. Writing
to this hook results in a raw Ethernet frame being received by the
kernel just as if it had come in over the wire. >>

Il ne me reste plus qu'à voir comment contrôler ça depuis le userland.
Apparemment, il y a une libnetgraph qui permet ce genre de choses.
Merci !


Pour info, hping ne fait pas l'affaire parce qu'il travaille au niveau
IP (il reçoit les paquets IP par la libpcap, qui elle-même utilise bpf,
et émet des paquets IP par une socket de type "AF_INET" et "SOCK_RAW") ;
la mécanique ARP, par exemple, lui est complètement invisible.


--Thomas

PS : au fait, netgraph, ça existe sous NetBSD / OpenBSD ?

Avatar
Miod Vallat
PS : au fait, netgraph, ça existe sous NetBSD / OpenBSD ?


Non.