一、背景知識(shí)簡(jiǎn)介
? ? ? ? 我們?nèi)粘<矣谩⑥k公的網(wǎng)絡(luò)基本都是在一個(gè)路由器下的局域網(wǎng)里,網(wǎng)絡(luò)結(jié)構(gòu)往往是這樣的:
外網(wǎng)——光貓——路由器Wan口——路由器Lan口{局域網(wǎng){局域網(wǎng)設(shè)備1……局域網(wǎng)設(shè)備N}}
這樣的結(jié)構(gòu)工作過(guò)程是這樣的:
????????光貓通過(guò)光纖連接到網(wǎng)絡(luò)運(yùn)營(yíng)商(常見(jiàn)的是移動(dòng)聯(lián)通電信)的撥號(hào)服務(wù)器;
????????路由器負(fù)責(zé)寬帶撥號(hào)(路由器的wan口設(shè)置里有寬帶賬號(hào),每次路由器啟動(dòng)會(huì)自動(dòng)撥號(hào)——當(dāng)然也可以到路由器的設(shè)置頁(yè)面里把自動(dòng)撥號(hào)設(shè)置為手動(dòng)撥號(hào),但絕大多數(shù)情況下沒(méi)人這么做);
????????路由器寬帶撥號(hào)成功之后,運(yùn)營(yíng)商的撥號(hào)服務(wù)器會(huì)給路由器設(shè)置一個(gè)公網(wǎng)IP地址。
????????前面是路由器跟外網(wǎng)之間的交互,在路由器組建的內(nèi)網(wǎng)中,他還會(huì)做一些局域網(wǎng)的基礎(chǔ)管理工作,這些基礎(chǔ)工作跟外網(wǎng)沒(méi)關(guān)系,也就是說(shuō),無(wú)論路由器的wan口是否撥號(hào)成功,都不影響他做一些基礎(chǔ)的局域網(wǎng)管理工作:
? ? ? ? DHCP服務(wù)器——大多數(shù)情況下路由器都會(huì)把自己作為它所管理的局域網(wǎng)中的DHCP服務(wù)器,DHCP服務(wù)器開起來(lái)之后,通過(guò)網(wǎng)線連接到路由器上的電腦等設(shè)備、通過(guò)無(wú)線網(wǎng)絡(luò)連接到路由器上的手機(jī)筆記本iPad等設(shè)備都會(huì)作為一個(gè)DHCP客戶端來(lái)向路由器報(bào)道,然后路由器會(huì)根據(jù)自己的局域網(wǎng)IP分配記錄來(lái)給每個(gè)新報(bào)道的設(shè)備分配一個(gè)內(nèi)網(wǎng)的IP地址,并將這個(gè)IP地址再記錄在路由器自己的IP分配記錄中,以防將同一個(gè)IP地址分配給不同的設(shè)備導(dǎo)致局域網(wǎng)IP地址沖突。
? ? ? ? 路由器將這些基礎(chǔ)工作做完之后,局域網(wǎng)內(nèi)的設(shè)備就可以通過(guò)路由器和外網(wǎng)的設(shè)備進(jìn)行通信了。但是,在外網(wǎng)看來(lái),內(nèi)網(wǎng)的這些所有的設(shè)備的公網(wǎng)IP都是相同的。當(dāng)內(nèi)網(wǎng)的設(shè)備主動(dòng)發(fā)起外網(wǎng)連接請(qǐng)求的時(shí)候,路由器是可以知道這個(gè)請(qǐng)求到底是局域網(wǎng)內(nèi)哪臺(tái)設(shè)備發(fā)起的,到時(shí)候外網(wǎng)設(shè)備對(duì)這個(gè)請(qǐng)求進(jìn)行響應(yīng)的時(shí)候,路由器也是可以知道到底該把這個(gè)相應(yīng)返回給哪臺(tái)設(shè)備的。這里牽扯到NAT的知識(shí),不展開了。
????????但是,反過(guò)來(lái),如果是外網(wǎng)某臺(tái)設(shè)備想要主動(dòng)連接局域網(wǎng)內(nèi)某臺(tái)設(shè)備呢,怎么辦?眾所周知,網(wǎng)絡(luò)連接都是基于tcp/IP協(xié)議的,建立的連接可以是tcp或udp,但無(wú)論是tcp還是udp,都離不開4要素:源地址+源端口——目的地址+目的端口。現(xiàn)在外網(wǎng)的設(shè)備作為源IP,他在知道了目的IP和端口的情況下,用源IP+源端口向目的IP+目的端口發(fā)起請(qǐng)求的時(shí)候,負(fù)責(zé)管理目標(biāo)設(shè)備的路由器是能接收到這個(gè)目的請(qǐng)求的,因?yàn)樗膚an口IP地址就是這個(gè)目的IP,但他不知道的是,這個(gè)目的端口號(hào)具體是局域網(wǎng)內(nèi)哪臺(tái)設(shè)備上的端口號(hào)。這樣,他不知道的情況下,就會(huì)掛起這個(gè)請(qǐng)求,直到超時(shí)無(wú)響應(yīng),導(dǎo)致源設(shè)備發(fā)起的這個(gè)請(qǐng)求失敗。
? ? ? ? 所以,在這種應(yīng)用場(chǎng)景下,只要解決了讓路由器能清楚的知道”來(lái)自互聯(lián)網(wǎng)上向XXX端口發(fā)起的請(qǐng)求,就把這個(gè)請(qǐng)求發(fā)往局域網(wǎng)中IP為AAA的設(shè)備上的NNN端口“即可。
? ? ? ? 這個(gè)功能,就是所謂的端口映射——把來(lái)自外網(wǎng)的XX端口的請(qǐng)求,映射到內(nèi)網(wǎng)的某臺(tái)設(shè)備的NN端口。要注意的是,外網(wǎng)請(qǐng)求連接到是XX端口,路由器將請(qǐng)求映射到的是某設(shè)備的NN端口,這個(gè)XX和NN不一定非得一樣,完全可以自定義(tcp/IP協(xié)議規(guī)定端口號(hào)范圍是0-65535),也就是說(shuō),你在外網(wǎng)的設(shè)備上有個(gè)軟件,可以向路由器所在的IP上發(fā)起端口號(hào)為100的請(qǐng)求,路由器里設(shè)置的端口映射是把來(lái)自外網(wǎng)請(qǐng)求100端口號(hào)的連接映射到內(nèi)網(wǎng)IP為192.168.1.2設(shè)備的200端口上,也是可以的,在外網(wǎng)的設(shè)備上看,跟它通信的是路由器所在的IP+100,而在內(nèi)網(wǎng)的192.168.1.2上看,他接受請(qǐng)求的端口是200,跟他通信的IP是192.168.1.1(假設(shè)路由器的局域網(wǎng)IP是192.168.1.1)。
? ? ? ? 這樣一番操作之后,內(nèi)網(wǎng)和外網(wǎng)就這樣被路由器所分隔開了:外網(wǎng)的設(shè)備只能看到路由器;路由器下局域網(wǎng)內(nèi)的設(shè)備也只能看到路由器(也就是網(wǎng)管)以及局域網(wǎng)內(nèi)的其他設(shè)備。
? ? ? ? 明白了以上的道理,端口映射該怎樣設(shè)置也就很清楚了,只是針對(duì)不同的路由器可能在操作上有些不同細(xì)微的差別,但不會(huì)相差很多,因?yàn)樾枰蚵酚善髡f(shuō)明的無(wú)非是:1.需要將外網(wǎng)來(lái)的哪個(gè)端口進(jìn)行映射;2.需要將外網(wǎng)來(lái)的這個(gè)端口的請(qǐng)求轉(zhuǎn)發(fā)給本局域網(wǎng)的哪個(gè)IP;3.需要將這個(gè)端口的請(qǐng)求轉(zhuǎn)發(fā)給這個(gè)IP地址的哪個(gè)端口。(某些腦殘路由器設(shè)置里竟然還有4.需要手動(dòng)選擇有且只有一個(gè)的選項(xiàng):wan口,也就是需要向路由器說(shuō)明一下,我是要將來(lái)自wan口的請(qǐng)求進(jìn)行映射,而不是要把lan口的請(qǐng)求進(jìn)行映射。。。真是腦殘?jiān)O(shè)計(jì))。接下來(lái),要做的就是:登錄路由器管理頁(yè)面,找到”端口映射“或”虛擬服務(wù)器“設(shè)置,添加映射規(guī)則,完事~
? ? ? ? 另外補(bǔ)充一點(diǎn),現(xiàn)實(shí)中一般都直接用dhcp來(lái)獲取局域網(wǎng)IP,而dhcp獲取到的IP是有租期的,當(dāng)租約到期之前斷開了與路由器的連接,然后租約到期后又重新連接,這時(shí)候dhcp可能會(huì)給設(shè)備重新分配另一個(gè)局域網(wǎng)IP,而不是之前的局域網(wǎng)IP了,這樣的話,之前設(shè)置的端口映射就失效了。要解決這個(gè)動(dòng)態(tài)局域網(wǎng)IP的問(wèn)題,就是在路由器dhcp設(shè)置里,把當(dāng)前設(shè)備的mac綁定靜態(tài)IP地址,這樣一來(lái),無(wú)論什么時(shí)候這個(gè)設(shè)備來(lái)向路由器請(qǐng)求局域網(wǎng)IP,路由器都會(huì)根據(jù)當(dāng)前設(shè)備的mac地址分配固定局域網(wǎng)IP,而端口映射里的規(guī)則也是永遠(yuǎn)指向這個(gè)IP,這樣,這條規(guī)則也會(huì)永遠(yuǎn)生效。
? ? ? ? 再補(bǔ)充一點(diǎn),多數(shù)路由器還會(huì)有一個(gè)dmz主機(jī)設(shè)置,這個(gè)設(shè)置的作用就是相當(dāng)于你把所有來(lái)自外網(wǎng)的請(qǐng)求(0-65535端口)全都映射到一臺(tái)主機(jī)的對(duì)應(yīng)的端口上(注意,是對(duì)應(yīng)映射,如果外網(wǎng)來(lái)的請(qǐng)求是連接100端口,那路由器會(huì)把這個(gè)100端口的請(qǐng)求轉(zhuǎn)發(fā)到指定IP的100端口,而無(wú)法自定義為其他端口)。
????????說(shuō)了這么多,可能還有小伙伴不太明白,下面我們?cè)儆靡粋€(gè)非常具體的實(shí)例來(lái)說(shuō)明一下。
? ? ? ? 一、小明家里的網(wǎng)絡(luò)結(jié)構(gòu):
外網(wǎng)——光纖——光貓——家路由器wan口——家路由器lan口——家電腦
1.1.家路由器里設(shè)置里寬帶撥號(hào),撥號(hào)成功后,寬帶運(yùn)營(yíng)商給家路由器分配了111.111.111.111這個(gè)IP地址;
1.2.小明對(duì)家路由進(jìn)行了設(shè)置:路由器自身局域網(wǎng)IP——192.168.1.1
1.3.小明家電腦通過(guò)網(wǎng)線連接路由器,家電腦網(wǎng)卡的mac地址為——00:AA:11:BB:22:CC:33:DD
1.4.小明對(duì)家路由進(jìn)行了設(shè)置:dhcp設(shè)置分配固定IP,將mac地址為00:AA:11:BB:22:CC:33:DD的設(shè)備分配固定IP192.168.1.2
1.5.小明對(duì)家路由進(jìn)行了設(shè)置:端口映射(進(jìn)行映射的是wan口來(lái)的5555端口;映射到的局域網(wǎng)IP是192.168.1.2;映射到192.168.1.2上的端口號(hào)是6666)
1.6.小明家電腦上開了個(gè)服務(wù)器軟件,服務(wù)器軟件監(jiān)聽(tīng)的是6666端口。(這個(gè)服務(wù)器具體是干啥的無(wú)所謂,可以是ftp,可以是http,可以是ssh服務(wù)端,可以是svn服務(wù)器……這些具體的服務(wù)器對(duì)外提供服務(wù),都是基于tcp/IP協(xié)議,在tcp/IP協(xié)議的基礎(chǔ)上,又做的應(yīng)用層協(xié)議。)
1.7小明家還有一部手機(jī),通過(guò)無(wú)線網(wǎng)連接到路由器,由于小明沒(méi)有在路由器的dhcp設(shè)置里對(duì)手機(jī)的mac地址進(jìn)行固定IP綁定,因此本次連接也獲取到IP了,192.168.1.3,但不敢說(shuō)下次這個(gè)手機(jī)再來(lái)連接路由器會(huì)不會(huì)還是獲取到192.168.1.3這個(gè)IP,還有可能是192.168.1.[4-255之間到任意一個(gè)]
? ? ? ? 二、小明公司辦公室的網(wǎng)絡(luò)結(jié)構(gòu):
外網(wǎng)——光纖——光貓——公司路由器wan口——公司路由器lan口——公司電腦
2.1公司路由器里設(shè)置里寬帶撥號(hào),撥號(hào)成功后,寬帶運(yùn)營(yíng)商給家路由器分配了222.222.222.222這個(gè)IP地址;
2.2公司路由器只做了基礎(chǔ)設(shè)置:公司路由器本身局域網(wǎng)IP——192.168.1.1(巧了,也是這個(gè),可能是同一家路由器廠商生產(chǎn)的路由器,也可能是國(guó)際慣例,也可能是小明就是公司的網(wǎng)絡(luò)管理員,他習(xí)慣于將局域網(wǎng)網(wǎng)關(guān)設(shè)置為這個(gè)IP,也可能……,不過(guò)無(wú)所謂,因?yàn)榧依锕緝蛇叾加新酚善鞯拇嬖?,兩邊的?nèi)網(wǎng)與外網(wǎng)是相互隔離的。也就是說(shuō)公司局域網(wǎng)是192.168.1.X,家里的局域網(wǎng)也可以是192.168.1.X,因?yàn)樗麄儽舜酥g無(wú)法直接看見(jiàn)對(duì)方,也因此,兩個(gè)局域網(wǎng)之間互不影響)
2.2公司電腦用網(wǎng)線連接公司路由器,由于沒(méi)特殊設(shè)置dhcp,電腦開機(jī)后,公司路由器根據(jù)當(dāng)前它自己的局域網(wǎng)分配記錄(之前有別的同事開機(jī),路由器已經(jīng)給小明同事們的電腦、手機(jī)等分別分配了IP地址了),給小明公司電腦分配了IP地址192.168.1.32
? ? ? ? 三、小明在公司里操作:
3.1小明在公司的電腦上打開了專用的客戶端,輸入家里路由器的公網(wǎng)IP地址(111.111.111.111),輸入路由器端口映射的觸發(fā)端口號(hào)(5555),客戶端軟件內(nèi)部固定了本地端口號(hào)7777,開始鏈接。
3.2公司電腦的網(wǎng)卡向路由器發(fā)送鏈接請(qǐng)求(111.111.111.111:5555)
3.3公司路由器接收到公司電腦發(fā)來(lái)的鏈接請(qǐng)求,并記錄下了內(nèi)網(wǎng)映射(192.168.1.32:7777——222.222.222.222:7777——111.111.111.111:5555)
3.4公司路由器用自己的公網(wǎng)IP+源端口號(hào)向外發(fā)送請(qǐng)求222.222.222.222:7777——111.111.111.111:5555
3.5公網(wǎng)設(shè)備找到了111.111.111.111,也就是家路由器的wan口,并把這個(gè)請(qǐng)求(222.222.222.222:7777——111.111.111.111:5555)發(fā)送到了家路由器wan口
3.6家路由器收到后,查詢端口映射,發(fā)現(xiàn)所有來(lái)自wan口5555端口的聯(lián)入請(qǐng)求都應(yīng)該轉(zhuǎn)發(fā)到家內(nèi)網(wǎng)的192.168.1.2這個(gè)IP的6666上,于是,記錄下了(222.222.222.222:7777——111.111.111.111:5555——192.168.1.2:6666),并將這個(gè)請(qǐng)求轉(zhuǎn)發(fā)給了192.168.1.2的5555端口。
3.7家電腦的服務(wù)端正在監(jiān)聽(tīng)5555端口,收到這個(gè)來(lái)自家路由器的請(qǐng)求后,反饋說(shuō)“收到”,也就是把“收到”回傳給路由器,路由器一看這個(gè)“收到”的消息是來(lái)自192.168.1.2:6666,查詢映射記錄得知,應(yīng)該將“收到”發(fā)送給111.111.111.111:5555,于是111.111.111.111:5555——222.222.222.222:7777
3.8公網(wǎng)設(shè)備找到222.222.222.222后,把消息發(fā)往222.222.222.222:7777
3.9公司路由收到來(lái)自111.111.111.111:5555的消息后,查詢,發(fā)現(xiàn)應(yīng)當(dāng)發(fā)給局域網(wǎng)192.168.1.32:7777
3.10公司電腦收到消息……
為了簡(jiǎn)單易懂,這里簡(jiǎn)化了大量的端口分配工作,實(shí)際上,客戶端發(fā)起請(qǐng)求的時(shí)候,端口號(hào)不一定是固定的;源端路由器進(jìn)行源端口nat轉(zhuǎn)換的時(shí)候,也不一定是用源端口往外發(fā)送;目標(biāo)端路由進(jìn)行內(nèi)網(wǎng)端口映射時(shí),與局域網(wǎng)端口通信的端口也不一定是跟觸發(fā)端口一樣。這里我之所以對(duì)應(yīng)起來(lái),是盡量簡(jiǎn)化模型,讓內(nèi)容更加容易理解。
原創(chuàng),未經(jīng)允許,不得轉(zhuǎn)發(fā)。千字千元,明碼標(biāo)價(jià)。