这个技术,是一个非常成熟的技术了,但是,为了将其弄得清楚点,体系点,也为了备忘,还是有必要在这里梳理一下!

NAT:Network Address Translation. 这个主要是用在网络地址(IP)需要改变的地方。典型的应用场景就是内网IP和公网IP之间的通信。

NAT的工作原理,其实还是很简单的:将IP 数据包头中的IP 地址转换为另一个IP 地址的过程。在实际应用中,NAT 主要用于实现私有网络访问公共网络的功能。这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。实际使用过程中,又分为静态,动态,以及端口复用等三种形式。

静态:也就是内网IP地址和某个公网IP地址之间是一个固定的绑定关系,不管有没有数据交互,他们之间都是固定存在映射关系的。这种静态绑定的好处就是可以实现外部网络对内网某些特定服务器或设备的访问。不足在于,这个公网IP可能就存在资源浪费。

动态:是指将内部网络的私有 IP 地址转换为公用 IP 地址时, IP 地址是不确定的,是随机的,所有被授权访问上 Internet 的私有 IP 地址可随机转换为任何指定的合法 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当 ISP提供的合法 IP 地址略少于网络内部的计算机数量时。可以采用动态转换的方式。

端口复用(PAT):是指改变外出数据包的 源端口并进行端口转换,即端口地址转换 ( PAT , Port AddressTranslation). 采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet 的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机 ,有效避免来自 internet 的攻击。这种使用方式是目前相对使用较多的方式。

静态,有时候相当于动态的一个子集。比如内部多个IP转换为外部的一个IP。或者内部只有一个IP转换为多个外部IP中的某个(当然,这种情况通常不存在,因为这么做找不到其价值,公网IP是要钱的啊。。。)

对于单个内网IP道外网IP的NAT过程,就不做过多介绍,这个比较简单,容易理解。他们之间存在一对一的简单映射关系。这里,主要说的是,内网主机很多,不是一个,比如有5个,而外网IP(能够访问公网的IP)只有1个,那么这5个内网主机如何通过这个公网IP上网呢?这个时候,PAT就派上用场了。

通常,这个公网IP会配置给网关或者路由器上,让其和Internet互联,而内部的主机,则通过交换机或者直接连接到路由器的LAN端口上。为了将这个场景的问题描述清楚,举个例子,当内网主机A(A1:192.168.100.20)访问163主页,唯一的一个公网IP配置在网关G(设地址为A2)上。

先说从内部向外部发送请求:当A的请求IP数据包到达网关G时,网关G将收到的IP请求数据包中源IP(即A的内网IP)地址转换为自己的网关IP(就是那个唯一的一个公网IP)地址,让后将请求数据包中的源端口号P1转换为一个随机的没有被用到的端口号P2,然后再将数据包转发到公网上去。这里,之所以修改源端口号,就是为了区分内网其他的主机的请求的。这时,存在一个新的映射关系,即A1:P1 vs A2:p2.

再说外部请求给予了相应的过程:假设这个相应的数据包已经到达网关G了,网关就要将这个数据做反向地址转换。即将数据包中目的地址为A2端口号为P2的数据包做地址转换,将其目的地址转换为A1,目的端口号转换为P1,然后再发向与A1:P1对应的进来时的物理端口,完成数据的转发。

这里,我要再解释下,为何要引入源(响应数据时则是目的端口)端口的转换,主要是为了正确的将响应的数据准确的转发回来。如果不做端口转换时,比如某个时候,有2个内网主机(H1,H2)都向外网发起访问,都是80的HTTP请求(假设他们请求中源端口分别为HP1,HP2),H1访问的是163,另一个访问的是sina,不做端口映射时,数据包出去时的源IP和端口分别为A2:HP1和A2:HP2。相应的数据包中目的IP和目的端口号当然也是A2:HP1和A2:HP2了,毫无疑问(若不理解,则请自己google一下IP通信中IP地址和端口号的使用原理)。到这里,读者可能会说,这有什么问题呢?呵呵,当然不会绝对的发生问题,但是,若HP1和HP2相同了,会发生什么情况?网关这个时候是不是不知道收到的响应数据包该往哪个内网主机发了,对不对???所以,网关做端口的转换,就是用来维护请求出去和响应进来的数据包之间的映射匹配关系的。

NAT的过程,主要是IP(以及端口)的转换过程。当然,有人会说,网关收到数据做转发的时候,同样也修改了MAC地址。说的没错,MAC地址是链路层的地址,IP通信过程中,只要涉及到物理端口的变迁,都涉及到MAC地址的变化,这个变化都是源MAC地址被改变。而这个不是NAT的特性,是IP通信的特性,不要混淆了!

也许还有人会问,为何要做地址转换?比如,内部请求时。试想下,不转换,请求可以出去,没有问题,但是你想过没有,响应数据如何回来?内网IP是在公网的IP通信过程中不被认知的。不做NAT,这就等于买了一张去往火星的单程票,去的了,回不来啊!

另外,基本常识,在这里需要说说的是MAC地址是链路层的地址,交换机访问域里面通信的地址,交换机端口学习以及生成树等都需要这个地址哟。IP地址是网络层的地址,也就是常熟的层三的地址,是路由逻辑的输入哟。端口这个概念,是传输层的东西哟,比如TCP或者UDP等才有这个概念,其他的常说的HTTP协议默认用的是80端口,哎,HTTP是应用层的协议,他是要依托TCP来传递数据的,所以啊,这个默认的80真正意义上指的是传输层的端口号。。

总结上面的地址转换,可以分为源地址转换(SNAT)和目的地址转换(DNAT).他们只是方向上的不同,但应用场合也完全不同。

这里,说下,NAT如何配置,主要是在网关上配置iptables的nat表。当然也可以用ip指令配置。这里用iptables指令说明如何操作。

SNAT(典型的场合:如前面说的多内网IP的主机共享一个公网IP上网),假设:内网IPs为192.168.100.0/24,外网IP为54.168.100.101且端口为2000至5000范围内,网关上配置iptables:

iptables -t nat -A POSTROUTING -p tcp -s 192.168.100.0/24 --dport 80 -o eth0 -j SNAT --to-source 54.168.100.101:2000-5000

DNAT(典型的应用就是负载均衡):例如将所有的要去向100.10.10.10的请求,转向到IP为200.10.20.30~40的主机群。网关上配置的iptables如下:

iptables -t nat -A PREROUTING -d 100.10.10.10 -i eth1 -j DNAT --to-destination 200.10.20.30-200.10.20.40

注意:iptables表中的nat表,POSTROUTING只能用在SNAT这个target中,而PREROUTING这个chain只能用在DNAT这个target中.

这里附录上SNAT及DNAT配置相关的常用命令选项:

-j SNAT:源网络地址转换,SNAT就是重写包的源地址
-j SNAT --to-source ipaddr[-ipaddr][:port-port]

-j DNAT:目的网络地址转换,DNAT就是重写包的目的地址
-j DNAT --to-destination ipaddr[-ipaddr][:port-port]

ipaddr:

  • a single new source/destination IP address
  • range of IP addresses
  • or you can add several --to-source/--to-destination options. a simple round-robin takes place between these adresses.

port range(only valid if the rule also specifies -p tcp or -p udp). If no port range is specified, then source/destination ports below 512 will be mapped to other ports below 512.

到这里,NAT的原理及应用,应该说的差不多了。关于iptables的工作原理,可以参考我前面的博文。

NAT,网络地址转换详解的更多相关文章

  1. VMWare 网络连接模式(bridged、NAT、host-only)详解

    转自VMWare 网络连接模式(bridged.NAT.host-only)详解 host-only 在某些特殊的网络调试环境中,如何要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模 ...

  2. NAT 网络地址转换

    NAT  网络地址转换(Network Address Translation) NAT(Network Address Translation,网络地址转换)是1994年提出的. 属接入广域网(WA ...

  3. CCNA学习 NAT网络地址转换

    CCNA基础 NAT网络地址转换 在计算机网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是 ...

  4. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  5. NAT网络地址转换模拟过程

    原理图,如图1 图1 以下为配置NAT网络地址转换的实验: eNSP模拟图,如图2 图2 Step1.给路由器的每个接口赋予一个地址,如图3,图4 图3 图4 AR1和AR2中添加路由表项,如图5,图 ...

  6. [译] NAT - 网络地址转换(2016)

    [译] NAT - 网络地址转换(2016) Published at 2019-02-17 | Last Update 译者序 本文翻译自 2016 年的一篇英文博客 NAT - Network A ...

  7. iptables做nat网络地址转换

    iptables做nat网络地址转换. 0. 权威文档 http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html e文好的直接跳过本文 ...

  8. NAT网络地址转换技术

    NAT网络地址转换技术 目录 一.NAT概述 1.1.概述 1.2.NAT 的应用场景 二.NAT的类型及配置命令 2.1.静态NAT 2.2.动态NAT 2.3.Easy IP 2.4.NATP 2 ...

  9. 【记】VM VirtualBox 网络地址转换(NAT)使用详解

    1. 查看虚拟机Centos6的ip 但是这个IP地址并不能直接连接,因为本地VBox网络连接方式采用的是“网络地址转换(NAT)”(如上上图所示),也就是说 10.0.2.15 这地址是转换的. 2 ...

随机推荐

  1. MySQL表名、列名区分大小写详解

    前言:出现的问题 在本地数据库上执行修改银行卡没有报错 但线上执行报错 发现是表找不到,发现表名不对应该是card_cardinfo,但本地上没有问题,能正常修改,然后在数据库里测试,发现本地库(wi ...

  2. 在hdfs上存取xml文件的实现代码

    要读取的文件为:/user/hdfs/stdin.xml <?xml version="1.0" encoding="UTF-8"?> <re ...

  3. Mapnik 编译安装过程

    首先总结一下,Linux(windows上没有测试过)上Mapnik的编译与测试就是一部心酸血泪史呀,如果您没有做好思想准备,那就出门左转,看点有意思的去吧,编译这个太煎熬了. 安装PostgreSQ ...

  4. 刻通云KeyTone Cloud测试

    注:本文转自陈沙克的博客,原文见http://www.chenshake.com/carved-through-the-keytone-cloud-cloud-testing/ 一直都很希望有更多的O ...

  5. Qt之QFileSystemWatcher

    简述 QFileSystemWatcher类用于提供监视文件和目录修改的接口. QFileSystemWatcher通过监控指定路径的列表,监视文件系统中文件和目录的变更. 调用addPath()函数 ...

  6. ZOJ 1001 A + B Problem

    熟悉ZOJ环境,如何上传代码,如何查看结果. #include<iostream> using namespace std; int main(){ int a,b; while(cin& ...

  7. leetcode 138. Copy List with Random Pointer ----- java

    A linked list is given such that each node contains an additional random pointer which could point t ...

  8. MySql 查询一周内最近7天记录

    本周内:select * from wap_content where week(created_at) = week(now) 查询一天:select * from table where to_d ...

  9. awesome-nlp

    awesome-nlp  A curated list of resources dedicated to Natural Language Processing Maintainers - Keon ...

  10. CentOS6.4安装Golang环境

    什么是Go? Go是一门并发支持.垃圾回收的编译型的系统编程语言,目的是为了创造一门具有在静态编译语言的高性能和动态语言的高效开发之间拥有良好平衡点的一门编程语言. Go的主要特点有哪些? 类型安全和 ...