Netfilter 地址转换的实现(1)

2020-05-26 00:00:00 初始化 地址 目的 数据包 转换

网络地址转换的实现初步分析


网络地址转换(NAT),从本质上来讲,是通过修改IP数据首部中的地址,以实现将一个地址转换成另一个地址的技术。当然,在某些情况下,修改的不仅仅是IP首部的来源或目的地址,还包括其它要素。
随着接入Internet的计算机数量的不断猛增,IP地址资源也就愈加显得捉襟见肘。目前NAT技术更多地被使用在将一个私网IP地址网段,转换为一个或几个公网IP地址,以实现私网与Internet的互相通讯。
Netfilter在连接跟踪的基础上,实现了两种类型的地址转换:源地址转换和目的地址转换。顾名思义,源地址转换就是修改IP包中的源地址(或许还有源端口),而目的地址转换,就是修改IP包中的目的地址(同样,或许还有目的端口)。前者通常用于将内网主机私网地址转换为公网地址,访问Internet,后者通常用于将公网IP地址转换为一个或几个私网地址,实现向互联网提供服务。

模块初始化

NAT模块对应的源文件是ip_nat_standard.c,同样地,init_or_cleanup是它的初始化函数:


  1. static int init_or_cleanup(int init)
  2. {
  3.         int ret = 0;

  4.         need_ip_conntrack();

  5.         if (!init) goto cleanup;

  6.         /*初始化nat规则*/
  7.         ret = ip_nat_rule_init();
  8.         if (ret < 0) {
  9.                 printk("ip_nat_init: can't setup rules.\n");
  10.                 goto cleanup_nothing;
  11.         }
  12. /*初始化nat所需要重要数据结构*/
  13.         ret = ip_nat_init();
  14.         if (ret < 0) {
  15.                 printk("ip_nat_init: can't setup rules.\n");
  16.                 goto cleanup_rule_init;
  17.         }
  18. /*注册Hook*/
  19.         ret = nf_register_hook(&ip_nat_in_ops);
  20.         ……
  21.         /*卸载各个注册的模块,释放初始化时申请的资源*/
  22. cleanup:
  23.         ……
  24. return ret;
  25. }

相关文章