2015-05-09 1 views
1

Я использовал netfiler_queue для создания модуля NFQUEUE для iptables, который обрабатывает все исходящие пакеты UDP.Reinjecting измененных пакетов в модуле netfilter

Я хочу изменить все пакеты UDP, которые соответствуют определенному шаблону, и повторно ввести их в сеть.

Вот несколько примеров кода:

... 

static int Callback(nfq_q_handle *myQueue, struct nfgenmsg *msg, nfq_data *pkt, void *cbData) { 
    uint32_t id = 0; 
    nfqnl_msg_packet_hdr *header; 

    if ((header = nfq_get_msg_packet_hdr(pkt))) { 
    id = ntohl(header->packet_id); 
    } 

    // Get the packet payload 
    unsigned char *pktData; 
    int len = nfq_get_payload(pkt, &pktData); 

    // The following is an example. 
    // In reality, it involves more parsing of the packet payload. 
    if (len && pktData[40] == 'X') { 
    // Modify byte 40 
    pktData[40] = 'Y'; 
    } 

    // Pass through the (modified) packet. 
    return nfq_set_verdict(myQueue, id, NF_ACCEPT, 0, NULL); 
} 

... 

int main(){ 

    ... 

    struct nfq_handle nfqHandle; 
    nfq_create_queue(nfqHandle, 0, &Callback, NULL) 

    ... 

    return 0; 
} 

Модифицированный пакет не получает закачивается в поток. Как бы я ввел модифицированную версию пакета?

+0

Пример кода - это просто пример, рассматривающий его как psuedo-code. – Excl

ответ

3

Две вещи. Во-первых:

return nfq_set_verdict(myQueue, id, NF_ACCEPT, 0, NULL); 

должно быть:

return nfq_set_verdict(myQueue, id, NF_ACCEPT, len, pktData); 

Это говорит ему, вы хотите отправить модифицированный пакет. (вам может понадобиться литье некоторых типов)

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

UDP-контрольная сумма будет жить в байтах 0x1A и 0x1B вашего пакета, так что это будет обнулить их:

pktData[0x1a] = 0; 
pktData[0x1b] = 0; 

и тогда ваш пакет будет проходить.

+0

Как бы я мог пересчитать контрольную сумму в этой ситуации? – Excl

+0

Более конкретно, как я могу использовать общую функцию вычисления контрольной суммы и вставить ее в эти два байта? – Excl

+1

Вы не можете использовать общий, вы должны использовать функцию контрольной суммы UDP. Это описано в RFC768, http://tools.ietf.org/html/rfc768 и в Википедии, http://en.wikipedia.org/wiki/User_Datagram_Protocol#Checksum_comput –

Смежные вопросы