Iptables 下 SNAT、DNAT和MASQUERADE三者之间的区别
Iptables 中可以灵活的做各种网络地址转换(NAT,Network Address Translation)
网络地址转换(NAT)主要有两种:SNAT 和 DNAT,但是也有一种特例 MASQUERADE (即,地址伪装)。
1、SNAT
SNAT 是 Source Network Address Translation 的缩写,即源地址目标转换。
典型应用:
多个PC机使用ADSL路由器共享上网
每个PC机都配置了内网IP
PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip
当外部网络的服务器比如网站web服务器接到访问请求的时候
他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip
这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了
所以叫做SNAT,基于源地址的地址转换
2、DNAT
DNAT 是 Destination Network Address Translation 的缩写,即目标网络地址转换。
典型应用:
有个web服务器放在内网配置内网ip,
前端有个防火墙配置公网ip互联网上的访问者使用公网ip来访问这个网站当访问的时候,
客户端发出 一个数据包这个数据包的报头里边,
目标地址写的是防火墙的公网ip防火墙会把这个数据包的报头改写一次,
将目标地址改写成web服务器的内网ip然后再把 这个数据包发送到内网的web服务器上这样,
数据包就穿透了防火墙,
并从公网ip变成了一个对内网地址的访问了即DNAT,基于目标的网络地址转换
3、MASQUERADE
MASQUERADE,地址伪装,在 iptables 中有着和 SNAT 相近的效果,但也有一些区别:
SNAT,DNAT,MASQUERADE都是 NAT,MASQUERADE 是 SNAT 的一个特例。
- SNAT 是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的 IP,这样,接收方就认为数据包的来源是被替换的那个 IP 的主机;
- MASQUERADE 是用发送数据的网卡上的 IP 来替换源 IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过 dhcp 分配IP的情况下,就得用 MASQUERADE;
- DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的 IP,表现为如果你想访问 A,可是因为网关做了 DNAT,把所有访问 A 的数据包的目的IP全部修改为 B,那么,你实际上访问的是B;
- 因为,路由是按照目的地址来选择的,因此,DNAT 是在 PREROUTING 链上来进行的,而 SNAT 是在数据包发送出去的时候才进行,因此是在 POSTROUTING 链上进行的。
4、MASQUERADE 与 SNAT 的区别
使用 SNAT 的时候,出口 IP 的地址范围可以是一个,也可以是多个。
举个例子:
# 如下命令表示把所有 10.8.0.0 网段的数据包 SNAT 成 192.168.5.3 的 IP 然后发出去:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3 # 如下命令表示把所有 10.8.0.0 网段的数据包 SNAT 成 192.168.5.3/192.168.5.4/192.168.5.5 等几个ip然后发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
这就是 SNAT 的使用方法,即可以NAT成一个地址,也可以NAT成多个地址
但是,对于 SNAT,不管是几个地址,必须明确的指定要 SNAT 的 IP
假如当前系统用的是 ADSL 动态拨号方式,那么每次拨号,出口 ip 192.168.5.3 都会改变
而且改变的幅度很大,不一定是 192.168.5.3 到 192.168.5.5 范围内的地址
这个时候如果按照现在的方式来配置 iptables 就会出现问题了
因为每次拨号后,服务器地址都会变化,而 iptables 规则内的 ip 是不会随着自动变化的
每次地址变化后都必须手工修改一次 iptables,把规则里边的固定 ip 改成新的 ip
这样是非常不好用的
MASQUERADE 就是针对这种场景而设计的,它的作用是,从服务器的网卡上,自动获取当前 ip 地址来做 NAT
比如下边的命令:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的话,不用指定SNAT的目标ip了
不管现在 eth0 的出口获得了怎样的动态 ip,MASQUERADE 会自动读取 eth0 现在的 ip 地址然后做 SNAT 出去
这样就实现了很好的动态 SNAT 地址转换
注:
对于 MASQUERADE,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE 都要查找可用的 IP 地址,而不象 SNAT 用 的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由 ISP 的 DHCP 随机分配的。
Iptables 下 SNAT、DNAT和MASQUERADE三者之间的区别的更多相关文章
- [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别
要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...
- $POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别
$POST .$HTTP_RAW_POST_DATA.php://input三者之间的区别 访问原始 POST 数据的更好方法是 php://input或者$HTTP_RAW_POST_DATA.$H ...
- keydown,keypress,keyup三者之间的区别
最近看了Javascript高级教程中对过滤输入的介绍,想实现比如电话号码中不能包好非数值的字符,而相应文本中插入字符的操作是keypress事件,所以就想通过阻止这个事件的默认事件行为来阻止这个事件 ...
- iOS中NSNotification、delegate、KVO三者之间的区别与联系?
前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细 ...
- @private、@protected与@public三者之间的区别
@private.@protected与@public三者之间的区别 类之间关系图 @private只能够使用在声明的类当中,其子类也不能够使用用@private声明的实例变量 @protected只 ...
- .NET、C#和ASP.NET三者之间的区别与联系
.NET.C#和ASP.NET三者之间的区别与联系 1..net(dot net) .net是一个平台,抽象的平台概念. 实现形式是库:①定义了基本的类型(通用类型系统CTS,common type ...
- C#、.NET和ASP.NET三者之间的区别
刚毕业后出去找工作面试的时候就遇到这个问题!.回答不上来.回来网上查的如下: 那么 .NET.C#和ASP.NET这三者之间区别不清楚,到底它们之间有什么联系呢? 1..NET是一个平台,一个抽象的平 ...
- socket,tcp,http三者之间的区别和原理
http.TCP/IP协议与socket之间的区别下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP.SMTP.SNMP.FTP.Telnet.SIP ...
- 虚拟机、云主机、VPS 三者之间的区别
当我们想部署网站的时候,经常会听到vps.云主机.虚拟机等关键字,那么你知道这几者之间的区别吗?本文就讲解一下VPS.云主机.虚拟机之间的区别. 什么是VPS VPS 是Virtual Private ...
随机推荐
- 【web系统UI自动化】关于UI自动化的总结
实施过了web系统的UI自动化,回顾梳理下,想到什么写什么,随时补充. 首先,自动化测试不是手动测试的替代品,是比较好的补充,而且不是占大比重的补充. 70%的测试工作集中在底层接口测试和单元测试,2 ...
- linux命令的学习随笔
getconf PAGE_SIZE //获取内存分页的大小alias vi='vim'//临时生效vi /root/.bashrcwhereis ls输出重定向> >> 2> ...
- jenkins打包java项目缺少jar包问题解决
java项目在使用jenkins打包时个别jar包可能会没有下载到本地,这时候就要用命令行本地安装一下 打包时基础jar包报错如图: 黑框里依次为: 组ID:-DgroupId=com.azazar ...
- Flash 0day(CVE-2018-4878)复现过程
一.前言介绍 2018年2月1号,Adobe官方发布安全通报(APSA18-01),声明Adobe Flash 28.0.0.137及其之前的版本,存在高危漏洞(CVE-2018-4878). 从Ad ...
- MvvmLight框架使用入门(5)
上一次写MvvmLight框架使用入门(4)的时候还在用Visual Studio 2015,我儿子也不会过来盖上我的XPS……重启这个系列一方面是因为最近又开始写UWP的东西了,另一个是因为Mvvm ...
- python中绑定码云仓库
1.File——Settings——Version Control——Git——输入git安装路径下bin下的git.exe路径——点击后面的Test测试一下,弹出版本点击ok即可 2.点击工具栏中的 ...
- python中eval()
eval()执行简单的python代码(个人感觉像是执行表达式)
- 简单地 Makefile 书写
注意事项 每个标签分支前都不能用空格,必须用tab 标签外调用bash命令用 $(shell -),标签内可以正常使用 标签后可以指定其他标签,执行顺序是先执行其他标签,而后在执行自己 比如 all: ...
- 常见重构技巧 - 5种方式去除多余的if else
常见重构技巧 - 去除多余的if else 最为常见的是代码中使用很多的if/else,或者switch/case:如何重构呢?方法特别多,本文带你学习其中的技巧. 常见重构技巧 - 去除多余的if ...
- VS2017报错:未识别符vector
解决办法:添加头文件#include<vector>,添加命名空间 using namespace std.