Chinaunix首页 | 论坛 | 博客
  • 博客访问: 818396
  • 博文数量: 756
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:40
文章分类

全部博文(756)

文章存档

2011年(1)

2008年(755)

我的朋友

分类:

2008-10-13 14:40:38

我将iptables-save的代码摘出来,独立编译,使用以下编译语句
#!/bin/bash                                                               
gcc -Wall -Wunused -DNETFILTER_VERSION=\"1.2.6\" -rdynamic -o $1 $1.c \   
/usr/local/lib/iptables.o /usr/local/lib/libiptc.a -ldl                    

通过print_rule()函数(附)来打印iptables规则,
        /* Print matchinfo part */
        if (e->target_offset) {
                IPT_MATCH_ITERATE(e, print_match, &e->ip);
        }

发现match部分打印不出(前面部分正常)
错误显示:Can't find library for match mac
(注:建立iptables -A FORWARD -m mac --mac-source 00:00:00:00:00:01)


请问是,是不是编译里少了关于match 的.o文件啊?如libiptc_mac.o????
target应该也是这个问题,由于在match就exit(1),还没查到target。

请高少指教,明天在战,谢谢!!!!!!


/* We want this to be readable, so only print out neccessary fields.
* Because that's the kind of world I want to live in.  */
static void print_rule(const struct ipt_entry *e,
                iptc_handle_t *h, const char *chain, int counters)
{
        struct ipt_entry_target *t;
        const char *target_name;

        /* print counters */
        if (counters)
                printf("[%llu:%llu] ", (unsigned long long)e->counters.pcnt, (unsigned long long)e->counters.bcnt);

        /* print chain name */
        printf("-A %s ", chain);

        /* Print IP part. */
        print_ip("-s", e->ip.src.s_addr,e->ip.smsk.s_addr,
                        e->ip.invflags & IPT_INV_SRCIP);       

        print_ip("-d", e->ip.dst.s_addr, e->ip.dmsk.s_addr,
                        e->ip.invflags & IPT_INV_DSTIP);

        print_iface('i', e->ip.iniface, e->ip.iniface_mask,
                    e->ip.invflags & IPT_INV_VIA_IN);

        print_iface('o', e->ip.outiface, e->ip.outiface_mask,
                    e->ip.invflags & IPT_INV_VIA_OUT);

        print_proto(e->ip.proto, e->ip.invflags & IPT_INV_PROTO);

        if (e->ip.flags & IPT_F_FRAG)
                printf("%s-f ",
                       e->ip.invflags & IPT_INV_FRAG ? "! " : "");

        /* Print matchinfo part */
        if (e->target_offset) {
                IPT_MATCH_ITERATE(e, print_match, &e->ip);
        }

        /* Print target name */       
        target_name = iptc_get_target(e, h);
        if (target_name && (*target_name != '\0'))
                printf("-j %s ", target_name);

        /* Print targinfo part */
        t = ipt_get_target((struct ipt_entry *)e);
        if (t->u.user.name[0]) {
                struct iptables_target *target
                        = find_target(t->u.user.name, TRY_LOAD);

                if (!target) {
                        fprintf(stderr, "Can't find library for target `%s'\n",
                                t->u.user.name);
                        exit(1);
                }

                if (target->save)
                        target->save(&e->ip, t);
                else {
                        /* If the target size is greater than ipt_entry_target
                         * there is something to be saved, we just don't know
                         * how to print it */
                        if (t->u.target_size !=
                            sizeof(struct ipt_entry_target)) {
                                fprintf(stderr, "Target `%s' is missing "
                                                "save function\n",
                                        t->u.user.name);
                                exit(1);
                        }
                }
        }
        printf("\n");
}      
--------------------next---------------------

阅读(369) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~