Мы пытаемся реализовать модуль 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? или это что-то еще, что может пойти не так?
Нужна помощь. Спасибо.
tcph = (struct tcphdr*) (((char*) iph) + iph->ihl * 4)
- person Fred   schedule 13.03.2013