免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

【iptables交流贴】iptables执行的流程分析 [复制链接]

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
171 [报告]
发表于 2015-01-12 11:20 |只看该作者
回复 170# qw10371006
#define TC_APPEND_ENTRY                iptc_append_entry  然后找到这句,也就是你文章中提到的函数,但是实现在哪呢


   

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
172 [报告]
发表于 2015-01-12 11:22 |只看该作者
回复 171# qw10371006
找到了  我操  我二逼了


   

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
173 [报告]
发表于 2015-01-12 15:04 |只看该作者
不好意思版主大神,最后你提及的insert_rules函数还是没找到。。。。。实在拙计了,还有如果我想自己跳过命令行去直接写入规则,应该从哪里开始呢,希望抽空指点下,非常感谢!!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
174 [报告]
发表于 2015-01-13 07:35 |只看该作者
回复 173# qw10371006

我当时分析的代码版本,相对于现在已经比较老了。你用的是什么版本?


   

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
175 [报告]
发表于 2015-01-13 09:25 |只看该作者
回复 174# Godbach
我用的是3.13版本


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
176 [报告]
发表于 2015-01-13 10:00 |只看该作者
回复 175# qw10371006

那变化挺大了。

iptables 的源码,不太好找函数定义的一个原因,就是它喜欢用各种宏做替代,好像还有拼接之类的。慢慢感受吧。。。


   

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
177 [报告]
发表于 2015-01-13 13:47 |只看该作者
回复 176# Godbach
是的 ,多谢版主回复。  其实现在的源码大致的结构跟您本帖讲解的那个版本是差不多的,你总体分了三个步骤来分析。我现在遇到的问题是需要跳过命令行直接自己写入规则,是不是可以直接跳过第二步do_command?  还有就是第三步向内核提交需要参数handle,这个我如何来自己DIY呢?因为在第二步do_commad里面处理过程中有许多设置handle的各项什么的,我有还必要一点一点去设置吗?

   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
178 [报告]
发表于 2015-01-13 15:00 |只看该作者
回复 177# qw10371006

DIY 没问题啊。只要你了解了 iptables 最终将配置下发到 kernel 的操作了解了,以及用户态应该用什么样的数据结构搞清楚了,就可以自己直接写程序执行了。



   

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
179 [报告]
发表于 2015-01-13 15:37 |只看该作者
回复 178# Godbach

ok,多谢。开始搞起
   

论坛徽章:
7
巨蟹座
日期:2015-07-09 16:10:34未羊
日期:2015-07-09 16:11:49数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-05 06:20:00数据库技术版块每日发帖之星
日期:2016-03-28 06:20:00IT运维版块每日发帖之星
日期:2016-04-11 06:20:00IT运维版块每日发帖之星
日期:2016-05-22 06:20:00
180 [报告]
发表于 2015-01-15 17:35 |只看该作者
回复 178# Godbach

依葫芦画瓢跟iptables学使用TC_INIT函数去读内核内iptables信息,但只读出了表的大致信息(即SO_GET_INFO标志位返回的信息),后面继续读表的规则内容(即SO_GET_ENTRIES标志位返回)时报getsockopt的参数错误,一直找不到什么原因,郁闷!!!!
   

struct xtc_handle *
TC_INIT(const char *tablename)
{
        struct xtc_handle *h;
        STRUCT_GETINFO info;
        unsigned int tmp;
        socklen_t s;
        int sockfd;
retry:
        iptc_fn = TC_INIT;

        if (strlen(tablename) >= TABLE_MAXNAMELEN) {
                errno = EINVAL;
                return NULL;
        }

        sockfd = socket(TC_AF, SOCK_RAW, IPPROTO_RAW);
        if (sockfd < 0)
                return NULL;

        if (fcntl(sockfd, F_SETFD, FD_CLOEXEC) == -1) {
                fprintf(stderr, "Could not set close on exec: %s\n",
                        strerror(errno));
                abort();
        }

        s = sizeof(info);

        strcpy(info.name, tablename);
        if (getsockopt(sockfd, TC_IPPROTO, SO_GET_INFO, &info, &s) < 0) {    /*此处成功取到表的信息*/
                close(sockfd);
                return NULL;
        }

        DEBUGP("valid_hooks=0x%08x, num_entries=%u, size=%u\n",
                info.valid_hooks, info.num_entries, info.size);

        if ((h = alloc_handle(info.name, info.size, info.num_entries))
            == NULL) {
                close(sockfd);
                return NULL;
        }

        /* Initialize current state */
        h->sockfd = sockfd;
        h->info = info;

        h->entries->size = h->info.size;

        tmp = sizeof(STRUCT_GET_ENTRIES) + h->info.size;
        if (getsockopt(h->sockfd, TC_IPPROTO, SO_GET_ENTRIES, h->entries,               /*此处取规则信息报参数错误*/
                       &tmp) < 0)
                goto error;

#ifdef IPTC_DEBUG2
        {
                int fd = open("/tmp/libiptc-so_get_entries.blob",
                                O_CREAT|O_WRONLY);
                if (fd >= 0) {
                        write(fd, h->entries, tmp);
                        close(fd);
                }
        }
#endif

        if (parse_table(h) < 0)
                goto error;

        CHECK(h);
        return h;
error:
        TC_FREE(h);
        /* A different process changed the ruleset size, retry */
        if (errno == EAGAIN)
                goto retry;
        return NULL;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP