При попытке изменить заголовок http с помощью nf_hook. Невозможно отправить подтверждение на ответ вместо отправки пакетов повторной передачи tcp

Цель: - Написание модуля ядра, когда он вставлен, выполняет следующие действия.

1. Если пользователь хочет открыть веб-сайт с именем «abcde.in» в любом браузере, он должен получить веб-страницу «google.co.in» вместо веб-страницы «abcde.in».

Обычно при доступе к google.in я получаю: -

Наблюдение..(в заголовке http)

302 Перемещено

Документ перемещен

HREF=http://www.google.co.in

:-) затем я отправляю подтверждение и получаю домашнюю страницу Google:-

С модификацией: -

Шаги, которые я предпринял

а. отредактировал /etc/hosts

(google.in IP )     abcde.in

Так что он получает IP-адрес "google.in" для "abcde.in"

b.Далее вставьте следующий фрагмент модуля в реализацию nf_hook POST_ROUTING.

Наблюдение.. я могу правильно изменить, и wireshark показывает, что в ответ я могу получить 302 Moved, но я отправляю повторные передачи Tcp GET / HTTP/1.1. опять и опять.

Я чувствую, что мне не хватает подтверждения, которое мне нужно отправить, как в исходном случае. почему я не могу отправить подтверждение вместо этого, почему я повторно передаю tcp-пакеты на «GET / HTTP/1.1»

if(skb){ 

    liph=(struct iphdr *)skb_network_header(skb);

    if(liph->protocol == 6) {  

    ltcph = (struct tcphdr *)skb_transport_header(skb);
    data=skb->data+(liph->ihl*4) + (ltcph->doff*4);
            datalen=skb->len - ((liph->ihl*4)+(ltcph->doff*4));            
    replace_n=strstr(data,"abcde.in");

            if(replace_n) {

                temp = kmalloc(512 * sizeof(char), GFP_KERNEL);
                memcpy(temp, data, datalen);
                replace_n=strstr(temp,"abcde.in");
                replace_size=strlen("google.in");
                site_diff=replace_size - strlen("abcde.in");
                memmove(replace_n+strlen("abcde.in")+site_diff,replace_n+strlen("abcde.in"),strlen(replace_n)-strlen("abcde.in"));
                memcpy(replace_n,"google.in",strlen("google.in")); 
                skb_put(skb,site_diff);
                memcpy(data,temp,datalen+site_diff);

      liph->tot_len=htons(datalen+site_diff+20+(ltcph->doff*4)); /*modifing necessary fields*/
      liph->check=0;
          liph->check=ip_fast_csum((unsigned char *)liph,liph->ihl);

      int ipl=liph->ihl * 4;
      int ihl=ntohs(liph->tot_len);

         ltcph->check = 0;
     skb->csum = csum_partial(ltcph, ihl - ipl, 0);
     ltcph->check = tcp_v4_check(ihl - ipl,liph->saddr, liph->daddr, skb->csum);
         skb->ip_summed = CHECKSUM_NONE;

Повторная передача пакета tck wireshark


person sourav punoriyar    schedule 12.02.2016    source источник
comment
Это дубликат этого вопроса. Применяется тот же ответ.   -  person Joel C    schedule 14.02.2016
comment
Но я не получаю пакет RST ???   -  person sourav punoriyar    schedule 14.02.2016