服务器 频道

深入Linux网络核心堆栈之四

  【IT168 服务器学院】----[ 4.4 - 基于TCP端口进行过滤

  另一个要实现的简单规则是基于数据包的TCP目的端口进行过滤。这只比检查IP地址的要求要高一点点,因为我们需要自己创建一个TCP头的指针。还记得我们前面讨论的关于传输层包头与网络层包头的内容吗?获取一个TCP头的指针是一件简单的事情——分配一个tcphdr数据结构(在linux/tcp.h中定义)的指针,并将它指向我们的数据包中IP头之后的数据。或许一个例子的帮助会更大一些,示例代码5给出了检查数据包的TCP目的端口是否与某个我们要丢弃数据包的端口匹配的代码。与示例代码3一样,这些代码摘自LWFW。

  示例代码5 : 检查收到的数据包的TCP目的端口
        unsigned char *deny_port = "\x00\x19";   /* port 25 */

    ...

        static int check_tcp_packet(struct sk_buff *skb)
        {
            struct tcphdr *thead;

            /* We don''t want any NULL pointers in the chain
             * to the IP header. */
            if (!skb ) return NF_ACCEPT;
            if (!(skb->nh.iph)) return NF_ACCEPT;

            /* Be sure this is a TCP packet first */
            if (skb->nh.iph->protocol != IPPROTO_TCP) {
                return NF_ACCEPT;
            }

            thead = (struct tcphdr *)(skb->data +
                                     (skb->nh.iph->ihl * 4));

            /* Now check the destination port */
            if ((thead->dest) == *(unsigned short *)deny_port) {
                return NF_DROP;
            }
        
        return NF_ACCEPT;
        }

  确实很简单!不要忘了,要让这个函数工作,deny_port必须是网络字节序。这就是数据包过滤的基础了,你应当已经清楚的理解了对于一个特定的数据包,如何获取你想要的信息。现在,是该进入更有趣的内容的时候了!
  

0
相关文章