SNAT与MASQUERADE的区别的一点疑惑

发表于:2007-07-04来源:作者:点击数: 标签:
MASQUERADE是SNAT的一种特例,MASQUERADE只能是DHCP分配的ip可以做,如PPPOE之类(对外),静态ip是不可以做。在LAN如果不是DHCP是不可以做MASQUERADE么?如果网关对外是静态ip,内部是静态ip,按理说也是不可以做,那我防火墙里的 iptables-tnat-APREROUTIN

MASQUERADE是SNAT的一种特例,MASQUERADE只能是DHCP分配的ip可以做,如PPPOE之类(对外),静态ip是不可以做。在LAN如果不是DHCP是不可以做MASQUERADE么?如果网关对外是静态ip,内部是静态ip,按理说也是不可以做,那我防火墙里的
iptables -t nat -A PREROUTING -p TCP -m tcp --dport 80 -j REDIRECT --to-ports 3128 
iptables -t nat -A POSTROUTING -j MASQUERADE 是不是应该提示错误呢?是不是应该作成纯SNAT呢?

 platinum 回复于:2005-03-08 09:34:30
[quote:d344b6f38e="zhanglei590"]MASQUERADE只能是DHCP分配的ip可以做,如PPPOE之类(对外),静态ip是不可以做。..[/quote:d344b6f38e]

你说错了,可以
MASQUERADE只是不用指明源地址而已,其他和SNAT没什么区别
所以为了方便,我无论做什么NAT的时候,都用MASQUERADE,除非一些特殊情况

 双眼皮的猪 回复于:2005-03-08 09:38:08
MASQUERADE是针对网络接口的,
SNAT是针对ip的...

个人理解.
做SNAT要注意,假如同时存在SNAT和MASQUERADE,请注意顺序.如果MASQUERADE在前边而且没有什么规则控制的话,SNAT可能就起不到作用了...

 zhanglei590 回复于:2005-03-08 09:39:12
那就是NAT的时候默认就是MASQUERADE?
但是我在www.netfilter.org上看的NAT HOWTO上说的,做MASQUERADE只能是DHCP获得的ip才可以做。静态ip需要用别的方法做SNAT...

 双眼皮的猪 回复于:2005-03-08 09:41:35
MASQUERADE适合动态ip,譬如adsl,pppoe之类.而SNAT需要有一个或一些固定已经分配给你的ip.

不一定只能是DHCP.也许netfilter上只是举个例子,或者是您英文不大好:)

 platinum 回复于:2005-03-08 09:43:34
[quote:cf961dc1f4="双眼皮的猪"]MASQUERADE适合动态ip,譬如adsl,pppoe之类.[/quote:cf961dc1f4]
应该说“更适合” :mrgreen:

 双眼皮的猪 回复于:2005-03-08 09:45:09
啊~偶错了~呵呵~
应该是更适合:)

 双眼皮的猪 回复于:2005-03-08 09:45:46
啊~偶错了~呵呵~
应该是更适合:)

 zhanglei590 回复于:2005-03-08 09:45:59
.....我看的是中文版的啊,老大!
它说的很清楚,MASQUERADE是SNAT的一种特例。如同MASQUERADE是SNAT的一个子集一样,做MASQUERADE肯定就做SNAT。(我是这样理解的)

 双眼皮的猪 回复于:2005-03-08 09:47:10
可以这么理解~呵呵:)
上面说过,MASQUERADE   更适合  动态ip.
多试几次就好了~光看不行

 zhanglei590 回复于:2005-03-08 09:50:08
那就是如果没有DHCP的话,那还不如直接做SNAT,更合适一些?

 双眼皮的猪 回复于:2005-03-08 09:51:33
您用ADSL的时候有固定ip吗?呵呵..
因为没有固定ip时用MASQUERADE,所以叫做  更适合  
如果有固定ip,SNAT跟MASQUERADE效果就一样了~

 zhanglei590 回复于:2005-03-08 09:53:54
嘿嘿~~~我是光纤接入,有固定ip的。
我想,如果是我们这个样子,那还不如直接做SNAT的好,做MASQUERADE还要多判断一次。

 双眼皮的猪 回复于:2005-03-08 09:56:08
OK,祝顺利:)
呵呵~

 zhanglei590 回复于:2005-03-08 09:59:45
说详细一点啊....
我想既然MASQUERADE是SNAT的特例,那么系统在读到规则时可能先看到的是MASQUERADE,然后一看没有DHCP,就回到做SNAT。(应该提示出错吧...)

 双眼皮的猪 回复于:2005-03-08 09:59:50
我不知道他的意思是不是要判断接口的ip...呵呵...
楼主出来讲讲吧

 zhanglei590 回复于:2005-03-08 10:02:17
我也是刚开始看,想向大家请教一下,看我理解的对不...

 双眼皮的猪 回复于:2005-03-08 10:03:14
我不懂~你们两个讨论~俺晚上来看结果~哈~

 platinum 回复于:2005-03-08 10:05:17
MASQUERADE不管你的地址转换成什么出去,他只以当前网关的DEFAULT GATEWAY做为伪造的源地址,SNAT

实际上MASQUERADE是先取当前网关IP,然后作为源地址出去
SNAT是读取你的配置里面的地址,然后作为源地址出去

 platinum 回复于:2005-03-08 10:07:23
多WAN的时候,MASQUERADE必不可少
他会自动根据设置的多路由自动选择一条能出去的,作为自己的源端口

 zhanglei590 回复于:2005-03-08 10:10:03
那么SNAT的配置地址,我是不是可以任意给呢?但是它用的是网关地址,在ip数据包里源地址显示的是我给的地址?

 platinum 回复于:2005-03-08 10:13:43
只要你任意给的SNAT源地址能被你上一层的设备路由到你的网关上,你就能用

 zhanglei590 回复于:2005-03-08 10:21:02
[quote:873832bad1="platinum"]MASQUERADE不管你的地址转换成什么出去,他只以当前网关的DEFAULT GATEWAY做为伪造的源地址,SNAT

实际上MASQUERADE是先取当前网关IP,然后作为源地址出去
SNAT是读取你的配置里面的地址,然后作为源地址出去[/quote:873832bad1]

那这里的MASQUERADE网关是哪个网关呢?内还是外?

 双眼皮的猪 回复于:2005-03-08 10:27:07
MASQUERADE就是SNAT,你前边不是说过了吗?
MASQUERADE只是更适合动态ip。其他一样的。
至于上面所说到的,只是nat的概念,了解一下就可以了~

 platinum 回复于:2005-03-08 10:42:37
[quote:7edf1b8aa2="zhanglei590"]

那这里的MASQUERADE网关是哪个网关呢?内还是外?[/quote:7edf1b8aa2]
你做LINUX的机器有几个网关?
他要SNAT的地址应该是能被上一层设备路由到你LINUX上的一个地址

有2种接入方式
1、你的WAN口是一个公网IP,那么,你设置SNAT或者MASQUERADE都可以
2、你的WAN口是一个私网IP,而你的网关也是一个私网IP,但是,ISP给你一些公网IP地址,对于这种情况,你就需要用SNAT来伪造源地址为ISP给你的那些公网IP了,因为只有那些公网IP才可以被ISP路由到你的私网IP来,这种情况下,MASQUERADE就不适合了

 急不通 回复于:2005-03-08 10:49:07
MASQUERADE和SNAT所做的事情基本上是一样的,不过snat要指定出口的ip地址,而配置masquerade时不用指定出口IP地址,可以自动查找出口IP地址用作SNAT,所以不管外网口的地址是静态还是动态,配masquerade都可以工作,很方便(另一方面,方便也是有一定的系统开销作为代价的)

 zhanglei590 回复于:2005-03-08 12:19:39
按照双眼皮的意思就是,如果是动态获得的ip的话,做MASQUERADE是最合适的,如果说是静态的话,做MASQUERADE就划不来的...
那么在静态ip的情况下,platinum做哪个更好一些呢?

 platinum 回复于:2005-03-08 12:30:02
静态IP的话,用SNAT更直观
如果遇到我说的第二种网络的时候,必须用SNAT

 網中人 回复于:2005-03-08 12:33:56
[quote:4e065a5519="platinum"]MASQUERADE不管你的地址转换成什么出去,他只以当前网关的DEFAULT GATEWAY做为伪造的源地址,SNAT

实际上MASQUERADE是先取当前网关IP,然后作为源地址出去
SNAT是读取你的配置里面的地址,然后作为源地址出去[/quote:4e065a5519]

嗯? 上面說的有點不怎麼對哦...

不管 MASQUERADE 還是 SNAT, 都是對 source socket 的改寫.
差別是:
SNAT 可改寫為你所指定的 IP
MASQUERADE 則是根據 output 界面當時的 IP 來改寫.
在效能上, SNAT 比 MASQUERADE 要快些, 因為可省掉 IP 判斷的動作. 
但從便利來看, 則 MASQUERADE 更為靈活, 無需事先抓出界面的 IP .
然而, 在多個 ip alias 的情況下, MASQUERADE 只能使用原生 IP, 而 SNAT 則可讓你指定你想要的 IP .

之前就討論過了:

http://bbs.chinaunix.net/forum/viewtopic.php?t=343664

 双眼皮的猪 回复于:2005-03-08 12:36:44
网哥的界面,大陆叫接口~说明一下:)

 網中人 回复于:2005-03-08 12:42:26
感謝說明!  ^_^

 platinum 回复于:2005-03-08 12:44:46
[quote:1f04228697]
有2种接入方式 
1、你的WAN口是一个公网IP,那么,你设置SNAT或者MASQUERADE都可以 
2、你的WAN口是一个私网IP,而你的网关也是一个私网IP,但是,ISP给你一些公网IP地址,对于这种情况,你就需要用SNAT来伪造源地址为ISP给你的那些公网IP了,因为只有那些公网IP才可以被ISP路由到你的私网IP来,这种情况下,MASQUERADE就不适合了
[/quote:1f04228697]
这个说法对不对呢?

 zhanglei590 回复于:2005-03-08 12:46:24
呵呵~~~~怎么像我在前边所理解的....

 双眼皮的猪 回复于:2005-03-08 12:48:25
我想platinum说明的应该是针对pppoe的(猜).一般来说在isp的局端设备上都加了到pppoe client网段的返回路由~所以这种情况是wan是私网ip,内网口是另外一个网段的私网ip就行。

pppoe是转发的,而不是做nat...所以会有问题...

但是我不明白既然网关是私网ip,为什么isp又给公网ip呢?没见过,能不能讲详细点?

 platinum 回复于:2005-03-08 12:56:58
我是这样理解的,不知道对不对

ISP他们负责把私网IP给你路由[color=red:07748fbcad](这里错了,修正一下,应该是NAT)[/color:07748fbcad]出去,然后做一个公网IP的回址路由,这样别人访问公网IP的时候,就能通过私网IP的链路连到客户的路由器上了

 zhanglei590 回复于:2005-03-08 13:00:14
谢谢网中人,你给的链接我看了,又学了一点东西...
请大家继续....

 双眼皮的猪 回复于:2005-03-08 13:00:26
私网地址是不予路由的吧~我觉得应该在外面应该还有一次nat,不然你不可能以私网ip的形式在网络上流通的~

 zhanglei590 回复于:2005-03-08 13:08:11
[quote:be5a878f20="platinum"]鋈ィ?缓笞鲆桓龉?鳬P的回址路由,这样别人访问公网IP的时候,就能通过私网IP的链路连到客户的路由器上了[/quote:be5a878f20]

说的是isp路由我们的外网ip么?

 双眼皮的猪 回复于:2005-03-08 13:09:04
[quote:6c736a09e2="platinum"]鋈ィ?缓笞鲆桓龉?鳬P的回址路由,这样别人访问公网IP的时候,就能通过私网IP的链路连到客户的路由器上了[/quote:6c736a09e2]
后面这句话我没看懂,通过私网ip的链路连到客户的路由器上?

 双眼皮的猪 回复于:2005-03-08 13:12:29
我睡觉了~各位慢慢聊~这些天老失眠~多梦~烦躁啊~哎~

各位多多讨论~我过会过来学习,嘿嘿

 platinum 回复于:2005-03-08 13:14:03
我在研究网兄给我的文章
[quote:3d34529397]
iptables -t nat -A POSTROUTING -o ppp0 \ 
    -s 192.168.100.0/24 -j MASQUERADE  


事實上﹐這是一個 SNAT 的經典例子了﹕當 NAT 處理一個封包的時候﹐如果發現它是來自 192.168.100.0/24 這個網路﹐並且經由 ppp0 送出的話﹐那麼它的來源位址則換成 ppp0 的 IP 位址( socket 的元素之一)。
[/quote:3d34529397]
看来MASQUERADE是不能用于第二种网络结构的?

 双眼皮的猪 回复于:2005-03-08 13:27:09
哈~睡不成了~上班上班~
针对网哥的都是改写“source socket”的,其实我有异议,我觉得source address及source port更合适...BSD的Socket一般用来说明传输层上建立的连接.所以我觉得source socket不够贴切,若有错误,请指出...

 platinum 回复于:2005-03-08 13:37:40
看完那个文档,针对第二种网络拓扑(指ISP给私网IP和私网网关,同时给了一个公网地址池),我认为ISP那边实际又做了一次NAT

 zhanglei590 回复于:2005-03-08 14:30:04
我想他们应该是做路由吧...nat是不是会负担太重呢?

 網中人 回复于:2005-03-08 14:30:26
在一個 packet 裡, source socket 就是 source port + source address.

請理解一下 socket pair 在 packet 中的定義.

 双眼皮的猪 回复于:2005-03-08 14:48:17
原来Source Socket=Source address+Source port & ^_^
我猜
Destination Socket=Destination address+Destination port ^_^


Thanks:)

 網中人 回复于:2005-03-08 15:13:55
更精確來講,
解開 tcp packet 最前面 16 個 bit 與 ip packet 的第 96 到第 127 個 bit , 就是 source socket .
iptables 程式在作 SNAT 或 MASQUERADE 時, 就是改那裡. 且是 routing process 處理完之後才改的.

解開 tcp packet 第 17 到 32 個 bit 與 ip packet 的第 128 到第 159 個 bit , 就是 destination socket .
那是 DNAT 修改之處. 且是 routing 之前改的.

有空, 再看看我前面貼的貼子吧.

 双眼皮的猪 回复于:2005-03-08 15:18:35
哈~晚上看~我过会儿上下cu,过会儿又上下cu~
最近很烦躁~哈~
恩~晚上下班好好学习学习..
Thanks...

 網中人 回复于:2005-03-08 15:21:59
煩燥是學習的大殺手. 先靜下來再說吧.
要不, 說話可能很容易衝動的呢~~~ 小心.

 linuxpiao 回复于:2005-03-09 08:53:12
ADSL 有固定IP,我現就在用,ISP分給你公ip,你內部的私ip和网絡拓樸,雖有router,但只要在總出口做NAT就ok.內部是不用在nat 了,設置好默認Defaut Gateway 就可了!

 platinum 回复于:2005-03-09 09:31:23
[quote:81d007b621="platinum"]看完那个文档,针对第二种网络拓扑(指ISP给私网IP和私网网关,同时给了一个公网地址池),我认为ISP那边实际又做了一次NAT[/quote:81d007b621]
我还是心里没底SNAT和MASQUERADE都是替换了SOURCE部分,而且是在路由之后才替换的,但是我还是不明白

如果做的是NAT,ISP那边负载是不是太大了?
如果做的是路由,按理说私网IP是不能路由到公网上的,但是有可能路由到ISP的出口之前,然后呢?感觉还要NAT

请网兄继续指点一下 :em16:

 網中人 回复于:2005-03-09 13:58:37
你說的第二種 case , 應該是有一個 router 吧?
router 的 wan 端是一個 private IP, 而 lan 端是一個 public IP 連著一個劃分下來的 subnet .

若是這樣的話, 其實一點也不難理解.
我們很多時候在 wan-wan 兩個 router 之間用 private IP 來連.
只要 router 收到 packet 能知到 which is next hop 就行了.
至於 packet 到了 next hop , 那是目前的 router 不必管的.
而是 next hop 去重復下一個 next hop 的判定.

假設:
你的 subnet 是 public IP, 接到 router 的 LAN port.
然後 router 的 wan 與 isp router lan port 之間接一個 private IP,
再, isp router 的 wan 再接一個 public 就到 internet 去.

你的 host 只要知到 gw 是你的 router lan port,
然後 router 轉到 isp (不必管它是 public 還是 private IP)
isp 轉到 internet. 
這是出去的 packet ...

回來的:
internet 給你的 subnet 的 packet 路由到 isp.
isp 再轉到你的 router (同樣, 別管它是 public 還是 private)
你的 router 轉到 host .
完成!

這裡並沒用到任何的 nat 處理哦...
我想, 這類問題, 轉到 network 版去問, 會有很多人可以回答你.
只是, 我不常去那邊逛啦...

 platinum 回复于:2005-03-09 14:05:34
明白了:)

 60133056 回复于:2005-03-12 11:08:57
受教了

 zhanglei590 回复于:2005-03-13 21:26:41
我想网中人讲的基本上就是tcp/ip的路由问题了,和linux主机好象没有多大关系了吧...
郁闷啊~~~~《tcp/ip协议详解》这本书的路由部分看了好长时间都没看懂...可能那时候心里太乱了吧...等过一阵再看看

 KindGeorge 回复于:2005-03-14 18:32:02
MASQUERADE这个target和SNAT target的作用是一样的,区别就是它不需要指定--to-source 。MASQUERADE是被专门设计用于那些动态获取IP地址的连接的,比如,拨号上网、DHCP连接等。如果你有固定的IP地址,还是用SNAT target吧。

伪装一个连接意味着,我们自动获取网络接口的IP地址,而不使用--to-source 。当接口停用时,MASQUERADE不会记住任何连接,这在我们kill掉接口时是有很大好处的。如果我们使用SNAT target,连接跟踪的数据是被保留下来的,而且时间要好几天哦,这可是要占用很多连接跟踪的内存的。一般情况下,这种处理方式对于拨号上网来说是较好的(这有利于已有那连接继续使用)。如果我们被分配给了一个不同于前一次的IP,不管怎样已有的连接都要丢失,但或多或少地还是有一些连接记录被保留了

即使你有静态的IP,也可以使用MASQUERADE,而不用SNAT 。不过,这不是被赞成的,因为它会带来额外的开销,而且以后还可能引起矛盾,比如它也许会影响你的脚本,使它们不能用。

 cnriver 回复于:2005-03-14 19:53:12
[quote:e67dfbebb8="KindGeorge"]MASQUERADE这个target和SNAT target的作用是一样的,区别就是它不需要指定--to-source 。MASQUERADE是被专门设计用于那些动态获取IP地址的连接的,比如,拨号上网、DHCP连接等。如果你有固定的IP地址,还是用SNAT ta..........[/quote:e67dfbebb8]

分析比较全面, 非常赞成。

 platinum 回复于:2005-03-14 20:00:22
[quote:b555afb8e6="KindGeorge"]即使你有静态的IP,也可以使用MASQUERADE,而不用SNAT 。不过,这不是被赞成的,因为它会带来额外的开销,而且以后还可能引起矛盾,比如它也许会影响你的脚本,使它们不能用。
[/quote:b555afb8e6]
后半句不是很理解

 cnriver 回复于:2005-03-14 20:17:19
其实主要区别是MASQUERADE会带来额外的开销,对计算机的负荷比snat稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。

 platinum 回复于:2005-03-14 21:28:50
[quote:62c07bdd72="cnriver"]其实主要区别是MASQUERADE会带来额外的开销,对计算机的负荷比snat稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。[/quote:62c07bdd72]
这个解释比较满意 :mrgreen:

 zhanglei590 回复于:2005-03-15 18:34:51
呵呵~~~看来我的观点是对的

原文转自:http://www.ltesting.net