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三者之间的区别的更多相关文章

  1. [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别

    要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...

  2. $POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别

    $POST .$HTTP_RAW_POST_DATA.php://input三者之间的区别 访问原始 POST 数据的更好方法是 php://input或者$HTTP_RAW_POST_DATA.$H ...

  3. keydown,keypress,keyup三者之间的区别

    最近看了Javascript高级教程中对过滤输入的介绍,想实现比如电话号码中不能包好非数值的字符,而相应文本中插入字符的操作是keypress事件,所以就想通过阻止这个事件的默认事件行为来阻止这个事件 ...

  4. iOS中NSNotification、delegate、KVO三者之间的区别与联系?

    前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有个疑问,他们的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在网上看到一个博客上详细 ...

  5. @private、@protected与@public三者之间的区别

    @private.@protected与@public三者之间的区别 类之间关系图 @private只能够使用在声明的类当中,其子类也不能够使用用@private声明的实例变量 @protected只 ...

  6. .NET、C#和ASP.NET三者之间的区别与联系

    .NET.C#和ASP.NET三者之间的区别与联系 1..net(dot net) .net是一个平台,抽象的平台概念. 实现形式是库:①定义了基本的类型(通用类型系统CTS,common type ...

  7. C#、.NET和ASP.NET三者之间的区别

    刚毕业后出去找工作面试的时候就遇到这个问题!.回答不上来.回来网上查的如下: 那么 .NET.C#和ASP.NET这三者之间区别不清楚,到底它们之间有什么联系呢? 1..NET是一个平台,一个抽象的平 ...

  8. socket,tcp,http三者之间的区别和原理

    http.TCP/IP协议与socket之间的区别下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP.SMTP.SNMP.FTP.Telnet.SIP ...

  9. 虚拟机、云主机、VPS 三者之间的区别

    当我们想部署网站的时候,经常会听到vps.云主机.虚拟机等关键字,那么你知道这几者之间的区别吗?本文就讲解一下VPS.云主机.虚拟机之间的区别. 什么是VPS VPS 是Virtual Private ...

随机推荐

  1. Hive 高阶应用开发示例(一)

    Hive的一些常用的高阶开发 内容    1.开窗函数   2.行转列,列转行,多行转一行,一行转多行   3.分组: 增强型group   4.排序  5.关联 本次的内容: 内容1 和内容2,采用 ...

  2. JVM学习第三天(JVM的执行子系统)之字节码指令

    早上看了Class类文件结构,晚上继续来看字节码指令,毕竟谁也不是一步登天的(说白了还是穷); 字节码指令 Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码,Opcode ...

  3. 前端插入date类型的数据到数据库

    //插入 @Override public boolean insertEmp(Emp emp) { String sql = "insert into emp(lwlEmpno,lwlEn ...

  4. Scrapy框架的架构原理解析

    爬虫框架--Scrapy 如果你对爬虫的基础知识有了一定了解的话,那么是时候该了解一下爬虫框架了.那么为什么要使用爬虫框架? 学习框架的根本是学习一种编程思想,而不应该仅仅局限于是如何使用它.从了解到 ...

  5. 如何把Github上好的项目pull到本地或者fork到本地(码云仓库同理)?

    首先Github账户的注册我就不想再啰嗦了,我想大家都会的. 其次怎么把自己的项目push到自己的Github仓库请参考我的另一篇博客: 如何把自己开发的项目上传到GitHub仓库或者码云仓库? 最后 ...

  6. [LeetCode]364. 加权嵌套序列和 II (DFS)

    题目 给一个嵌套整数序列,请你返回每个数字在序列中的加权和,它们的权重由它们的深度决定. 序列中的每一个元素要么是一个整数,要么是一个序列(这个序列中的每个元素也同样是整数或序列). 与 前一个问题 ...

  7. Catalina 动态壁纸相关设置

    关闭SIP 重启,在开机时一直按Command+r进入recovery模式. 打开终端,如图所示: 在终端中输入命令,回车: csrutil disable 然后重启 设置动态壁纸 首先需在Dynam ...

  8. pytest封神之路第五步 参数化进阶

    用过unittest的朋友,肯定知道可以借助DDT实现参数化.用过JMeter的朋友,肯定知道JMeter自带了4种参数化方式(见参考资料).pytest同样支持参数化,而且很简单很实用. 语法 在& ...

  9. java实现点击查询数据生成excel文件并下载

    须先导入关键maven包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi& ...

  10. Metasploit之后渗透攻击(信息收集、权限提升)

    利用永恒之蓝漏洞入侵Windows7 流程参考https://www.jianshu.com/p/03a1c13f963a,实在是太棒啦!!! 目标主机为win7(IP:192.168.1.102): ...