RST вместо ACK на третьем этапе процесса рукопожатия

Я написал запуск кода c/c++ в Ubuntu, который имитирует процесс рукопожатия.

//Create a raw socket
int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
//some address resolution
strcpy(source_ip , "192.168.1.9");
sin.sin_family = AF_INET;
sin.sin_port = htons(1235);
sin.sin_addr.s_addr = inet_addr ("192.168.1.6");



if (setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
{
    perror("Error setting IP_HDRINCL");
    exit(0);
}



 {
    //Send the packet
    if (sendto (s, datagram, iph->tot_len ,  0, (struct sockaddr *) &sin, sizeof (sin)) < 0)
    {
        perror("sendto failed");
    }
    //Data send successfully
    else
    {
        printf ("Packet Send. Length : %d \n" , iph->tot_len);
    }
}

int l;
if( recvfrom(s,buffer,4096,0, (struct sockaddr *) &sin, &l)<0)
{
    perror("sendto failed");
}
//Data send successfully
else
{
    printf ("Packet recv. ");
}
printf ("Enter number to end: ");


int numm=getchar();
close(s);
return 0;

Код начинается с отправки пакета SYN на адрес 192.168.1.6:1235, который работает в Windows.

Пакет SYN правильно достиг адреса 192.168.1.6:1235.

SYN-ACK правильно дошел до Ubuntu (192.168.1.9:1234).

Но в Wireshark показывается RST вместо ACK.

Я запускаю netcat –l –p 1235 на 192.168.1.6.

Я пробовал все следующее:

  • используйте netcat на исходном компьютере (ubuntu), чтобы открыть тот же порт (1234), который я использовал при отправке SYN.
  • брандмауэр в убунту отключен по умолчанию.
  • Я написал небольшой код, позволяющий этой машине быть сервером на том же порту (1234), который я использовал в SYN.
  • Я обновил код, который отправил пакет SYN, чтобы разблокировать сокет, если я не вставлю какой-либо символ.

Но проблему никто не решает.


person meerah    schedule 08.09.2014    source источник


Ответы (1)


Когда вы используете необработанные сокеты, ваша операционная система не знает о существовании соединения, поскольку вы, по сути, реализовали свой собственный стек TCP/IP и обошли операционную систему.

Ваша операционная система видит незапрошенный пакет и отвечает RST, чтобы указать на активный отказ удаленной системе, которая отвечает на ваши пакеты, отправленные с использованием необработанных сокетов.

Чтобы обойти это, используйте IP-адрес, который перенаправляется в подсеть, в которой вы находитесь, но который не назначается на машине с использованием необработанных сокетов, чтобы операционная система не отвечала, а затем передайте с нее. и слушайте ответы в своего рода «неразборчивом режиме». Ваша сетевая карта должна поддерживать наблюдение за пакетами, не предназначенными для нее, и, таким образом, вы можете отслеживать трафик, который соответствующим образом маршрутизируется.

person Michael J. Gray    schedule 08.09.2014
comment
@meerah Если это решило вашу проблему или вы считаете этот ответ удовлетворительным, отметьте его как таковой. - person Michael J. Gray; 11.09.2014