当前位置:   article > 正文

Linux协议栈-netfilter(3)-NAT_nat操作在协议栈中的哪个位置上?

nat操作在协议栈中的哪个位置上?

本文对netfilter中NAT部分的源码进行分析,读者需要先对NAT的基本概念有一个大致了解。

1. NAT模块的初始化

NAT模块的初始化过程主要是初始化一些全局变量以及注册NAT相关的hook函数。在下面nf_nat_init()函数和nf_nat_standalone_init()函数的流程图中用红色标记了要初始化的全局数据结构。

nf_nat_init()函数:


nf_nat_standalone_init()函数:


NAT表是一个xt_table,定义如下:

  1. static struct xt_table nat_table = {
  2. .name = "nat",
  3. .valid_hooks = NAT_VALID_HOOKS,
  4. .me = THIS_MODULE,
  5. .af = AF_INET,
  6. };

iptables的表如filter, nat,mangle表都是通过ipt_register_table()注册的,在netfilter中被使用。我们需要知道iptables的表中的每条规则都包括三部分:

entry:规则的入口,同时做一些匹配数据包的工作。

match:匹配数据包的条件大多放在这里。

target:对于符合条件的数据包要执行的动作放在这里。

NAT表中的每条规则就包括上面三个部分。

注册NAT表时传入的第三个参数nat_initial_table定义如下:

  1. static struct
  2. {
  3. struct ipt_replace repl;
  4. struct ipt_standard entries[3];
  5. struct ipt_error term;
  6. } nat_initial_table __net_initdata = {
  7. .repl = {
  8. .name = "nat",
  9. .valid_hooks = NAT_VALID_HOOKS,
  10. .num_entries = 4,
  11. .size = sizeof(struct ipt_standard) * 3 + sizeof(struct ipt_error),
  12. .hook_entry = {
  13. [NF_INET_PRE_ROUTING] = 0,
  14. [NF_INET_POST_ROUTING] = sizeof(struct ipt_standard),
  15. [NF_INET_LOCAL_OUT] = sizeof(struct ipt_standard) * 2
  16. },
  17. .underflow = {
  18. [NF_INET_PRE_ROUTING] = 0,
  19. [NF_INET_POST_ROUTING] = sizeof(struct ipt_standard),
  20. [NF_INET_LOCAL_OUT] = sizeof(struct ipt_standard
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/720291
推荐阅读
相关标签
  

闽ICP备14008679号