Linux协议栈-netfilter(3)-NAT

本文详细分析了Linux协议栈中netfilter的NAT模块,包括NAT模块的初始化过程,如全局变量初始化和hook函数注册,以及NAT处理数据包的流程,特别是PRE_ROUTING和POST_ROUTING链上的DNAT和SNAT操作。通过对iptables规则的匹配和conntrack连接的更新,解释了如何实现NAT转换,并特别讨论了UDP分片包和ICMP报文的NAT处理情况。
摘要由CSDN通过智能技术生成

本文对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,定义如下:

static struct xt_table nat_table = {
	.name		= "nat",
	.valid_hooks	= NAT_VALID_HOOKS,
	.me		= THIS_MODULE,
	.af		= AF_INET,
};

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

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

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

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

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

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

static struct
{
	struct ipt_replace repl;
	struct ipt_standard entries[3];
	struct ipt_error term;
} nat_initial_table __net_initdata = {
	.repl = {
		.name = "nat",
		.valid_hooks = NAT_VALID_HOOKS,
		.num_entries = 4,
		.size = sizeof(struct ipt_standard) * 3 + sizeof(struct ipt_error),
		.hook_entry = {
			[NF_INET_PRE_ROUTING] = 0,
			[NF_INET_POST_ROUTING] = sizeof(struct ipt_standard),
			[NF_INET_LOCAL_OUT] = sizeof(struct ipt_standard) * 2
		},
		.underflow = {
			[NF_INET_PRE_ROUTING] = 0,
			[NF_INET_POST_ROUTING] = sizeof(struct ipt_standard),
			[NF_INET_LOCAL_OUT] = sizeof(struct ipt_standard
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值