NAT,网络地址转换详解
这个技术,是一个非常成熟的技术了,但是,为了将其弄得清楚点,体系点,也为了备忘,还是有必要在这里梳理一下!
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,网络地址转换详解的更多相关文章
- VMWare 网络连接模式(bridged、NAT、host-only)详解
转自VMWare 网络连接模式(bridged.NAT.host-only)详解 host-only 在某些特殊的网络调试环境中,如何要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模 ...
- NAT 网络地址转换
NAT 网络地址转换(Network Address Translation) NAT(Network Address Translation,网络地址转换)是1994年提出的. 属接入广域网(WA ...
- CCNA学习 NAT网络地址转换
CCNA基础 NAT网络地址转换 在计算机网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是 ...
- PHP中IP地址与整型数字互相转换详解
这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...
- NAT网络地址转换模拟过程
原理图,如图1 图1 以下为配置NAT网络地址转换的实验: eNSP模拟图,如图2 图2 Step1.给路由器的每个接口赋予一个地址,如图3,图4 图3 图4 AR1和AR2中添加路由表项,如图5,图 ...
- [译] NAT - 网络地址转换(2016)
[译] NAT - 网络地址转换(2016) Published at 2019-02-17 | Last Update 译者序 本文翻译自 2016 年的一篇英文博客 NAT - Network A ...
- iptables做nat网络地址转换
iptables做nat网络地址转换. 0. 权威文档 http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html e文好的直接跳过本文 ...
- NAT网络地址转换技术
NAT网络地址转换技术 目录 一.NAT概述 1.1.概述 1.2.NAT 的应用场景 二.NAT的类型及配置命令 2.1.静态NAT 2.2.动态NAT 2.3.Easy IP 2.4.NATP 2 ...
- 【记】VM VirtualBox 网络地址转换(NAT)使用详解
1. 查看虚拟机Centos6的ip 但是这个IP地址并不能直接连接,因为本地VBox网络连接方式采用的是“网络地址转换(NAT)”(如上上图所示),也就是说 10.0.2.15 这地址是转换的. 2 ...
随机推荐
- 收集Magento FAQ常见问题处理办法
问题:Magento如何下载? 解答:Magento的英文官方下载地址为:http://www.magentocommerce.com/download 注意:需要注册后才可以下载,而且请下载完整版本 ...
- 【Modal】
1.Bootstrap Modal 文档里标签.属性.方法.事件都写的很清楚 2.AngularUI - Bootstrap UI Bootstrap 2.1 $scope.open = functi ...
- SecureCRT相关
-------------------------------------------------- 如何解决SecureCRT汉字乱码的问题? 选择工具栏上的“选项”菜单在打开的下拉菜单中选择“会话 ...
- android内嵌入webview导致闪退
这里碰到的是各种闪退情况之一,webview退出后,程序里立马需要申请内存空间做别的事情,这时内存不够就会闪退,做法就是延时个几百毫秒,在这段时间内让java把该回收的内存都回收,然后延时到了再做接下 ...
- js实现简单易用的上下无缝滚动效果
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- python矩阵运算 不断收集整理
python矩阵运算 转自:http://blog.sina.com.cn/s/blog_5f234d4701012p64.html Python使用NumPy包完成了对N-维数组的快速便捷操作.使用 ...
- Java-->一个只能运行十次的程序
--> 感觉没什么营养的样子啊... package com.dragon.java.tensoftware; import java.io.BufferedReader; import jav ...
- Java 性能优化实战记录(3)--JVM OOM的分析和原因追查
前言: C/C++的程序员渴望Java的自由, Java程序员期许C/C++的约束. 其实那里都是围城, 外面的人想进来, 里面的人想出去. 背景: 作为Java程序员, 除了享受垃圾回收机制带来的便 ...
- 转:SQL:外连接on条件与where条件的区别
原文地址:http://hi.baidu.com/benben1006/blog/item/187deb77bc0e5319b151b974.html 数据库在通过连接两张或多张表来返回记录时,都会生 ...
- 故障模块名称: mso.dll
本人今天早上打开word文档的时候打不开了,反复试了n次也不成,一想八成儿要重新装了,结果我点开详细信息看了一下,看到了“故障模块名称: mso.dll”这个提示,结果我就放到了百度上找了一下,都是只 ...