- 论坛徽章:
- 0
|
各位看帖的前辈好 小弟有一事请教 帖子有点长 请见谅
关于iptables中长参数的解析 有一些混乱 希望达人能帮忙整理分析解答下我的疑惑
目前我知道的是 长参数的解析(例如指定参数 --sport --dport之类)需要进入do_command中的default中解析
就拿iptables -A INPUT -s 1.1.1.1 -p tcp --sport 300为例
进入default:
- if (!target
- || !(target->parse(c - target->option_offset,
- argv, invert,
- &target->tflags,
- &fw, &target->t))) ……
复制代码 此处调用了target结构中的parse指针函数 但是我用source insight查看parse发现有很多
文件中都有定义各自的parse函数 比方说 --sport参数 应该用到的是libipt_dccp.c中的函数
- static int
- parse(int c, char **argv, int invert, unsigned int *flags,
- const struct ipt_entry *entry,
- unsigned int *nfcache,
- struct ipt_entry_match **match)
- {
- struct ipt_dccp_info *einfo
- = (struct ipt_dccp_info *)(*match)->data;
- switch (c) {
- case '1':
- if (*flags & IPT_DCCP_SRC_PORTS)
- exit_error(PARAMETER_PROBLEM,
- "Only one `--source-port' allowed");
- einfo->flags |= IPT_DCCP_SRC_PORTS;
- check_inverse(optarg, &invert, &optind, 0);
- parse_dccp_ports(argv[optind-1], einfo->spts);
- if (invert)
- einfo->invflags |= IPT_DCCP_SRC_PORTS;
- *flags |= IPT_DCCP_SRC_PORTS;
- break;
- ………………
复制代码 此处有
疑惑一 : 在 default 中 调用target->parse()的时候
是如何确定调用的是libipt_dccp.c中的parse 而不是调用libipt_DNAT.c中的parse的?
疑惑二 : 在进入相应的parse函数中以后 传入的第四个参数flag 是什么时候被赋值的?(眼拙没看出来do_command中哪里设置了target->tflags的值) 当然 也不知道第一个参数传入的参数(c-target->option_offset)中target->option_offset是在哪里赋值的?
疑惑三 : 我想知道 如果想自己填充iptables中的数据结构 最终能正确添加该条规则 那么针对长参数 我都该填充哪些数据结构? |
|