NAT的四種類型及類型檢測(cè),P2P打洞技術(shù)延伸

考慮到UDP的無(wú)狀態(tài)特性,目前針對(duì)其的NAT實(shí)現(xiàn)大致可分為Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四種。值得指出的是,對(duì)于TCP協(xié)議而言,一般來(lái)說(shuō),目前NAT中針對(duì)TCP的實(shí)現(xiàn)基本上是一致的,其間并不存在太大差異,這是因?yàn)門(mén)CP協(xié)議本身 便是面向連接的,因此無(wú)需考慮網(wǎng)絡(luò)連接無(wú)狀態(tài)所帶來(lái)復(fù)雜性。

用語(yǔ)定義

    1. 內(nèi)部Tuple:指內(nèi)部主機(jī)的私有地址和端口號(hào)所構(gòu)成的二元組,即內(nèi)部主機(jī)所發(fā)送報(bào)文的源地址、端口所構(gòu)成的二元組
    1. 外部Tuple:指內(nèi)部Tuple經(jīng)過(guò)NAT的源地址/端口轉(zhuǎn)換之后,所獲得的外部地址、端口所構(gòu)成的二元組,即外部主機(jī)收到經(jīng)NAT轉(zhuǎn)換之后的報(bào)文時(shí),它所看到的該報(bào)文的源地址(通常是NAT設(shè)備的地址)和源端口
    1. 目標(biāo)Tuple:指外部主機(jī)的地址、端口所構(gòu)成的二元組,即內(nèi)部主機(jī)所發(fā)送報(bào)文的目標(biāo)地址、端口所構(gòu)成的二元組

詳細(xì)釋義

    1. Full Cone NAT:“全錐形NAT”,所有來(lái)自同一 個(gè)內(nèi)部Tuple X的請(qǐng)求均被NAT轉(zhuǎn)換至同一個(gè)外部Tuple Y,而不管這些請(qǐng)求是不是屬于同一個(gè)應(yīng)用或者是多個(gè)應(yīng)用的。除此之外,當(dāng)X-Y的轉(zhuǎn)換關(guān)系建立之后,任意外部主機(jī)均可隨時(shí)將Y中的地址和端口作為目標(biāo)地址 和目標(biāo)端口,向內(nèi)部主機(jī)發(fā)送UDP報(bào)文,由于對(duì)外部請(qǐng)求的來(lái)源無(wú)任何限制,因此這種方式雖然足夠簡(jiǎn)單,但卻不那么安全
    1. Restricted Cone NAT: “限制錐形NAT”,它是Full Cone的受限版本:所有來(lái)自同一個(gè)內(nèi)部Tuple X的請(qǐng)求均被NAT轉(zhuǎn)換至同一個(gè)外部Tuple Y,這與Full Cone相同,但不同的是,只有當(dāng)內(nèi)部主機(jī)曾經(jīng)發(fā)送過(guò)報(bào)文給外部主機(jī)(假設(shè)其IP地址為Z)后,外部主機(jī)才能以Y中的信息作為目標(biāo)地址和目標(biāo)端口,向內(nèi)部 主機(jī)發(fā)送UDP請(qǐng)求報(bào)文,這意味著,NAT設(shè)備只向內(nèi)轉(zhuǎn)發(fā)(目標(biāo)地址/端口轉(zhuǎn)換)那些來(lái)自于當(dāng)前已知的外部主機(jī)的UDP報(bào)文,從而保障了外部請(qǐng)求來(lái)源的安 全性
    1. Port Restricted Cone NAT:“端口限制錐形NAT”,它是Restricted Cone NAT的進(jìn)一步受限版。只有當(dāng)內(nèi)部主機(jī)曾經(jīng)發(fā)送過(guò)報(bào)文給外部主機(jī)(假設(shè)其IP地址為Z且端口為P)之后,外部主機(jī)才能以Y中的信息作為目標(biāo)地址和目標(biāo)端 口,向內(nèi)部主機(jī)發(fā)送UDP報(bào)文,同時(shí),其請(qǐng)求報(bào)文的源端口必須為P,這一要求進(jìn)一步強(qiáng)化了對(duì)外部報(bào)文請(qǐng)求來(lái)源的限制,從而較Restrictd Cone更具安全性
    1. Symmetric NAT:“對(duì)稱型NAT”,這是一種比所有Cone NAT都要更為靈活的轉(zhuǎn)換方式:在Cone NAT中,內(nèi)部主機(jī)的內(nèi)部Tuple與外部Tuple的轉(zhuǎn)換映射關(guān)系是獨(dú)立于內(nèi)部主機(jī)所發(fā)出的UDP報(bào)文中的目標(biāo)地址及端口的,即與目標(biāo)Tuple無(wú)關(guān); 在Symmetric NAT中,目標(biāo)Tuple則成為了NAT設(shè)備建立轉(zhuǎn)換關(guān)系的一個(gè)重要考量:只有來(lái)自于同一個(gè)內(nèi)部Tuple 、且針對(duì)同一目標(biāo)Tuple的請(qǐng)求才被NAT轉(zhuǎn)換至同一個(gè)外部Tuple,否則的話,NAT將為之分配一個(gè)新的外部Tuple;打個(gè)比方,當(dāng)內(nèi)部主機(jī)以相 同的內(nèi)部Tuple對(duì)2個(gè)不同的目標(biāo)Tuple發(fā)送UDP報(bào)文時(shí),此時(shí)NAT將會(huì)為內(nèi)部主機(jī)分配兩個(gè)不同的外部Tuple,并且建立起兩個(gè)不同的內(nèi)、外部 Tuple轉(zhuǎn)換關(guān)系。與此同時(shí),只有接收到了內(nèi)部主機(jī)所發(fā)送的數(shù)據(jù)包的外部主機(jī)才能向內(nèi)部主機(jī)返回UDP報(bào)文,這里對(duì)外部返回報(bào)文來(lái)源的限制是與Port Restricted Cone一致的。不難看出,如果說(shuō)Full Cone是要求最寬松NAT UDP轉(zhuǎn)換方式,那么,Symmetric NAT則是要求最嚴(yán)格的NAT方式,其不僅體現(xiàn)在轉(zhuǎn)換關(guān)系的建立上,而且還體現(xiàn)在對(duì)外部報(bào)文來(lái)源的限制方面。

P2P的NAT研究

第一部分:NAT介紹
第二部分:NAT類型檢測(cè)

第一部分: NAT介紹

各種不同類型的NAT(according to RFC)
Full Cone NAT:
內(nèi)網(wǎng)主機(jī)建立一個(gè)UDP socket(LocalIP:LocalPort) 第一次使用這個(gè)socket給外部主機(jī)發(fā)送數(shù)據(jù)時(shí)NAT會(huì)給其分配一個(gè)公網(wǎng)(PublicIP:PublicPort),以后用這個(gè)socket向外面任何主機(jī)發(fā)送數(shù)據(jù)都將使用這對(duì)(PublicIP:PublicPort)。此外,任何外部主機(jī)只要知道這個(gè)(PublicIP:PublicPort)就可以發(fā)送數(shù)據(jù)給(PublicIP:PublicPort),內(nèi)網(wǎng)的主機(jī)就能收到這個(gè)數(shù)據(jù)包
Restricted Cone NAT:
內(nèi)網(wǎng)主機(jī)建立一個(gè)UDP socket(LocalIP:LocalPort) 第一次使用這個(gè)socket給外部主機(jī)發(fā)送數(shù)據(jù)時(shí)NAT會(huì)給其分配一個(gè)公網(wǎng)(PublicIP:PublicPort),以后用這個(gè)socket向外面任何主機(jī)發(fā)送數(shù)據(jù)都將使用這對(duì)(PublicIP:PublicPort)。此外,如果任何外部主機(jī)想要發(fā)送數(shù)據(jù)給這個(gè)內(nèi)網(wǎng)主機(jī),只要知道這個(gè)(PublicIP:PublicPort)并且內(nèi)網(wǎng)主機(jī)之前用這個(gè)socket曾向這個(gè)外部主機(jī)IP發(fā)送過(guò)數(shù)據(jù)。只要滿足這兩個(gè)條件,這個(gè)外部主機(jī)就可以用自己的(IP,任何端口)發(fā)送數(shù)據(jù)給(PublicIP:PublicPort),內(nèi)網(wǎng)的主機(jī)就能收到這個(gè)數(shù)據(jù)包
Port Restricted Cone NAT:
內(nèi)網(wǎng)主機(jī)建立一個(gè)UDP socket(LocalIP:LocalPort) 第一次使用這個(gè)socket給外部主機(jī)發(fā)送數(shù)據(jù)時(shí)NAT會(huì)給其分配一個(gè)公網(wǎng)(PublicIP:PublicPort),以后用這個(gè)socket向外面任何主機(jī)發(fā)送數(shù)據(jù)都將使用這對(duì)(PublicIP:PublicPort)。此外,如果任何外部主機(jī)想要發(fā)送數(shù)據(jù)給這個(gè)內(nèi)網(wǎng)主機(jī),只要知道這個(gè)(PublicIP:PublicPort)并且內(nèi)網(wǎng)主機(jī)之前用這個(gè)socket曾向這個(gè)外部主機(jī)(IP,Port)發(fā)送過(guò)數(shù)據(jù)。只要滿足這兩個(gè)條件,這個(gè)外部主機(jī)就可以用自己的(IP,Port)發(fā)送數(shù)據(jù)給(PublicIP:PublicPort),內(nèi)網(wǎng)的主機(jī)就能收到這個(gè)數(shù)據(jù)包
Symmetric NAT:
內(nèi)網(wǎng)主機(jī)建立一個(gè)UDP socket(LocalIP,LocalPort),當(dāng)用這個(gè)socket第一次發(fā)數(shù)據(jù)給外部主機(jī)1時(shí),NAT為其映射一個(gè)(PublicIP-1,Port-1),以后內(nèi)網(wǎng)主機(jī)發(fā)送給外部主機(jī)1的所有數(shù)據(jù)都是用這個(gè)(PublicIP-1,Port-1),如果內(nèi)網(wǎng)主機(jī)同時(shí)用這個(gè)socket給外部主機(jī)2發(fā)送數(shù)據(jù),第一次發(fā)送時(shí),NAT會(huì)為其分配一個(gè)(PublicIP-2,Port-2), 以后內(nèi)網(wǎng)主機(jī)發(fā)送給外部主機(jī)2的所有數(shù)據(jù)都是用這個(gè)(PublicIP-2,Port-2).如果NAT有多于一個(gè)公網(wǎng)IP,則PublicIP-1和PublicIP-2可能不同,如果NAT只有一個(gè)公網(wǎng)IP,則Port-1和Port-2肯定不同,也就是說(shuō)一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2。此外,如果任何外部主機(jī)想要發(fā)送數(shù)據(jù)給這個(gè)內(nèi)網(wǎng)主機(jī),那么它首先應(yīng)該收到內(nèi)網(wǎng)主機(jī)發(fā)給他的數(shù)據(jù),然后才能往回發(fā)送,否則即使他知道內(nèi)網(wǎng)主機(jī)的一個(gè)(PublicIP,Port)也不能發(fā)送數(shù)據(jù)給內(nèi)網(wǎng)主機(jī),這種NAT無(wú)法實(shí)現(xiàn)UDP-P2P通信。

第二部:NAT類型檢測(cè)(探針技術(shù))

前提條件:有一個(gè)公網(wǎng)的Server并且綁定了兩個(gè)公網(wǎng)IP(IP-1,IP-2)。這個(gè)Server做UDP監(jiān)聽(tīng)(IP-1,Port-1),(IP-2,Port-2)并根據(jù)客戶端的要求進(jìn)行應(yīng)答。

第一步:檢測(cè)客戶端是否有能力進(jìn)行UDP通信以及客戶端是否位于NAT后?

客戶端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port, 客戶端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms),防止無(wú)限堵塞. 重復(fù)這個(gè)過(guò)程若干次。如果每次都超時(shí),無(wú)法接受到服務(wù)器的回應(yīng),則說(shuō)明客戶端無(wú)法進(jìn)行UDP通信,可能是防火墻或NAT阻止UDP通信,這樣的客戶端也就 不能P2P了(檢測(cè)停止)。
當(dāng)客戶端能夠接收到服務(wù)器的回應(yīng)時(shí),需要把服務(wù)器返回的客戶端(IP,Port)和這個(gè)客戶端socket的 (LocalIP,LocalPort)比較。如果完全相同則客戶端不在NAT后,這樣的客戶端具有公網(wǎng)IP可以直接監(jiān)聽(tīng)UDP端口接收數(shù)據(jù)進(jìn)行通信(檢 測(cè)停止)。否則客戶端在NAT后要做進(jìn)一步的NAT類型檢測(cè)(繼續(xù))。

第二步:檢測(cè)客戶端NAT是否是Full Cone NAT?

客戶端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器用另一對(duì)(IP-2,Port-2)響應(yīng)客戶端的請(qǐng)求往回 發(fā)一個(gè)數(shù)據(jù)包,客戶端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms),防止無(wú)限堵塞. 重復(fù)這個(gè)過(guò)程若干次。如果每次都超時(shí),無(wú)法接受到服務(wù)器的回應(yīng),則說(shuō)明客戶端的NAT不是一個(gè)Full Cone NAT,具體類型有待下一步檢測(cè)(繼續(xù))。如果能夠接受到服務(wù)器從(IP-2,Port-2)返回的應(yīng)答UDP包,則說(shuō)明客戶端是一個(gè)Full Cone NAT,這樣的客戶端能夠進(jìn)行UDP-P2P通信(檢測(cè)停止)。

第三步:檢測(cè)客戶端NAT是否是Symmetric NAT?

客戶端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port, 客戶端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms),防止無(wú)限堵塞. 重復(fù)這個(gè)過(guò)程直到收到回應(yīng)(一定能夠收到,因?yàn)榈谝徊奖WC了這個(gè)客戶端可以進(jìn)行UDP通信)。
用同樣的方法用一個(gè)socket向服務(wù)器的(IP-2,Port-2)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port。
比 較上面兩個(gè)過(guò)程從服務(wù)器返回的客戶端(IP,Port),如果兩個(gè)過(guò)程返回的(IP,Port)有一對(duì)不同則說(shuō)明客戶端為Symmetric NAT,這樣的客戶端無(wú)法進(jìn)行UDP-P2P通信(檢測(cè)停止)。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(cè)(繼續(xù))。

第四步:檢測(cè)客戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT?

客戶端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器用IP-1和一個(gè)不同于Port-1的端口發(fā)送一個(gè)UDP 數(shù)據(jù)包響應(yīng)客戶端, 客戶端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms),防止無(wú)限堵塞. 重復(fù)這個(gè)過(guò)程若干次。如果每次都超時(shí),無(wú)法接受到服務(wù)器的回應(yīng),則說(shuō)明客戶端是一個(gè)Port Restricted Cone NAT,如果能夠收到服務(wù)器的響應(yīng)則說(shuō)明客戶端是一個(gè)Restricted Cone NAT。以上兩種NAT都可以進(jìn)行UDP-P2P通信。

注:以上檢測(cè)過(guò)程中只說(shuō)明了可否進(jìn)行UDP-P2P的打洞通信,具體怎么通信一般要借助于Rendezvous Server。另外對(duì)于Symmetric NAT不是說(shuō)完全不能進(jìn)行UDP-P2P達(dá)洞通信,可以進(jìn)行端口預(yù)測(cè)打洞,不過(guò)不能保證成功。

上面的NAT類型檢測(cè)過(guò)程,實(shí)際上是一種常見(jiàn)的NAT穿越技術(shù):探針技術(shù),關(guān)于探針技術(shù)STUN和TURN:

所謂探針技術(shù),是通過(guò)在所有參與通信的實(shí)體上安裝探測(cè)插件,以檢測(cè)網(wǎng)絡(luò)中是否存在NAT網(wǎng)關(guān),并對(duì)不同NAT模型實(shí)施不同穿越方法的一種技術(shù)。
STUN服務(wù)器被部署在公網(wǎng)上,用于接收來(lái)自通信實(shí)體的探測(cè)請(qǐng)求,服務(wù)器會(huì)記錄收到請(qǐng)求的報(bào)文地址和端口,并填寫(xiě)到回送的響應(yīng)報(bào)文中。客戶端根據(jù)接收到的響應(yīng)消息中記錄的地址和端口與本地選擇的地址和端口進(jìn)行比較,就能識(shí)別出是否存在NAT網(wǎng)關(guān)。如果存在NAT網(wǎng)關(guān),客戶端會(huì)使用之前的地址和端口向服務(wù)器的另外一個(gè)IP發(fā)起請(qǐng)求,重復(fù)前面的探測(cè)。然后再比較兩次響應(yīng)返回的結(jié)果判斷出NAT工作的模式。由前述的一對(duì)多轉(zhuǎn)換模型得知,除 對(duì)稱型NAT 以外的模型,NAT網(wǎng)關(guān)對(duì)內(nèi)部主機(jī)地址端口的映射都是相對(duì)固定的,所以比較容易實(shí)現(xiàn)NAT穿越。而 對(duì)稱型NAT 為每個(gè)連接提供一個(gè)映射,使得轉(zhuǎn)換后的公網(wǎng)地址和端口對(duì)不可預(yù)測(cè)。
此時(shí),就用到了TURN轉(zhuǎn)發(fā)服務(wù)器,TURN可以與STUN綁定實(shí)現(xiàn)穿越NAT的服務(wù),即在公網(wǎng)服務(wù)器上提供一個(gè)“地址端口對(duì)”,所有此“地址端口對(duì)”接收到的數(shù)據(jù)會(huì)經(jīng)由探測(cè)建立的連接轉(zhuǎn)發(fā)到內(nèi)網(wǎng)主機(jī)上。TURN分配的這個(gè)映射“地址端口對(duì)”會(huì)通過(guò)STUN響應(yīng)轉(zhuǎn)發(fā)給內(nèi)部主機(jī),后者將此信息放入建立連接的信令中通知通信的對(duì)端。這種探針技術(shù)是一種通用方法,不用在NAT設(shè)備上為每種應(yīng)用協(xié)議開(kāi)發(fā)功能,相對(duì)于ALG方式有一定普遍性。但是TURN中繼服務(wù)會(huì)成為通信瓶頸。而且在客戶端中增加探針功能要求每個(gè)應(yīng)用都要增加代碼才能支持。

延伸閱讀:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,327評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,554評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,337評(píng)論 6 404
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,883評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,114評(píng)論 0 286
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評(píng)論 1 332
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,555評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,737評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,973評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,615評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,343評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,699評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容