I'm trying to create linux kernel module, that will inspect incoming packets. At the moment, I'm in process of extracting TCP header of packet and reading source and destination port -> However I'm getting incorrect values. I have hook function:
unsigned int hook_func(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
{
struct iphdr *ipp = (struct iphdr *)skb_network_header(skb);
struct tcphdr *hdr;
unsigned long ok_ip = 2396891328; // Using this to filter data from another machine.
if (!skb) {
// Some problem, empty network packet. Stop it now.
return NF_ACCEPT;
}
if ( ipp->saddr != ok_ip) { // Just to track only packets coming form 1 IP
return NF_ACCEPT;
}
if ( ipp->protocol == IPPROTO_TCP ) { // Incomming packet is TCP
hdr = (struct tcphdr *) skb_transport_header(skb);
printk(" TCP ports: source: %d, dest: %d .\n", ntohs(hdr->source), ntohs(hdr->dest));
}
}
Now, when I try to telnet port 21(not listening there I get):
[ 4252.961912] TCP ports: source: 17664, dest: 52 .
[ 4253.453978] TCP ports: source: 17664, dest: 52 .
[ 4253.953204] TCP ports: source: 17664, dest: 48 .
And when I telnet port 22 - SSH deamon listening there:
[ 4299.239940] TCP ports: source: 17664, dest: 52 .
[ 4299.240527] TCP ports: source: 17664, dest: 40 .
[ 4299.552566] TCP ports: source: 17664, dest: 40 .
As visible from output I'm getting very wired results, anyone has idea where problem is coming from? when I compile module I have no errors / warnings. Version of kernel(headers): 3.7.10 . Not using SeLinux or similar.