Aperto de mão TCP com soquete SOCK_RAW

Ok, eu percebo que esta situação é um pouco incomum, mas eu preciso estabelecer uma conexão TCP (handshake 3-way) usando apenas sockets raw (em C, no linux) - ou seja, eu preciso construir os cabeçalhos IP e cabeçalhos TCP . Eu estou escrevendo um servidor (então eu tenho que responder primeiro ao pacote SYN de entrada), e por alguma razão eu não consigo acertar. Sim, eu percebo que um SOCK_STREAM vai lidar com isso para mim, mas por razões que eu não quero entrar não é uma opção.

Os tutoriais que encontrei on-line sobre o uso de sockets raw descrevem como construir um flooder SYN, mas isso é um pouco mais fácil do que realmente estabelecer uma conexão TCP, já que você não precisa construir uma resposta baseada no pacote original. Eu tenho o SYN flooder exemplos de trabalho, e eu posso ler o pacote SYN de entrada muito bem a partir do soquete bruto, mas eu ainda estou tendo problemas para criar uma resposta SYN / ACK válida para um SYN de entrada do cliente.

Então, alguém sabe um bom tutorial sobre o uso de soquetes brutos que vai além da criação de um flooder SYN, ou alguém tem algum código que poderia fazer isso (usando SOCK_RAW, e não SOCK_STREAM)? Eu ficaria muito agradecido.

O MarkR está absolutamente certo - o problema é que o kernel está enviando pacotes de reset em resposta ao pacote inicial porque acha que a porta está fechada. O kernel está me batendo para a resposta e a conexão morre. Eu estava usando o tcpdump para monitorar a conexão já - eu deveria ter sido mais atento e notei que havia duas respostas, uma das quais era uma redefinição que estava estragando as coisas, bem como a resposta do meu programa criado. D'OH!

A solução que parece funcionar melhor é usar uma regra iptables, como sugerido pelo MarkR, para bloquear os pacotes de saída. No entanto, há uma maneira mais fácil de fazer isso do que usar a opção mark, conforme sugerido. Acabei de combinar se o sinalizador de redefinir TCP está definido. Durante o curso de uma conexão normal, é improvável que isso seja necessário, e realmente não importa para meu aplicativo se eu bloquear todos os pacotes de redefinição de saída da porta que está sendo usada. Isso efetivamente bloqueia a resposta indesejada do kernel, mas não meus próprios pacotes. Se a porta em que meu programa está escutando for 9999, a regra do iptables será semelhante a esta:

iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP

questionAnswers(7)

yourAnswerToTheQuestion