TCP handshake avec SOCK_RAW socket
Ok, je sais que cette situation est un peu inhabituel, mais j'ai besoin d'établir une connexion TCP (3-way handshake) en utilisant uniquement les sockets raw (en C sous linux), j'ai besoin de construire les en-têtes IP et TCP en-têtes de moi-même. Je suis en train d'écrire un serveur (donc je dois d'abord répondre à la future paquet SYN), et pour quelque raison que ce soit, je n'arrive pas à obtenir ce droit. Oui, je me rends compte qu'un SOCK_STREAM va gérer cela pour moi, mais pour des raisons que je ne veux pas aller dans ce n'est pas une option.
Les tutoriels que j'ai trouvé en ligne sur l'utilisation des sockets raw, tous décrivent comment construire un SYN imbibeur, mais c'est un peu facile que l'établissement d'une connexion TCP, puisque vous n'avez pas à construire une réponse fondée sur le paquet d'origine. J'ai obtenu la SYN imbibeur exemples de travail, et je peux lire les entrants paquet SYN juste fin de la première prise, mais je suis toujours avoir des problèmes lors de la création d'un valide SYN/ACK en réponse à l'arrivée d'un SYN client.
Donc, que quelqu'un connait un bon tuto sur l'utilisation des sockets raw qui va au-delà de la création d'un SYN imbibeur, ou quelqu'un aurait-il un code qui pourrait le faire (à l'aide de SOCK_RAW, et pas SOCK_STREAM)? Je vous serais très reconnaissant.
MarkR est absolument le droit-le problème est que le noyau est l'envoi de paquets de réinitialisation en réponse à la première paquet parce qu'il pense que le port est fermé. Le noyau est en train de me battre pour la réponse et le lien meurt. J'ai été à l'aide de tcpdump pour surveiller la connexion déjà-je l'ai été plus attentif et remarqué qu'il y avait DEUX réponses dont l'un était un reset qui a bousiller les choses, ainsi que la réponse de mon programme créé. OH PINAISE!
La solution qui semble fonctionner le mieux est d'utiliser une règle iptables, comme suggéré par MarkR, afin de bloquer les paquets sortants. Cependant, il ya un moyen plus facile de le faire que de l'utilisation de la marque de l'option, comme le suggère. Je viens de match, si la réinitialisation TCP drapeau est réglé. Au cours d'une connexion normale, il est peu probable d'être nécessaire, et il n'importe pas vraiment à ma demande si je bloquer tous les paquets de réinitialisation du port utilisé. Ce bloque efficacement le noyau de la réponse indésirable, mais pas mes propres paquets. Si le port de mon programme est à l'écoute sur est de 9999 alors la règle iptables ressemble à ceci:
iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP
OriginalL'auteur azure | 2008-09-21
Vous devez vous connecter pour publier un commentaire.
Vous souhaitez mettre en œuvre le cadre d'une pile TCP dans l'espace utilisateur... c'est ok, certaines autres applications ce faire.
Un problème que vous rencontrerez, c'est que le noyau sera l'envoi d' (généralement négative, inutile) réponses aux paquets entrants. Cela va bousiller toute communication que vous tentez de lancer.
Une façon d'éviter cela est d'utiliser une adresse IP et l'interface que le noyau ne dispose pas de sa propre pile IP à l'aide - ce qui est bien, mais vous aurez besoin pour faire face à la couche de liaison des trucs (plus précisément, arp) de vous-même. Cela nécessiterait une prise inférieure à IPPROTO_IP, SOCK_RAW - vous besoin d'un socket packet (je pense).
Il peut également être possible de bloquer le noyau de réponses à l'aide d'une règle iptables - mais je soupçonne plutôt que les règles s'appliquent à votre propre paquets ainsi d'une certaine façon, à moins que vous pouvez gérer pour obtenir leur traitées différemment (peut-être en appliquant un netfilter "marque" pour vos propres paquets?)
Lire les pages man
socket(7)
ip(7)
paquet(7)
Qui explique les différentes options et les ioctls qui s'appliquent à tous les types de supports.
Bien sûr, vous aurez besoin d'un outil comme Wireshark pour inspecter ce qui se passe. Vous aurez besoin de plusieurs machines pour tester cela, je recommande l'utilisation de vmware (ou similaire) pour réduire la quantité de matériel nécessaire.
Désolé je ne peux pas recommander un tutoriel spécifique.
Bonne chance.
OriginalL'auteur
Je me rends compte que c'est un vieux thread, mais voici un tutoriel qui va au-delà de la normale SYN flooders: http://www.enderunix.org/docs/en/rawipspoof/
Espoir, peut-être de l'aide à quelqu'un.
OriginalL'auteur
Je ne peux pas vous aider sur tout les tutoriels.
Mais je peux vous donner quelques conseils sur les outils que vous pouvez utiliser pour aider au débogage.
Tout d'abord, comme bmdhacks a suggéré, procurez-vous une copie de wireshark (ou tcpdump - mais wireshark est plus facile à utiliser). Capturer une bonne poignée de main. Assurez-vous que vous enregistrez.
La Capture de l'un de vos poignées de main qui échoue. Wireshark est assez bon paquet d'analyse et de contrôle d'erreur, donc si il y a une simple erreur, il va probablement vous dire.
Prochain, procurez-vous une copie de tcpreplay. Il doit également inclure un outil appelé "tcprewrite".
tcprewrite vous permettra de découper vos précédemment sauvegardé les fichiers de capture en deux - un pour chaque côté de la poignée de main.
Vous pouvez ensuite utiliser tcpreplay pour lire un côté de la poignée de main de sorte que vous avez un ensemble cohérent de paquets de jouer avec.
Alors vous utiliser wireshark (encore une fois) pour vérifier vos réponses.
OriginalL'auteur
Je n'ai pas de tutoriel, mais j'ai récemment utilisé Wireshark pour le bon effet pour déboguer des raw sockets de programmation, j'étais en train de faire. Si vous avez une capture les paquets que vous envoyez, wireshark va faire un bon travail de vous montrer si ils sont mal formés ou pas. Il est utile pour comparer à une connexion normale.
OriginalL'auteur
Il existe des structures pour-têtes IP et TCP déclaré dans netinet/ip.h & netinet/tcp.h respectivement. Vous pouvez regarder les autres en-têtes dans ce répertoire pour plus de macros & des choses que l'on peut utiliser.
Vous envoyer un paquet avec le drapeau SYN est positionné et une séquence aléatoire (x). Vous devriez recevoir un SYN+ACK de l'autre côté. Ce paquet aura un numéro d'accusé de réception (y) qui indique le prochain numéro de séquence de l'autre côté s'attend à recevoir ainsi qu'un numéro de séquence (z). Vous envoyer en retour un paquet d'accusé de réception qui a le numéro de séquence x+1 et ack nombre z+1 pour terminer la connexion.
Vous devez également vous assurez-vous de calculer TCP/IP sommes & remplir le reste de l'en-tête du paquet que vous envoyez. Aussi, ne pas oublier les choses comme hôte & ordre des octets de réseau.
TCP est défini dans la RFC 793, disponible ici: http://www.faqs.org/rfcs/rfc793.html
OriginalL'auteur
En fonction de ce que vous essayez de faire, il peut être plus facile d'obtenir des logiciels pour gérer le protocole TCP handshake pour vous.
Open source pile IP est lwIP (http://savannah.nongnu.org/projects/lwip/) qui assure une pile tcp/ip. Il est très possible de le faire en mode utilisateur en utilisant soit le type SOCK_RAW ou ppce.
OriginalL'auteur
si vous êtes en utilisant les sockets raw, si vous envoyez à l'aide de différentes sources d'adresse mac pour le réel, linux va ignorer le paquet de réponse et de ne pas envoyer en premier.
Une copie de MAC peuvent être filtrés par les commutateurs s'ils sont configurés pour la sécurité des ports. Il pourrait y avoir des listes de contrôle d'accès de la couche MAC, mais normalement il n'y a rien qui vous empêche d'usurpation Mac. Vous devez seulement vous assurer que votre carte réseau accepte les réponses à cette usurpation de mac (en ajoutant le mac à la table de accepté de paquets ou en le mettant dans promisc mode). C'est une mauvaise idée de faire cela si vous n'êtes pas autorisé.
OriginalL'auteur