iptables與stun
iptables與stun是一對朋友,互相幫忙,互相補短!
iptables與stun
Stun協(xié)議(Rfc3489、詳見http://www.ietf.org/rfc/rfc3489.txt)將NAT粗略分為4種類型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。舉個實際例子來說明這四種NAT的區(qū)別:
A機器在私網(wǎng)(192.168.0.4)
NAT服務器(210.21.12.140)
B機器在公網(wǎng)(210.15.27.166)
C機器在公網(wǎng)(210.15.27.140)
現(xiàn)在,A機器連接過B機器,假設是 A(192.168.0.4:5000)-> NAT(轉換后210.21.12.140:8000)-> B(210.15.27.166:2000)。
同時A從來沒有和C通信過。
則對于不同類型的NAT,有下列不同的結果:
Full Cone NAT:C發(fā)數(shù)據(jù)到210.21.12.140:8000,NAT會將數(shù)據(jù)包送到A(192.168.0.4:5000)。因為NAT上已經(jīng)有了192.168.0.4:5000到210.21.12.140:8000的映射。
Restricted Cone:C無法和A通信,因為A從來沒有和C通信過,NAT將拒絕C試圖與A連接的動作。但B可以通過210.21.12.140:8000與A的192.168.0.4:5000通信,且這里B可以使用任何端口與A通信。如:210.15.27.166:2001 -> 210.21.12.140:8000,NAT會送到A的5000端口上。
Port Restricted Cone:C無法與A通信,因為A從來沒有和C通信過。而B也只能用它的210.15.27.166:2000與A的192.168.0.4:5000通信,因為A也從來沒有和B的其他端口通信過。該類型NAT是端口受限的。
Symmetric NAT:上面3種類型,統(tǒng)稱為Cone NAT,有一個共同點:只要是從同一個內(nèi)部地址和端口出來的包,NAT都將它轉換成同一個外部地址和端口。但是Symmetric有點不同,具體表現(xiàn)在:只要是從同一個內(nèi)部地址和端口出來,且到同一個外部目標地址和端口,則NAT也都將它轉換成同一個外部地址和端口。但如果從同一個內(nèi)部地址和端口出來,是到另一個外部目標地址和端口,則NAT將使用不同的映射,轉換成不同的端口(外部地址只有一個,故不變)。而且和Port Restricted Cone一樣,只有曾經(jīng)收到過內(nèi)部地址發(fā)來包的外部地址,才能通過NAT映射后的地址向該內(nèi)部地址發(fā)包。
現(xiàn)針對Symmetric NAT舉例說明(承接前例):
A機器連接過B機器,假使是 A(192.168.0.4:5000)-> NAT(轉換后210.21.12.140:8000)-> B(210.15.27.166:2000)
如果此時A機器(192.168.0.4:5000)還想連接C機器(210.15.27.140:2000),則NAT上產(chǎn)生一個新的映射,對應的轉換可能為A(192.168.0.4:5000)-> NAT(轉換后210.21.12.140:8001)-> C(210.15.27.140:2000)。此時,B只能用它的210.15.27.166:2000通過NAT的210.21.12.140:8000與A的192.168.0.4:5000通信, C也只能用它的210.15.27.140:2000通過NAT的210.21.12.140:8001與A的192.168.0.4:5000通信,而B或者C的其他端口則均不能和A的192.168.0.4:5000通信。
通過上面的例子,我們應該清楚了Stun協(xié)議對NAT進行分類的依據(jù)。那么,我們現(xiàn)在根據(jù)上述分類標準(或例子),來簡要分析一下iptables的工作原理,看看他又是屬于哪種NAT呢?
首先,我們?nèi)ゾW(wǎng)上下載一個使用Stun協(xié)議檢測NAT的工具,網(wǎng)址在http://sourceforge.net/projects/stun/,使用該工具對iptables的檢測結果是Port restricted NAT detected。
我們先不要急著接受這個檢測結果,還是先來分析一下iptables的工作原理吧!
iptables在轉換地址時,遵循如下兩個原則:
1、盡量不去修改源端口,也就是說,ip偽裝后的源端口盡可能保持不變。
2、更為重要的是,ip偽裝后只需保證偽裝后的源地址/端口與目標地址/端口(即所謂的socket)唯一即可。
仍以前例說明如下:
A機器連接過B機器,假使是 A(192.168.0.4:5000)-> NAT(轉換后210.21.12.140:5000)-> B(210.15.27.166:2000)。(注意,此處NAT遵循原則1、故轉換后端口沒有改變)
如果此時A機器(192.168.0.4:5000)還想連接C機器(210.15.27.140:2000),則NAT上產(chǎn)生一個新的映射,但對應的轉換仍然有可能為A(192.168.0.4:5000)-> NAT(轉換后210.21.12.140:5000)-> C(210.15.27.140:2000)。這是因為NAT(轉換后210.21.12.140:5000)-> B(210.15.27.166:2000)和NAT(轉換后210.21.12.140:5000)-> C(210.15.27.140:2000)這兩個socket不重復。因此,對于iptables來說,這既是允許的(第2條原則)、也是必然的(第1條原則)。
在該例中,表面上看起來iptables似乎不屬于Symmetric NAT,因為它看起來不符合Symmetric NAT的要求:如果從同一個內(nèi)部地址和端口出來,是到另一個目標地址和端口,則NAT將使用不同的映射,轉換成不同的端口(外部地址只有一個,故不變)。相反,倒是符合除Symmetric NAT外的三種Cone NAT的要求:從同一個內(nèi)部地址和端口出來的包,NAT都將它轉換成同一個外部地址和端口。加上iptables具有端口受限的屬性(這一點不容置疑,后面舉反例證明之),所以好多檢測工具就把iptables報告為Port restricted NAT類型了。
下面仍以前例接著分析:
在前例中增加D機器在私網(wǎng)(192.168.0.5)
A機器連接過B機器,假使是 A(192.168.0.4:5000)-> NAT(轉換后210.21.12.140:5000)-> B(210.15.27.166:2000)
D機器連接過C機器,假使是 D(192.168.0.5:5000)-> NAT(轉換后210.21.12.140:5000)-> C(210.15.27.140:2000)
由iptables轉換原則可知,上述兩個轉換是允許且必然的。
如果此時A機器(192.168.0.4:5000)還想連接C機器(210.15.27.140:2000),則NAT上產(chǎn)生一個新的映射,但對應的轉換則變?yōu)锳(192.168.0.4:5000)-> NAT(轉換后210.21.12.140:5001)-> C(210.15.27.140:2000)。這是因為,如果仍然將其轉換為210.21.12.140:5000的話,則其所構成的socket(210.21.12.140:5000->210.15.27.140:2000)將和D->C的socket一致,產(chǎn)生沖突,不符合iptables的第2條原則。(注意,此處以5001表示轉換后不同的端口,但事實上,iptables卻并不按照內(nèi)部端口+1的原則來產(chǎn)生新的端口)。
在本例中,從同一個內(nèi)部地址和端口(192.168.0.4:5000)出來,到另一個目標地址和端口,則NAT使用了不同的映射,轉換成不同的端口。顯然,該現(xiàn)象又滿足了Symmetric NAT的要求,同時不能夠滿足Cone NAT的要求。
我們再來回顧一下Stun協(xié)議對Cone NAT的要求:所有(或只要是)從同一個內(nèi)部地址和端口出來的包,NAT都將它轉換成同一個外部地址和端口。雖然iptables在大部分情況下滿足“從同一個內(nèi)部地址和端口出來的包,都將把他轉換成同一個外部地址和端口”這一要求,但它不能在所有情況侶閼庖灰蟆K岳礪凵希頤薔橢荒馨裪ptables歸為Symmetric NAT了。(但在事實上,按照前面例子或者Stun協(xié)議里給出的Discovery Process,大部分情況下對iptables的檢測結果必然是Port restricted NAT)
為什么會出現(xiàn)上述矛盾的情況呢,關鍵在于Stun協(xié)議和iptables對映射的理解不同。Stun協(xié)議認為,一個映射的要素是:內(nèi)部地址端口和NAT轉換后地址端口的組合。而在iptables看來,一個映射的要素是:NAT轉換后地址端口和外部目標地址端口的組合。
下面,我們再來分析一下iptables的端口受限的屬性,我們舉一個反例證明之,仍以前例說明如下:
A機器連接過B機器,假使是 A(192.168.0.4:5000)-> NAT(轉換后210.21.12.140:5000)-> B(210.15.27.166:2000)
D機器連接過C機器,假使是 D(192.168.0.5:5000)-> NAT(轉換后210.21.12.140:5000)-> C(210.15.27.140:2000)
現(xiàn)假設iptables不具有端口受限的屬性,則另一E機器在公網(wǎng)(210.15.27.153:2000)或C(210.15.27.140:2001)向210.21.12.140:5000發(fā)包的話,應該能夠發(fā)到內(nèi)部機器上。但事實是,當這個包到達NAT(210.21.12.140:5000)時,NAT將不知道把這個包發(fā)給A(192.168.0.4:5000)還是D(192.168.0.5:5000)。顯然,該包只能丟棄,至此,足以證明iptables具有端口受限的屬性。
所以,iptables是貨真價實的Symmetric NAT。
附:
1、Stun全稱Simple Traversal of UDP Through NATs,所以本文所涉及的包,皆為UDP包。
2、本文雖然是針對linux下iptables的分析,但倘若把本文中關鍵詞“iptables”換成“Win2000下的ics或nat”,則本文的分析過程完全適用于Win2000下的ics或nat。即理論上Win2000下的ics或nat也是貨真價實的Symmetric NAT,但實際上,大部分情況下,檢測結果必然是Port restricted NAT。為什么Win2000下的ics或nat和iptables的分類是如此一致呢?因為Win2000下的ics或nat在進行NAT轉換時,遵循和iptables完全一樣的兩個原則。
通過文章,我們可以清楚的知道iptables與stun的知識。希望對你們有用!
【編輯推薦】