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