входящий хук netfilter: указатель struct tcphdr -> dest не указывает на правильное местоположение?

Мы пытаемся реализовать модуль NAT для ядра Linux. Проблема заключается в том, что для TCP-пакетов на входящем хуке указатель, который должен указывать на порт назначения, этого не делает. Фрагмент исходящего хука:

unsigned int incoming_hook(unsigned int hooknum,
        struct sk_buff *skb,
        const struct net_device *in,
        const struct net_device *out,
        int (*okfn)(struct sk_buff*))
{
struct iphdr *iph;
struct tcphdr *tcph;
unsigned int dst_addr;
unsigned short dst_port;
unsigned short *dpptr;

printk(KERN_ALERT "****Incoming hook starts****\n");

if (!skb)return NF_ACCEPT;

iph = ip_hdr(skb);
if (!iph)return NF_ACCEPT;

dst_addr = ntohl(iph->daddr);     // works correct

printk(KERN_ALERT " dst addr is %d \n", dst_addr);  


if (iph->protocol==IPPROTO_TCP)
{ 
    tcph = tcp_hdr(skb);
    if (!tcph)return NF_ACCEPT;

    dst_port = ntohs(tcph->dest);   // gives incorrect result (unexpected.)
    // dpptr = (unsigned short *)((char *)iph + 22); // just a try. does not work either

    printk(KERN_ALERT " dst port is  %d  \n", *dpptr);
    dst_port = ntohs(*dpptr);

// continues with the NAT code

Однако то же самое работает для пакетов на исходящем хуке, который изменяет исходный адрес и исходный порт. Следующие работы для исходящих пакетов

tcph = tcp_hdr(skb);
  if (!tcph)return NF_ACCEPT;

  src_port = ntohs(tcph->source);

Есть ли проблема с размером IP-заголовка входящих пакетов, ошибка в структуре tcphdr или неверный указатель tcphdr->dest? или это что-то еще, что может пойти не так?

Нужна помощь. Спасибо.


person user816877    schedule 25.11.2012    source источник
comment
Я не уверен, но может случиться так, что транспортный заголовок еще не установлен. Вы можете попробовать сделать это вручную: tcph = (struct tcphdr*) (((char*) iph) + iph->ihl * 4)   -  person Fred    schedule 13.03.2013
comment
Вот объяснение: buffer-whil" title="почему буфер skb должен быть пропущен на 20 байт для чтения транспортного буфера, пока">stackoverflow.com/questions/23693335/   -  person Reuven Plevinsky    schedule 07.05.2017
comment
Вот объяснение: buffer-whil" title="почему буфер skb должен быть пропущен на 20 байт для чтения транспортного буфера, пока">stackoverflow.com/questions/23693335/   -  person Reuven Plevinsky    schedule 07.05.2017


Ответы (1)


У меня была та же проблема, решенная благодаря некоторым одноклассникам и учителю класса.

Для пакетов, поступающих через ловушку incoming netfilter, следует использовать +20 (вместо этого у вас сейчас +22).

Пример кода:

skb_linearize(skb);
struct tcphdr* tcp_header;
tcp_header = (struct tcphdr *)(skb_transport_header(skb)+20);
person Yoav Feuerstein    schedule 19.04.2017