溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

徹底理解Cisco NAT內(nèi)部的一些事

發(fā)布時(shí)間:2020-08-02 22:49:11 來(lái)源:網(wǎng)絡(luò) 閱讀:2715 作者:dog250 欄目:系統(tǒng)運(yùn)維

為了配一條NAT,發(fā)生了很多事。

一.Inside和Outside

很多在Cisco配置過(guò)NAT的人都有過(guò)一個(gè)疑問,那就是inside和outside的區(qū)別!以下是Cisco官方文檔上關(guān)于NAT執(zhí)行順序的說(shuō)明:
徹底理解Cisco NAT內(nèi)部的一些事

注意紅色和藍(lán)色圈住的部分,對(duì)于inside-outside而言,NAT發(fā)生在路由之后,而對(duì)于outside-inside而言,NAT發(fā)生在路由之前。這是目前為止,我們唯一需要記住的。

1.問題

迷惑的原因不在別的,就在inside,outside這個(gè)名字不好,實(shí)際上如果將inside-outside換成POST-ROUTING,將outside-inside換成PRE-ROUTING的話,就非常好理解了,最重要的是,換了名字之后,NAT看起來(lái)不再和設(shè)備的inside/outside網(wǎng)口域相關(guān),而和“路由”發(fā)生了關(guān)系,雖然本質(zhì)上沒有任何變化。
       后面會(huì)介紹,實(shí)際上,在理解Cisco的NAT的時(shí)候,根本不能將inside和outside單獨(dú)拿出來(lái)理解,inside和outside僅僅是一個(gè)位置限定詞,代表“某地”,而具體的是“到某地去”還是“從某地來(lái)”,還需要一個(gè)副詞,這就是source和destination。在詳述這個(gè)之前,姑且先將inside和outside單獨(dú)拿出來(lái)使用。
       接下來(lái)我來(lái)說(shuō)明一下NAT和路由的關(guān)系是多么重要!考慮以下的數(shù)據(jù)流,我以“路由”這個(gè)動(dòng)作為中心:
正向包:-->NAT point1-->路由-->NAT point2-->
返回包:<--NAT point1<--路由<--NAT point2<--

我們看一下在NAT point1和NAT point2上要做些什么動(dòng)作才合理。首先我們先考慮轉(zhuǎn)換正向包的源IP地址發(fā)生在NAT point2,那么對(duì)于返回包,目標(biāo)地址轉(zhuǎn)換就發(fā)生在NAT point2,返回包轉(zhuǎn)換完目標(biāo)地址后,發(fā)生路由查詢,數(shù)據(jù)包正常返回,沒有任何問題?,F(xiàn)在考慮正向包的源IP地址轉(zhuǎn)換發(fā)生在NAT point1,那么按照將NAT鉤子操作安裝在數(shù)據(jù)流同一位置的原則,返回包的目標(biāo)地址轉(zhuǎn)換只能發(fā)生在NAT point1,此時(shí)已經(jīng)經(jīng)過(guò)了路由查詢,路由查詢是基于目標(biāo)地址轉(zhuǎn)換前的目標(biāo)地址來(lái)的,也就是說(shuō)這個(gè)路由結(jié)果并非真正的路由結(jié)果,真正要想將返回?cái)?shù)據(jù)包送到目的地,必須基于轉(zhuǎn)換后目標(biāo)地址來(lái)查詢路由表才可以,然而即便這個(gè)針對(duì)轉(zhuǎn)換前目標(biāo)的路由查詢結(jié)果實(shí)際上是個(gè)假的結(jié)果,你也要必須把它映射成一個(gè)真的結(jié)果(這就是ip nat outside source中add-route參數(shù)要做的事情,下面的例子詳述)。以下給出一個(gè)實(shí)例:


徹底理解Cisco NAT內(nèi)部的一些事


為了使得返回包能到達(dá)1.1.1.2,必須將到達(dá)2.2.2.4的路由映射到E0那一側(cè)才行,因此必須增加一條:
ip route 2.2.2.4 255.255.255.255 1.1.1.2
也就是說(shuō)將到達(dá)目標(biāo)地址轉(zhuǎn)換前的下一跳設(shè)置成目標(biāo)地址轉(zhuǎn)換后的下一跳。
       這就是NAT和路由的聯(lián)動(dòng)關(guān)系。Cisco中如果你用ip nat outside source設(shè)置NAT的時(shí)候,就會(huì)碰到上面的這個(gè)問題,你可以手工添加一條反向包的地址轉(zhuǎn)換前路由映射,也可以通過(guò)命令行后面加add-route參數(shù)解決,add-route參數(shù)會(huì)自動(dòng)為你添加那條路由,實(shí)際上它做的就是:
a.根據(jù)NAT映射表查詢目的地址B轉(zhuǎn)換后的目的地址A;
b.查找目的地址A查詢到達(dá)A的下一跳C;
c.將到達(dá)B的下一條設(shè)置到C。

       我們看到在outside上,即PRE-ROUTING上做源地址轉(zhuǎn)換確實(shí)會(huì)有問題,但是可以通過(guò)add-route參數(shù)進(jìn)行路由重新映射來(lái)解決之。正常合理的情況就是在inside上,即POST-ROUTING上做源地址轉(zhuǎn)換。事實(shí)上,我們雖然在做源地址轉(zhuǎn)換,但是問題總是出在反向數(shù)據(jù)包的目標(biāo)地址轉(zhuǎn)換上,合理的情況就是要將目標(biāo)地址轉(zhuǎn)換放在路由之前進(jìn)行,反推正向數(shù)據(jù),那就是將源地址轉(zhuǎn)換放在路由之后進(jìn)行,如果不了解Cisco Domain概念的話,一定會(huì)認(rèn)為:不要在outside上作源地址轉(zhuǎn)換!
       目前為止,我來(lái)總結(jié)一下。Cisco完全割裂了路由和NAT的關(guān)系,不像Linux那樣DNAT永遠(yuǎn)在路由之前進(jìn)行,不管是配置的DNAT,還是SNAT的反向DNAT,都在路由前,這樣就可以針對(duì)轉(zhuǎn)換后的目標(biāo)地址做路由查詢,如果這么理解是對(duì)的,你會(huì)驚訝,Cisco竟然可以在PREROUTING(outside)做SNAT(ip nat outside source),導(dǎo)致反向包在POSTROUTING做DNAT...但是事情不是這么簡(jiǎn)單!
       Cisco不會(huì)由于犯錯(cuò)而設(shè)計(jì)出如此不合理又容易把人搞暈的NAT架構(gòu)的,它這么設(shè)計(jì)必然有自己的理由,是什么理由呢?下面2,3兩小節(jié)給出了一些提示。

2.關(guān)于policy routing

我們知道,標(biāo)準(zhǔn)的IP路由是基于目標(biāo)地址的,但是為了增加更多的策略,policy routing可以用源地址來(lái)影響路由查詢結(jié)果。在這種意義上,源地址轉(zhuǎn)換在路由之前就是必要的,然而這樣就會(huì)導(dǎo)致反向的目標(biāo)地址地址轉(zhuǎn)換發(fā)生在路由之后!到底是:
a.為了policy routing將SNAT置于路由之前
b.為了不必add-route(雖然它確實(shí)不是什么問題,而且是自動(dòng)的),將DNAT置于路由之前

需要一個(gè)權(quán)衡!然而Cisco不像Linux那樣去對(duì)稱設(shè)計(jì)那5個(gè)HOOK點(diǎn),Cisco的方式就劃分Domain的,即inside和outside

3.關(guān)于Domain和NAT domain

Cisco設(shè)備一般連接兩種網(wǎng)絡(luò)環(huán)境,一種是自己內(nèi)部的,另一種是外部公共的,這就將接口分為了兩個(gè)域,一個(gè)是內(nèi)部域,即inside,另外一種為外部域,即outside!這種分法的名字叫得特別好,以至于它被用在了很多的領(lǐng)域,比如nat,然而一旦用在了nat方面,就讓人糊涂了。因此我提議,對(duì)Cisco架構(gòu)不是很理解的,請(qǐng)嘗試用POST/PRE ROUTING來(lái)理解inside和outside。但是本小節(jié)想做的就是闡明使用inside和outside是合理的。
       對(duì)于NAT來(lái)講,轉(zhuǎn)換的是IP地址,而IP地址可以分為Global地址以及Local地址,前者是公網(wǎng)可路由的地址,后者是私有地址。從inside域到outside域,需要將所有的Local地址轉(zhuǎn)換為Global地址,一個(gè)首要原則就是,Global的地址在未經(jīng)允許是不能出現(xiàn)在inside域和DMZ域(路由器可能沒有)的!決策點(diǎn)就是路由!因此outside到inside方向的地址轉(zhuǎn)換必然要在路由之前完成。這就要求inside到outside方向的地址轉(zhuǎn)換必然要在路由之后完成。即:
ip nat inside source
必然發(fā)生在路由之后,而:
ip nat outside source
必然發(fā)生在路由之前。
如果你定義了某個(gè)接口比如FE0/0為outside,那么需要在接口上使能ip nat outside,這樣的話,從該接口進(jìn)入的包就會(huì)在路由之前去查詢NAT表,如果找到對(duì)應(yīng)的表項(xiàng),就會(huì)執(zhí)行NAT。同理如果定義某接口比如FE0/1為inside,那么需要在接口上使能ip nat inside,這樣的話,從該接口進(jìn)入的包先執(zhí)行路由查找,然后去查詢NAT表,如果找到對(duì)應(yīng)的表項(xiàng),則執(zhí)行NAT操作。

3.1.轉(zhuǎn)換方向以及轉(zhuǎn)換點(diǎn)-Cisco NAT的設(shè)計(jì)

這個(gè)小節(jié)涉及到了對(duì)Domain的使用以及如何解讀ip nat inside|outside source|destination命令。本小節(jié)總結(jié)了Cisco NAT設(shè)計(jì)的終極理論。為了簡(jiǎn)單,我不再引入Cisco定義的那四種地址以及它們和源/目標(biāo)IP地址,方向的關(guān)聯(lián),這些概念都是額外的概念,最容易使人跑偏而最終陷進(jìn)去。
       Cisco沒有像Linux那樣使用“pre/post路由”這么技術(shù)化的術(shù)語(yǔ)來(lái)定義NAT的行為,而是完全根據(jù)Domain來(lái)定義,所謂的Domain,即路由器兩邊一邊屬于inside,另一邊屬于outside。那么所有的NAT無(wú)外乎就以下4種類型:
1>從inside到outside時(shí)轉(zhuǎn)換源地址
2>從inside到outside時(shí)轉(zhuǎn)換目標(biāo)地址
3>從outside到inside時(shí)轉(zhuǎn)換源地址
4>從outside到inside時(shí)轉(zhuǎn)換目標(biāo)地址

其中1和4互相隱含,2和3互相隱含。到此為止,我們發(fā)現(xiàn)Cisco的NAT并沒有像Linux那么簡(jiǎn)單,Linux實(shí)際上就定義了兩種NAT,即:
i> SNAT,源地址轉(zhuǎn)換
ii>DNAT,目標(biāo)地址轉(zhuǎn)換

然后其它的約束都是設(shè)計(jì)的時(shí)候內(nèi)置的:
路由前執(zhí)行DNAT,路由后執(zhí)行SNAT,包含隱含規(guī)則。
這就是Cisco和Linux的NAT設(shè)計(jì)的終極區(qū)別!它們側(cè)重點(diǎn)不同,Cisco強(qiáng)調(diào)使用者的使用域,Linux強(qiáng)調(diào)技術(shù)本身的合理性(如何配置就需要發(fā)揮想象力了)。我們先看一下Linux的NAT設(shè)計(jì)基準(zhǔn)是什么。Linux的NAT是全局生效的,沒有“將NAT應(yīng)用于接口”的說(shuō)法,因此接口就成了一個(gè)match。因此管理員只需要寫match/target就可以了。

       對(duì)于Cisco而言,為了將4種NAT配置界面全部導(dǎo)出給工程師,需要一個(gè)前提操作,那就是定義inside接口和outside接口,即在哪個(gè)接口上應(yīng)用inside nat,在哪個(gè)接口上應(yīng)用outside nat。到此,所有的4種NAT都必須能和任意類型(inside/outside)的接口單獨(dú)組合。這就打破了平衡點(diǎn),變成了馬鞍面,你無(wú)法找到一個(gè)點(diǎn),在PRE ROUTING和POST ROUTING中完成一切,舉例,如果接口E1使能inside nat,E0使能outside nat,說(shuō)明E1是inside接口,E0是outside接口,那么我們考慮從inside到outside方向的兩種轉(zhuǎn)換,一種是轉(zhuǎn)換源地址,另一種是轉(zhuǎn)換目標(biāo)地址,我們把它們放在一個(gè)位置還是放在一個(gè)“虛擬的平衡點(diǎn)”(不一定是routing)兩邊,即兩個(gè)位置呢?我們看下面的兩個(gè)圖,實(shí)際上代表了兩種約束:


徹底理解Cisco NAT內(nèi)部的一些事


徹底理解Cisco NAT內(nèi)部的一些事




這兩個(gè)圖展開后是個(gè)典型的馬鞍面,原點(diǎn)就是路由,之所以要有個(gè)原點(diǎn),是因?yàn)榛贒omain的配置中,數(shù)據(jù)包從inside到outside或者反過(guò)來(lái)必然要經(jīng)過(guò)一個(gè)點(diǎn),從本文最上面的那幅Cisco網(wǎng)站上的圖,我們看到基于Domain的NAT行為不僅僅是一個(gè)NAT,它需要和ACL匹配,加解密等操作聯(lián)動(dòng),這些操作所依賴的IP地址和NAT發(fā)生了關(guān)聯(lián),因此基于Domain的NAT行為一定要位于路由行為的兩邊。由于Cisco是按照Domain即inside/outside來(lái)進(jìn)行配置的(在接口上應(yīng)用特定Domain的規(guī)則),因此必然是這種設(shè)計(jì)方式,而對(duì)于Linux,NAT是全局的,接口只是一個(gè)match而已,因此就完全按照路由的約束來(lái)設(shè)計(jì)。
       現(xiàn)在,我們可以來(lái)總結(jié)一下ip nat inside|outside source|destination的含義了。我把這個(gè)命令公式化:
ip nat P H
其中H代表要做源轉(zhuǎn)換還是要做目標(biāo)轉(zhuǎn)換,H還有一個(gè)更加隱蔽的含義,那就是它和P指名了數(shù)據(jù)的方向,也就是說(shuō):數(shù)據(jù)是以P為H的。舉例,ip nat inside destination表示數(shù)據(jù)是以inside為目標(biāo)的(來(lái)自outside),做目標(biāo)地址轉(zhuǎn)換;ip nat outside source表示數(shù)據(jù)是以outside為源發(fā)往inside的,做源地址轉(zhuǎn)換。

4.Cisco的destination轉(zhuǎn)換

但是,但是如何對(duì)目標(biāo)地址進(jìn)行轉(zhuǎn)換,即將訪問一個(gè)公共Global地址時(shí),將其轉(zhuǎn)到一個(gè)內(nèi)部的Local地址,這就是目的地址轉(zhuǎn)換,也叫地址映射,Cisco如何來(lái)做呢?實(shí)際上,很多Cisco設(shè)備的ISO版本不允許你像Linux那樣無(wú)限制做DNAT,而僅僅允許映射特定的IP地址+TCP/UDP端口對(duì)或者全I(xiàn)P。這肯定是在outside上做目標(biāo)地址轉(zhuǎn)換了,在相反的方向就是在inside上做源地址轉(zhuǎn)換,即:
ip nat inside source static tcp $local_ip $local_port $global_ip $global_port
注意,必須是static的NAT,這涉及到下一節(jié)要說(shuō)的“如何安裝NAT”
       對(duì)于TCP負(fù)載均衡做的ip nat inside destination這種定制化的NAT則不在本文討論范圍內(nèi)。

二.如何安裝NAT

0.風(fēng)格

Linux的NAT是基于5元組的,也就是NAT結(jié)果和一個(gè)流(conntrack)關(guān)聯(lián)在一起,這種關(guān)聯(lián)導(dǎo)致同屬于一個(gè)五元組的一個(gè)流的所有數(shù)據(jù)包的NAT策略必須一致,對(duì)于這一硬性規(guī)定有點(diǎn)太強(qiáng)硬了,因此我在Linux上做了好幾個(gè)補(bǔ)丁來(lái)彌補(bǔ)Linux的不足,當(dāng)然也可以用RAWNAT。
       對(duì)于Cisco,NAT不和一個(gè)流關(guān)聯(lián),除非是Stateful的。既然不和流關(guān)聯(lián),那么如何做呢?Cisco會(huì)在特定的時(shí)間將“一條NAT映射策略”安裝到系統(tǒng)的inside NAT表或者outside NAT表中,對(duì)于從網(wǎng)口進(jìn)入的數(shù)據(jù)包,會(huì)根據(jù)網(wǎng)口是inside還是outside去匹配inside NAT表或者outside NAT表中的NAT規(guī)則,僅此而已。
       不管是inside NAT表還是outside NAT表,都各有兩張,一張是SNAT表,另一張是DNAT表,NAT表的拍腦袋想出的數(shù)據(jù)結(jié)構(gòu)可以是:

NAT table {
type:SNAT or DNAT
direction:inside or outside
nodes:local/global mapping
}


對(duì)于每一個(gè)數(shù)據(jù)包,都要用源IP地址去查詢SNAT表,用目標(biāo)IP地址去查詢DNAT表。然而對(duì)于Linux而言,需要的僅僅是查詢conntrack結(jié)構(gòu),然后取出第一個(gè)包查詢時(shí)記錄于此的nat結(jié)果。

1.靜態(tài)NAT

靜態(tài)NAT就是一個(gè)一對(duì)一的NAT映射,也就是一個(gè)Local IP地址和一個(gè)Global IP地址之間的轉(zhuǎn)換。在配置生效的時(shí)候,NAT轉(zhuǎn)換規(guī)則就會(huì)被添加到NAT表中。

1.1.Cisco方式

當(dāng)在inside方向上添加了一條NAT:
ip nat inside source static a b
系統(tǒng)會(huì)將a->b的源地址轉(zhuǎn)換加入到inside的SNAT表中,同時(shí)將b->a的目標(biāo)地址轉(zhuǎn)換加入到outside的DNAT表中。
       針對(duì)后面的所有數(shù)據(jù)包,不管是從內(nèi)部發(fā)起的,還是從外部發(fā)起的,都會(huì)根據(jù)接口使能的是inside nat還是outside nat來(lái)查表匹配。

1.2.Linux方式

Linux基于conntrack,因此即使你使用
iptables -t nat -A POSTROUTING -s a -j SNAT --to-source b
也只針對(duì)匹配該策略的第一個(gè)數(shù)據(jù)包,Linux的NAT的轉(zhuǎn)換一方a是作為一個(gè)match出現(xiàn)的,因此它嚴(yán)格匹配第一個(gè)包的源地址,故反方向的數(shù)據(jù)包不會(huì)匹配,因此Linux的NAT都是單向的。

2.動(dòng)態(tài)NAT

動(dòng)態(tài)NAT不在配置的時(shí)候規(guī)定轉(zhuǎn)換后的地址,而在第一個(gè)有轉(zhuǎn)換需求(由ACL來(lái)判斷)的數(shù)據(jù)包到來(lái)的時(shí)候才確定它要轉(zhuǎn)換成什么地址。因此,配置生效的時(shí)候,沒有任何NAT規(guī)則會(huì)被加入到NAT表中。

2.1.Cisco方式

當(dāng)在inside方向添加了一條動(dòng)態(tài)NAT:
ip nat pool NAME ...
ip nat inside source list $acl pool NAME
...

系統(tǒng)不會(huì)添加任何NAT規(guī)則,只有當(dāng)某一個(gè)包匹配到了acl,要引發(fā)NAT的時(shí)候,系統(tǒng)會(huì)動(dòng)態(tài)(基于pool類型來(lái)計(jì)算)從pool中選一個(gè)要轉(zhuǎn)換成的IP地址,將其添加入inside的SNAT表中,同時(shí)針對(duì)反方向的目標(biāo)地址轉(zhuǎn)換規(guī)則生成并加入outside的DNAT表中。
       因此,Cisco動(dòng)態(tài)的NAT是單向的,因此反向的數(shù)據(jù)包進(jìn)入時(shí)不會(huì)匹配到acl,不會(huì)引發(fā)NAT規(guī)則的生成,也就不會(huì)匹配到任何NAT規(guī)則。

2.2.Linux方式

再次重申,Linux的nat中,待轉(zhuǎn)換的IP地址是一個(gè)match,因此不管是一對(duì)一的轉(zhuǎn)換還是一對(duì)多的轉(zhuǎn)換,原理都是一樣的。Linux并不區(qū)分靜態(tài)轉(zhuǎn)換和動(dòng)態(tài)轉(zhuǎn)換。在內(nèi)核中,永遠(yuǎn)都不會(huì)出現(xiàn)所謂的NAT映射表,iptables添加的NAT規(guī)則不會(huì)生成映射,數(shù)據(jù)包進(jìn)入匹配nat成功,也不會(huì)生成映射,nat結(jié)果僅僅存在于conntrack中作為tuple的一部分體現(xiàn)。

3.查詢方式

3.1.Linux方式

Linux的nat查詢對(duì)于第一個(gè)包是逐條匹配iptables nat表規(guī)則,對(duì)于后續(xù)的包,則轉(zhuǎn)化為針對(duì)五元組的conntrack哈希查詢。

3.2.Cisco方式

對(duì)于Cisco而言,不像Linux那樣PREROUTING處僅僅發(fā)生DNAT,POSTROUTING處僅僅發(fā)生SNAT,而是不管在PREROUTING還是在POSTROUTING,均可能發(fā)生SNAT和DNAT,因此不管在哪個(gè)nat HOOK point,均要用數(shù)據(jù)包的源IP地址和目標(biāo)IP地址分別來(lái)查詢SNAT表和DNAT表。既然這么對(duì)稱,那么就可以將這個(gè)查詢過(guò)程抽象出來(lái),使之成為一個(gè)獨(dú)立的虛擬接口,是為NVI!

三.使用NVI虛擬接口

0.虛擬接口理念

這個(gè)就不說(shuō)了。Open×××的tap,Cisco IPSec ×××的VTI,包括下文描述的NVI,都屬于虛擬接口,并且所有的虛擬接口都可以通過(guò)路由的方式將數(shù)據(jù)包導(dǎo)入進(jìn)去,至于在里面執(zhí)行什么操作,這就是虛擬接口“虛擬”的地方,可以將數(shù)據(jù)包導(dǎo)出到字符設(shè)備,也可以加解密,當(dāng)然也可以做NAT...

1.Linux 2.4的nat route

Linux 2.4的nat route依賴于policy routing,超級(jí)失敗,還沒有我自己寫的好,《又一個(gè)Linux的雙向stateless NAThttp://blog.csdn.net/dog250/article/details/8996666》詳細(xì)介紹了實(shí)現(xiàn)方法。

2.Cisco的domainless NAT

Domainless就是說(shuō)不再區(qū)分inside和outside,只是單純地做NAT,這個(gè)在Cisco中實(shí)現(xiàn)得熱別清爽,沒有用所謂的平衡點(diǎn),進(jìn)而兩個(gè)方向NAT的處理HOOK點(diǎn)也不再基于平衡點(diǎn)對(duì)稱,所有的NAT操作全部在PREROUTING上做,然而Cisco并沒有用增加配置,掛接HOOK的方式實(shí)現(xiàn),而是用一個(gè)叫做NAT  Virtual Interface的虛擬接口來(lái)實(shí)現(xiàn),這樣有什么好處呢?說(shuō)實(shí)話,從界面上看不出來(lái),但是從其實(shí)現(xiàn)角度,就可以通過(guò)路由的方式將帶有ip nat enable配置的接口進(jìn)來(lái)的包全部導(dǎo)入這個(gè)虛擬接口NVI0中。然后用數(shù)據(jù)包的源地址和目標(biāo)地址分別查詢SNAT表和DNAT表,根據(jù)結(jié)果進(jìn)行NAT操作,隨后進(jìn)入真正的路由查詢,整體流程如下圖所示:


徹底理解Cisco NAT內(nèi)部的一些事


可見,不管方向,不管路由,只要數(shù)據(jù)包進(jìn)入了一塊帶有ip nat enable配置的物理網(wǎng)卡,就會(huì)進(jìn)行NAT匹配以及匹配成功后的操作,不管是SNAT和DNAT都在這里進(jìn)行。這個(gè)實(shí)現(xiàn)雖然很豪放,但是卻解決了所有問題,平衡點(diǎn)的問題不存在了,數(shù)據(jù)包在進(jìn)入真正的路由查詢前,NAT就已經(jīng)完成了,在路由器看來(lái),NAT操作被藏起來(lái)了,就好像數(shù)據(jù)包本來(lái)就是那個(gè)樣子一樣。
       當(dāng)然Domainless的NAT也不再和任何其它操作關(guān)聯(lián),ACL,×××感興趣流匹配,policy routing等都和NAT無(wú)關(guān)。Cisco Domainless的NAT設(shè)計(jì)和Linux的NAT設(shè)備區(qū)別更加明顯,雖然Linux的NAT也是Domainless的,但是在設(shè)計(jì)上卻和Cisco基于Domain的NAT很像,因?yàn)槎叩腘AT都要和其它的Filter操作聯(lián)動(dòng),對(duì)于Linux,NAT行為需要和大量的Netfilter行為聯(lián)動(dòng)。

四.總結(jié)和想法

通過(guò)使用Cisco的NAT,我有一些自己的想法,需要暫時(shí)記錄下來(lái)。

1.和微軟的關(guān)系,和自由的關(guān)系

我配置Cisco的時(shí)候,有種使用微軟系統(tǒng)的感覺。遇到瓶頸的時(shí)候,束手無(wú)策!在微軟的系統(tǒng)上,我想做單臂NAT,我想配置路由的時(shí)候帶上source,折騰了好久都未果,配置Cisco的時(shí)候,同樣的感覺!雖然有時(shí)候,高一點(diǎn)的IOS版本確實(shí)能解決問題(這是和微軟一樣的)??偟膩?lái)講,使用這些東西讓你感覺不自由,能HACK的地方實(shí)在太少,HACK操作門檻太高,使用它們時(shí),你要一直提心吊膽,你要么一氣呵成,只要是碰到了攔路虎,哪怕多么小的攔路虎,你可能都過(guò)不去。
       Linux正好是事情的另一面,UNIX處在中間。在Linux上操作,你的任何行為都不會(huì)受到阻礙,即使碰到了問題,系統(tǒng)不會(huì)阻礙你去編寫一個(gè)程序或者內(nèi)核模塊,甚至重新訂制內(nèi)核。即使不這么深入,光看一下iproute2以及iptables就夠了,本身自帶的參數(shù)就能讓你完成幾乎所有的操作,在這個(gè)意義上,習(xí)慣了Linux的人可能也會(huì)苛求Cisco的擴(kuò)展訪問控制列表更加優(yōu)秀一些,實(shí)際上,面對(duì)Netfilter的幾乎無(wú)限的擴(kuò)展能力,Cisco的擴(kuò)展訪問控制列表的“擴(kuò)展”體現(xiàn)在哪里呢??
       我買手機(jī)不是來(lái)hack的,我也不寫代碼安裝在手機(jī)上,我僅僅是想用它來(lái)打電話,發(fā)信息,上網(wǎng),所以我不買Android,由于價(jià)值觀相差甚遠(yuǎn),我不買和微軟有任何關(guān)聯(lián)的手機(jī),不管它有多好,買了iOS是因?yàn)樗蚒NIX有關(guān)聯(lián),事實(shí)上,蘋果很封閉,但是它的封閉不是技術(shù)本身,而是價(jià)值取向和設(shè)計(jì),事實(shí)上,也正是因?yàn)樗忾]的不是技術(shù),才有了越獄之說(shuō),越獄之后,你將面對(duì)一個(gè)原汁原味的開放的UNIX。開放是金,開放就是一切。

2.功能性技術(shù)點(diǎn)和解決方案

如果碰到問題,當(dāng)然要想辦法去解決問題了,此時(shí)就有兩條路,第一條路就是尋找單獨(dú)解決該問題的功能性技術(shù)點(diǎn),比如你想在做一個(gè)基于ACL的地址映射,如果你用的是Linux BOX,那么這個(gè)功能性技術(shù)點(diǎn)就是iptables,但是如果你用的是Cisco低端路由器,那么就無(wú)法做這件事,文檔明確說(shuō)不支持。此時(shí)就是第二條路了,那就是徹底否定最初的方案,說(shuō)一句:“為何要這么做呢?XX會(huì)更好的。我們有整套的解決方案,滿足你的所有需求。”。一般的像Cisco,微軟,IBM都會(huì)提供解決方案,它們的系統(tǒng)上的功能性技術(shù)點(diǎn)往往都有短板,單獨(dú)拿來(lái)用很雞肋,只有和其它的配合才可以。因此,想hack的,千萬(wàn)別基于這些系統(tǒng),你會(huì)煩死的,在這些系統(tǒng)上,這也不行,那也不行,這個(gè)不能變通,那個(gè)不能變通,用多了,人也就死板了,說(shuō)話也就不好聽了,“技術(shù)上的任何問題都是可以解決的”這句話到了使用這些封閉系統(tǒng)的人那里就成了“這是不可能的?。。 ?br />

3.人員沖突

一周以來(lái),我跟人沖突好幾次,完事后還是證明我的想法是正確的,所以再次讓我感到大多數(shù)所謂的高級(jí)網(wǎng)管員的水平是多么的垃圾,水平垃圾個(gè)性還一個(gè)個(gè)都挺狂妄,這實(shí)在讓人氣憤和悲哀。這些垃圾人員的觀點(diǎn)基本分為兩類:
1>沒有做過(guò)的事情就說(shuō)不可能
因?yàn)橐郧皬膩?lái)沒有這么做過(guò),就說(shuō)不可能,甚至否定我的技術(shù)方案。我是作為研發(fā)出現(xiàn)的,這就更讓對(duì)方覺得我根本就不懂網(wǎng)絡(luò),沒有經(jīng)驗(yàn)等,第一他們沒做過(guò),第二我沒網(wǎng)絡(luò)方面的職稱,這就更讓他們狂妄無(wú)比。
2>想當(dāng)然的事情就拍腦袋說(shuō)可以,實(shí)際上根本就不可以
我說(shuō)要把udp服務(wù)一對(duì)一雙向映射出去:
ip nat inside source udp 1.1.1.1 12345 2.2.2.2 12345
在測(cè)試的時(shí)候,他們非要用ping來(lái)測(cè)試!這個(gè)明明是一個(gè)udp的映射,怎么用ping?!然而他們非要用ping,我告訴他們不能做全映射,因?yàn)闀?huì)把不相干的不該轉(zhuǎn)換的地址也轉(zhuǎn)換了,因?yàn)樗麄冎繬AT可以通過(guò)ACL+pool來(lái)做,所以他們就認(rèn)為這個(gè)可以在outside口用ACL匹配地址來(lái)做...這幫×××!我要做目標(biāo)地址轉(zhuǎn)換,還得是雙向的,也就是說(shuō)不管數(shù)據(jù)流從那邊發(fā)起都是可以的!那幫人連NAT轉(zhuǎn)換項(xiàng)什么時(shí)候安裝進(jìn)系統(tǒng)的都不知道!
       這些人還好意思說(shuō)自己是網(wǎng)絡(luò)工程師??!看看我們的那些NA/NP/IE/NE/SE們,無(wú)一例外的就是靠背題的,好多證書都拿到手了,卻連網(wǎng)絡(luò)的基本原理都TMD不懂!再看看那些真正的CCIE,比如Petr Lapukhov, 4xCCIE/CCDE in CCIE R&S,IP Services:
Petr Lapukhov's career in IT begain in 1988 with a focus on computer programming, and progressed into networking with his first exposure to Novell NetWare in 1991. Initially involved with Kazan State University's campus network support and UNIX system administration, he went through the path of becoming a networking consultant, taking part in many network deployment projects. Petr currently has over 12 years of experience working in the Cisco networking field, and is the only person in the world to have obtained four CCIEs in under two years, passing each on his first attempt. Petr is an exceptional case in that he has been working with all of the technologies covered in his four CCIE tracks (R&S, Security, SP, and Voice) on a daily basis for many years. When not actively teaching classes, developing self-paced products, studying for the CCDE Practical & the CCIE Storage Lab Exam, and completing his PhD in Applied Mathematics.
看看人家的經(jīng)歷,從編程開始,逐步深入,從計(jì)算機(jī)體系結(jié)構(gòu),TCP/IP棧,到UNIX,最終,Cisco只是大師將這一切附著的一個(gè)平臺(tái)而已,如果他不是在Cisco上工作,而是加入IBM的陣營(yíng),或者去開發(fā)Linux內(nèi)核,你能說(shuō)人家不是圈子里的人嗎?記住,別把編程的人看作不懂網(wǎng)絡(luò)的。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI