Netfilter学习之NAT类型动态配置(二)NAT类型介绍及MASQUERADE

Netfilter学习之NAT类型动态配置(二)NAT类型介绍及MASQUERADE

  在上一节中,我们介绍了iptables和netfilter的基本关系,在这里我们会进一步介绍现有的NAT以及Linux中大多已实现的MASQUERADE实现原理。

1. NAT类型介绍

  常用的NAT类型主要有Full Cone NAT(全锥型), Restricted NAT(限制型锥型), Port Restricted NAT(端口限制型锥型), Symmetric NAT(对称型)四种。

  四种类型的主要区别在于对外界访问内部IP的控制力度。为方便解释,我们使用如下的用语来说明四种NAT类型的不同之处。

用语定义

  1. 内部Tuple:指内部主机的私有地址和端口号所构成的二元组,即内部主机所发送报文的源地址、端口所构成的二元组
  2. 外部Tuple:指内部Tuple经过NAT的源地址/端口转换之后,所获得的外部地址、端口所构成的二元组,即外部主机收到经NAT转换之后的报文时,它所看到的该报文的源地址(通常是NAT设备的地址)和源端口
  3. 目标Tuple:指外部主机的地址、端口所构成的二元组,即内部主机所发送报文的目标地址、端口所构成的二元组

详细释义

  1. Full Cone NAT:所有来自同一 个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外,当X-Y的转换关系建立之后,任意外部主机均可随时将Y中的地址和端口作为目标地址 和目标端口,向内部主机发送UDP报文,由于对外部请求的来源无任何限制,因此这种方式虽然足够简单,但却不那么安全

  2. Restricted Cone NAT: 它是Full Cone的受限版本:所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,这与Full Cone相同,但不同的是,只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z)后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部 主机发送UDP请求报文,这意味着,NAT设备只向内转发(目标地址/端口转换)那些来自于当前已知的外部主机的UDP报文,从而保障了外部请求来源的安 全性

  3. Port Restricted Cone NAT:它是Restricted Cone NAT的进一步受限版。只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z且端口为P)之后,外部主机才能以Y中的信息作为目标地址和目标端 口,向内部主机发送UDP报文,同时,其请求报文的源端口必须为P,这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性

  4. Symmetric NAT:这是一种比所有Cone NAT都要更为灵活的转换方式:在Cone NAT中,内部主机的内部Tuple与外部Tuple的转换映射关系是独立于内部主机所发出的UDP报文中的目标地址及端口的,即与目标Tuple无关; 在Symmetric NAT中,目标Tuple则成为了NAT设备建立转换关系的一个重要考量:只有来自于同一个内部Tuple 、且针对同一目标Tuple的请求才被NAT转换至同一个外部Tuple,否则的话,NAT将为之分配一个新的外部Tuple;打个比方,当内部主机以相 同的内部Tuple对2个不同的目标Tuple发送UDP报文时,此时NAT将会为内部主机分配两个不同的外部Tuple,并且建立起两个不同的内、外部 Tuple转换关系。与此同时,只有接收到了内部主机所发送的数据包的外部主机才能向内部主机返回UDP报文,这里对外部返回报文来源的限制是与Port Restricted Cone一致的。不难看出,如果说Full Cone是要求最宽松NAT UDP转换方式,那么,Symmetric NAT则是要求最严格的NAT方式,其不仅体现在转换关系的建立上,而且还体现在对外部报文来源的限制方面。

  在Netfilter中,不同NAT的实现在内核中进行。而通常情况下,Linux系统自带的NAT类型多为端口限制型锥型NAT或者对称型。对此,我们参照着内核和用户层的源码进行说明。这里之所以说为端口限制型锥型NAT或对称型NAT是因为系统自带的MASQUERADE部分模块根据配置命令行的不同可以实现上述两种不同类型的NAT。由上一篇,大家应该都知道了iptables和Netfilter的关系,这里我们先看看在用户层,Iptables命令中关于MASQUERADE的实现。

  源码名libipt_MASQUERADE.c,位置的话不同版本的linux系统可能不大一样。该部分主要是实现对配置masquerade命令的解析以及注册,注册之后即可激活内核空间中的masquerade相应钩子函数实现masquerade功能。关于钩子函数,在下一讲中将会简单介绍。

  首先看一下该源码的大体框架。
<div align=center>


这里写图片描述

  由图可见,该部分主要由help, opts, init, parse_ports, parse, final_check, print, save, masq, _init组成。按
各个函数、结构的名称大致可以猜测到该函数做的是什么功能,之后实现其他几种NAT均需要模仿该模块完成。

  首先需要介绍的是masq。源码如下

static struct iptables_target masq = {
     NULL,
    .name= "MASQUERADE",
    .version= IPTABLES_VERSION,
    .size= IPT_ALIGN(sizeof(struct ip_nat_multi_range)),
    .userspacesize= IPT_ALIGN(sizeof(struct ip_nat_multi_range)),
    .help= &help,
    .init= &init,
    .parse= &parse,
    .final_check= &final_check,
    .print= &print,
    .save= &save,
    .extra_opts= opts
 
};

  该部分是整个MASQUERADE的注册,给定了该结构体的各个元素(名称、版本、函数实现等)。所有其他的iptables命令行参数均以此形式添加。

  help部分即命令行常用的帮助部分,在MASQUERADE中,实现如下。

/* Function which prints out usage message. */
static void
help(void)
{
 
    printf(
    "MASQUERADE v%s options:\n"
    " --to-ports <port>[-<port>]\n"
    "Port (range) to map to.\n"
    " --random\n"
    "Randomize source port.\n"
    "\n"
    ,
    IPTABLES_VERSION);
 
}

  这里我们可以很清晰的了解iptables中MASQUERADE如何配置。之前所说的MASQUERADE可以配置两种不同类型的NAT也来源于此,提供的--random功能即为对称型NAT,其他两种形式命令行则为端口限制型锥形NAT的配置。

  另外还需要说明的是这里parse是解析命令行,使用的也是大名鼎鼎的opt, getlongopt系列函数,需要了解的可以自行百度谷歌搜索。parse_ports部分主要是实现将输入的" --to-ports <port>[-<port>]"加以识别。其余都是很容易弄懂的一些函数,在此不做过多的介绍,有问题的可以联系我。本篇结束。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 姓名:刘登贤 学号:14310116024 转载自: http://www.right.com.cn/f...
    不是很厉害_d8c2阅读 41,703评论 2 7
  • Teredo 原理概述 http://www.ipv6bbs.cn/thread-144-1-1.html (出处...
    我是叶问小盆友阅读 1,967评论 0 1
  • 一、什么是NAT?为什么要使用NAT? NAT是将私有地址转换为合法IP地址的技术,通俗的讲就是将内网与内网通信时...
    莫太极阅读 1,640评论 0 9
  • NAT是什么 网络地址转换,就是替换IP报文头部的地址信息.由于IPv4地址有限,不可能为每一个上网设备分配一个i...
    miku酱啦阅读 10,311评论 0 5
  • �没有好好说再见� 人的缘分真的是很奇妙的一件东西。相隔了十万八千里也有可能会相遇,同在一个方寸之地也会终生不再相...
    麦芽余鱼阅读 615评论 4 5