NAT 學習

一穴吹、什么是NAT?為什么要使用NAT桨昙?

NAT是將私有地址轉(zhuǎn)換為合法IP地址的技術(shù)讲弄,通俗的講就是將內(nèi)網(wǎng)與內(nèi)網(wǎng)通信時怎么將內(nèi)網(wǎng)私有IP地址轉(zhuǎn)換為可在網(wǎng)絡(luò)中傳播的合法IP地址措左。NAT的出現(xiàn)完美地解決了lP地址不足的問題,而且還能夠有效地避免來自網(wǎng)絡(luò)外部的攻擊垂睬,隱藏并保護網(wǎng)絡(luò)內(nèi)部的計算機。

二、NAT的分類

STUN標準中驹饺,根據(jù)內(nèi)部終端的地址(LocalIP:LocalPort)到NAT出口的公網(wǎng)地址(PublicIP:PublicPort)的影射方式钳枕,把NAT分為四種類型:

  1. Full Cone NAT: 內(nèi)網(wǎng)主機建立一個socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機發(fā)送數(shù)據(jù)時NAT會給其分配一個公網(wǎng)(PublicIP:PublicPort),以后用這個socket向外面任何主機發(fā)送數(shù)據(jù)都將使用這對(PublicIP:PublicPort)。此外赏壹,任何外部主機只要知道這個(PublicIP:PublicPort)就可以發(fā)送數(shù)據(jù)給(PublicIP:PublicPort)鱼炒,內(nèi)網(wǎng)的主機就能收到這個數(shù)據(jù)包。
  2. Restricted Cone NAT: 內(nèi)網(wǎng)主機建立一個socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機發(fā)送數(shù)據(jù)時NAT會給其分配一個公網(wǎng)(PublicIP:PublicPort),以后用這個socket向外面任何主機發(fā)送數(shù)據(jù)都將使用這對(PublicIP:PublicPort)蝌借。此外昔瞧,如果任何外部主機想要發(fā)送數(shù)據(jù)給這個內(nèi)網(wǎng)主機,只要知道這個(PublicIP:PublicPort)并且內(nèi)網(wǎng)主機之前用這個socket曾向這個外部主機IP發(fā)送過數(shù)據(jù)菩佑。只要滿足這兩個條件自晰,這個外部主機就可以用自己的(IP,任何端口)發(fā)送數(shù)據(jù)給(PublicIP:PublicPort),內(nèi)網(wǎng)的主機就能收到這個數(shù)據(jù)包稍坯。
  3. Port Restricted Cone NAT: 內(nèi)網(wǎng)主機建立一個socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機發(fā)送數(shù)據(jù)時NAT會給其分配一個公網(wǎng)(PublicIP:PublicPort),以后用這個socket向外面任何主機發(fā)送數(shù)據(jù)都將使用這對(PublicIP:PublicPort)酬荞。此外,如果任何外部主機想要發(fā)送數(shù)據(jù)給這個內(nèi)網(wǎng)主機瞧哟,只要知道這個(PublicIP:PublicPort)并且內(nèi)網(wǎng)主機之前用這個socket曾向這個外部主機(IP,Port)發(fā)送過數(shù)據(jù)混巧。只要滿足這兩個條件,這個外部主機就可以用自己的(IP,Port)發(fā)送數(shù)據(jù)給(PublicIP:PublicPort)勤揩,內(nèi)網(wǎng)的主機就能收到這個數(shù)據(jù)包咧党。
  4. Symmetric NAT: 內(nèi)網(wǎng)主機建立一個socket(LocalIP,LocalPort),當用這個socket第一次發(fā)數(shù)據(jù)給外部主機1時,NAT為其映射一個(PublicIP-1,Port-1),以后內(nèi)網(wǎng)主機發(fā)送給外部主機1的所有數(shù)據(jù)都是用這個(PublicIP-1,Port-1),如果內(nèi)網(wǎng)主機同時用這個socket給外部主機2發(fā)送數(shù)據(jù)陨亡,NAT會為其分配一個(PublicIP-2,Port-2), 以后內(nèi)網(wǎng)主機發(fā)送給外部主機2的所有數(shù)據(jù)都是用這個(PublicIP-2,Port-2).如果NAT有多于一個公網(wǎng)IP傍衡,則PublicIP-1和PublicIP-2可能不同,如果NAT只有一個公網(wǎng)IP,則Port-1和Port-2肯定不同数苫,也就是說一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2聪舒。此外,如果任何外部主機想要發(fā)送數(shù)據(jù)給這個內(nèi)網(wǎng)主機虐急,那么它首先應該收到內(nèi)網(wǎng)主機發(fā)給他的數(shù)據(jù)箱残,然后才能往回發(fā)送,否則即使他知道內(nèi)網(wǎng)主機的一個(PublicIP,Port)也不能發(fā)送數(shù)據(jù)給內(nèi)網(wǎng)主機止吁,這種NAT無法實現(xiàn)P2P通信被辑,但是如果另一方是Full Cone NAT,還是可以實現(xiàn)穿透的敬惦,下面我會詳細分析各種類型NAT穿透的情況盼理。
    ??NAT 功能通常被集成到路由器、防火墻俄删、ISDN路由器或者單獨的NAT設(shè)備中宏怔。所以我們大家很少會知道NAT奏路,上面NAT類型的概念描述是比較通俗的,但為了更便于理解臊诊,我再舉例闡述一下NAT的原理鸽粉。
    ?? 現(xiàn)有通信的雙方A和B,當A和B都是在公網(wǎng)的時候抓艳,通信是不用NAT的触机。假設(shè)A在內(nèi)網(wǎng),內(nèi)網(wǎng)IP是192.168.1.3玷或,端口號是5000儡首,A經(jīng)過NAT后的IP是221.221.221.100,端口號是8000偏友,B的IP是202.105.124.100蔬胯,端口是8500。如果B要去主動連接A约谈,即使B知道A經(jīng)過NAT后的IP和端口也是無法連接成功的笔宿,因為A沒有向B(202.105.124.100:8500)發(fā)送過數(shù)據(jù),所以B的數(shù)據(jù)包會被A的NAT丟棄棱诱,于是連接失敗泼橘。但是A如果去主動連接B,由于B是在公網(wǎng)迈勋,所以會連接成功炬灭,通信也就會建立。這也就是反彈連接木馬“反彈”二字的精髓靡菇。
    ??當客戶端A和B都是處在內(nèi)網(wǎng)的時候重归,雙方由于都不知道對方的公網(wǎng)IP和端口,就會無從下手厦凤,所以要在客戶端A和B之間架設(shè)一臺服務(wù)器S來為它們牽線鼻吮,而且S是處在公網(wǎng),以保證A和B都能連接到S较鼓∽的荆客戶端A和B登錄時都首先連接S,S就會知道A和B經(jīng)過NAT后的IP和端口博烂,當A想要連接B時香椎,就像S發(fā)出請求,S會把B經(jīng)過NAT后的IP和端口告訴A禽篱,同時S向B發(fā)送A經(jīng)過NAT后的IP和端口畜伐,并要求B發(fā)送數(shù)據(jù)給A,B發(fā)送數(shù)據(jù)到達A時會被A的NAT拋棄躺率,但是B的NAT會有B發(fā)送數(shù)據(jù)到A的記錄玛界,這時A再向B發(fā)送數(shù)據(jù)時就會被B的NAT放行万矾,因為B曾經(jīng)向A的外網(wǎng)IP和端口發(fā)送過數(shù)據(jù)厘惦≈狄溃可能有點亂,下面以故事的形式敘述一下這個情景花吟。
    人物:A(男) NAT_A(A家接線員) ?B(女) NAT_B __ (B家接線員) S
    場景介紹:A想認識B鲤脏,但是不知道B的電話,S跟A吕朵、B都是朋友猎醇,并且知道A和B的電話。
    接線員的職責:
    對往外轉(zhuǎn)接的電話不做詢問努溃,對往內(nèi)轉(zhuǎn)接的電話則要過濾以免有騷擾電話硫嘶。過濾規(guī)則:在一定時間內(nèi)沒有撥打過的號碼就過濾。__
    首先A給S打電話:
    A說:我想認識你朋友B梧税,你把她電話給我唄沦疾。
    S說:行,她的電話是PublicIP_B第队,我讓她先給你打個電話哮塞,要不她家接線員不幫你轉(zhuǎn)接。
    A說:好凳谦。
    S跟B打電話:
    S說:我有一個朋友A忆畅,人挺好的,他想認識你尸执,你給他打個電話家凯,他的電話號碼是PublicIP_A。
    B說:行如失,打完告訴你绊诲。
    S說:好的。
    B打電話到A家褪贵,B家接線員NET_B看到女主人想往PublicIP_A打電話就轉(zhuǎn)接到A家了掂之,同時把號碼PublicIP_A記錄下來,A家接線員NAT_A一看號碼是個近期沒打過的號竭鞍,就給掛斷了板惑。
    B給S打電話:
    B說:我打完電話了
    S說:好,等著吧偎快,一會他就給你打進來了冯乘。
    S給A打電話:
    S說:他給你打完電話了,你快點給她打晒夹。
    A打電話到B家裆馒, A家接線員NET_A看到男主人想往PublicIP_B打電話就轉(zhuǎn)接到B家了姊氓,B家接線員NET_B看到是剛剛撥過的PublicIP_A號碼打過來的,就轉(zhuǎn)接給B了喷好,A和B的電話也就打通了翔横。
    A和B通話:
    A說:電話終于打通了,想認識你挺困難的梗搅。
    B說:是啊禾唁。


    以上雖然和實際不太一樣,但穿透的整體過程基本就是這樣无切。A往B發(fā)送數(shù)據(jù)的唯一阻礙就是NET_B荡短,所以想要成功發(fā)送數(shù)據(jù),必須把NET_B穿一個洞哆键,A是無法完成這項工作的掘托,所以就得讓B完成這個打洞操作,也就是讓B往A發(fā)送數(shù)據(jù)籍嘹,這樣NET_B就會誤以為A發(fā)送的數(shù)據(jù)是上次會話的一部分從而不予阻攔闪盔。
    但是,由于NAT的類型沒有一個統(tǒng)一的標準辱士,所以NAT穿透使用的技術(shù)有很多種泪掀,穿透的成功率也不一樣。還有些NAT類型的內(nèi)網(wǎng)之間幾乎無法穿透颂碘。下面我們用實例詳細分析一下各種NAT類型穿透的可行性族淮。

A機器在私網(wǎng)(192.168.0.3)
A側(cè)NAT服務(wù)器(221.221.221.100)
B機器在另一個私網(wǎng)(192.168.0.5)
B側(cè)NAT服務(wù)器(210.30.224.70)
C機器在公網(wǎng)(210.202.14.36)作為A和B之間的中介
A機器連接C機器,假使是A(192.168.0.3:5000)-> A側(cè)NAT(轉(zhuǎn)換后221.221.221.100:8000)-> C(210.202.14.36:2000)
B機器也連接C機器凭涂,假使是B(192.168.0.5:5000)-> B側(cè)NAT(轉(zhuǎn)換后210.30.224.70:8000)-> C(210.202.14.36:2000)
A機器連接過C機器后祝辣,A向C報告了自己的內(nèi)部地址(192.168.0.3:5000),此時C不僅知道了A的外部地址(C通過自己看到的221.221.221.100:8000)也知道了A的內(nèi)部地址切油。同理C也知道了B的外部地址(210.30.224.70:8000)和 內(nèi)部地址(192.168.0.5:5000)蝙斜。之后,C作為中介澎胡,把A的兩個地址告訴了B孕荠,同時也把B的兩個地址告訴了A。
假設(shè)A先知道了B的兩個地址攻谁,則A從192.168.0.3:5000處同時向B的兩個地址192.168.0.5:5000和210.30.224.70:8000發(fā)包稚伍,由于A和B在兩個不同的NAT后面,故從A(192.168.0.3:5000)到B(192.168.0.5:5000)的包肯定不通戚宦,現(xiàn)在看A(192.168.0.3:5000)到B(210.30.224.70:8000)的包个曙,分如下兩種情況:

1、B側(cè)NAT屬于Full Cone NAT

則無論A側(cè)NAT屬于Cone  NAT還是Symmetric  NAT受楼,包都能順利到達B垦搬。如果程序設(shè)計得好呼寸,使得B主動到A的包也能借用A主動發(fā)起建立的通道的話,則即使A側(cè)NAT屬于Symmetric  NAT猴贰,B發(fā)出的包也能順利到達A对雪。 

結(jié)論1:只要單側(cè)NAT屬于Full Cone NAT,即可實現(xiàn)雙向通信米绕。
####2瑟捣、B側(cè)NAT屬于Restricted Cone或Port Restricted Cone
則包不能到達B。再細分兩種情況

(1)栅干、A側(cè)NAT屬于Restricted Cone或Port Restricted Cone
雖然先前那個初始包不曾到達B蝶柿,但該發(fā)包過程已經(jīng)在A側(cè)NAT上留下了足夠的記錄:A(192.168.0.3:5000)->(221.221.221.100:8000)->B(210.30.224.70:8000)。如果在這個記錄沒有超時之前非驮,B也重復和A一樣的動作,即向A(221.221.221.100:8000)發(fā)包雏赦,雖然A側(cè)NAT屬于Restricted   Cone或Port Restricted Cone劫笙,但先前A側(cè)NAT已經(jīng)認為A已經(jīng)向B(210.30.224.70:8000)發(fā)過包,故B向A(221.221.221.100:8000)發(fā)包能夠順利到達A星岗。同理填大,此后A到B的包,也能順利到達俏橘。     

結(jié)論2:只要兩側(cè)NAT都不屬于Symmetric NAT允华,也可雙向通信。換種說法寥掐,只要兩側(cè)NAT都屬于Cone NAT靴寂,即可雙向通信。

(2)召耘、A側(cè)NAT屬于Symmetric NAT

因為A側(cè)NAT屬于Symmetric NAT百炬,且最初A到C發(fā)包的過程在A側(cè)NAT留下了如下記錄:A(192.168.0.3:5000)->(221.221.221.100:8000)-> C(210.202.14.36:2000),故A到B發(fā)包過程在A側(cè)NAT上留下的記錄為:
A(192.168.0.3:5000)->(221.221.221.100:8001)->B(210.30.224.70:8000)(注意污它,轉(zhuǎn)換后端口產(chǎn)生了變化)剖踊。而B向A的發(fā)包,只能根據(jù)C給他的關(guān)于A的信息衫贬,發(fā)往A(221.221.221.100:8000)德澈,因為A端口受限,故此路不通固惯。再來看B側(cè)NAT梆造,由于B也向A發(fā)過了包,且B側(cè)NAT屬于Restricted Cone或Port Restricted Cone葬毫,故在B側(cè)NAT上留下的記錄為:B(192.168.0.5:5000)->(210.30.224.70:8000)->A(221.221.221.100:8000)澳窑,此后斧散,如果A還繼續(xù)向B發(fā)包的話(因為同一目標,故仍然使用前面的映射)摊聋,如果B側(cè)NAT屬于Restricted Cone鸡捐,則從A(221.221.221.100:8001)來的包能夠順利到達B;如果B側(cè)NAT屬于Port Restricted Cone麻裁,則包永遠無法到達B箍镜。
??結(jié)論3:一側(cè)NAT屬于Symmetric NAT,另一側(cè)NAT屬于Restricted Cone煎源,也可雙向通信色迂。
反過來想,則可以得出另一個結(jié)論:兩個都是Symmetric NAT或者一個是Symmetric NAT手销、另一個是Port Restricted Cone歇僧,則不能雙向通信,因為NAT無法穿透锋拖。
上面的例子雖然只是分析了最初發(fā)包是從A到B的情況诈悍,但是,由于兩者的對稱性兽埃,前面得出的幾條結(jié)論沒有方向性侥钳,雙向都適用。
?? 我們上面得出了四條結(jié)論柄错,natcheck網(wǎng)站則把他歸結(jié)為一條:只要兩側(cè)NAT都屬于Cone NAT(含F(xiàn)ull Cone舷夺、Restricted Cone和Port Restricted Cone三者),即可雙向通信售貌。沒有把我們的結(jié)論3包括進去给猾。
一般情況下,只有比較注重安全的大公司會使用Symmetric NAT颂跨,禁止使用P2P類型的通信耙册,很多地方使用的都是Cone NAT,因此穿透技術(shù)還是有發(fā)展前景的毫捣。

三详拙、使用UDP、TCP穿透NAT

上面講的情況可以直接應用于UDP穿透技術(shù)中蔓同,使用TCP 協(xié)議穿透NAT 的方式和使用UDP 協(xié)議穿透NAT 的方式幾乎一樣饶辙,沒有什么本質(zhì)上的區(qū)別,只是將無連接的UDP 變成了面向連接的TCP 斑粱。值得注意是:
??B在向A打洞時弃揽,發(fā)送的SYN 數(shù)據(jù)包,而且同樣會被NAT_A 丟棄。同時矿微,B需要在原來的socket 上監(jiān)聽痕慢,由于重用socket ,所以需要將socket 屬性設(shè)置為SO_REUSEADDR 涌矢。
??A向B發(fā)送連接請求掖举。同樣,由于B到A方向的孔已經(jīng)打好娜庇,所以連接會成功塔次,經(jīng)過3 次握手后,A到B之間的連接就建立起來了名秀。具體過程如下:
**
1励负、 S啟動兩個網(wǎng)絡(luò)偵聽,一個叫【主連接】偵聽匕得,一個叫【協(xié)助打洞】的偵聽继榆。
2、 A和B分別與S的【主連接】保持聯(lián)系汁掠。
3略吨、 當A需要和B建立直接的TCP連接時,首先連接S的【協(xié)助打洞】端口调塌,并發(fā)送協(xié)助連接申請。同時在該端口號上啟動偵聽惠猿。注意由于要在相同的網(wǎng)絡(luò)終端上綁定到不同的套接字上羔砾,所以必須為這些套接字設(shè)置 SO_REUSEADDR 屬性(即允許重用),否則偵聽會失敗偶妖。
4姜凄、 S的【協(xié)助打洞】連接收到A的申請后通過【主連接】通知B,并將A經(jīng)過NAT-A轉(zhuǎn)換后的公網(wǎng)IP地址和端口等信息告訴B趾访。
5态秧、 B收到S的連接通知后首先與S的【協(xié)助打洞】端口連接,隨便發(fā)送一些數(shù)據(jù)后立即斷開扼鞋,這樣做的目的是讓S能知道B經(jīng)過NAT-B轉(zhuǎn)換后的公網(wǎng)IP和端口號申鱼。
6、 B嘗試與A的經(jīng)過NAT-A轉(zhuǎn)換后的公網(wǎng)IP地址和端口進行connect云头,大多數(shù)路由器對于不請自到的SYN請求包直接丟棄而導致connect失敗捐友,但NAT-B會紀錄此次連接的源地址和端口號,為接下來真正的連 接做好了準備溃槐,這就是所謂的打洞匣砖,即B向A打了一個洞,下次A就能直接連接到B剛才使用的端口號了。
7猴鲫、 客戶端B打洞的同時在相同的端口上啟動偵聽对人。B在一切準備就緒以后通過與S的【主連接】回復消息“我已經(jīng)準備好”,S在收到以后將B經(jīng)過NAT-B轉(zhuǎn)換后的公網(wǎng)IP和端口號告訴給A拂共。
8牺弄、 A收到S回復的B的公網(wǎng)IP和端口號等信息以后,開始連接到B公網(wǎng)IP和端口號匣缘,由于在步驟6中B曾經(jīng)嘗試連接過A的公網(wǎng)IP地址和端口猖闪,NAT-B紀錄了此次連接的信息,所以當A主動連接B時肌厨,NAT-B會認為是合法的SYN數(shù)據(jù)培慌,并允許通過,從而直接的TCP連接建立起來了柑爸。**

最近在研究學習nat穿透吵护,瀏覽博客時看到這篇文章,mark一下留作筆記表鳍。感謝原文作者
原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馅而,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子譬圣,更是在濱河造成了極大的恐慌瓮恭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厘熟,死亡現(xiàn)場離奇詭異屯蹦,居然都是意外死亡,警方通過查閱死者的電腦和手機绳姨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門登澜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人飘庄,你說我怎么就攤上這事脑蠕。” “怎么了跪削?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵谴仙,是天一觀的道長。 經(jīng)常有香客問我碾盐,道長狞甚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任廓旬,我火速辦了婚禮哼审,結(jié)果婚禮上谐腰,老公的妹妹穿的比我還像新娘。我一直安慰自己涩盾,他們只是感情好十气,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著春霍,像睡著了一般砸西。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上址儒,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天芹枷,我揣著相機與錄音,去河邊找鬼莲趣。 笑死鸳慈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喧伞。 我是一名探鬼主播走芋,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼潘鲫!你這毒婦竟也來了翁逞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溉仑,失蹤者是張志新(化名)和其女友劉穎挖函,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浊竟,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡怨喘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逐沙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哲思。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡洼畅,死狀恐怖吩案,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帝簇,我是刑警寧澤徘郭,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站丧肴,受9級特大地震影響残揉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芋浮,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一抱环、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦镇草、人聲如沸眶痰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竖伯。三九已至,卻和暖如春因宇,著一層夾襖步出監(jiān)牢的瞬間七婴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工察滑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留打厘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓杭棵,卻偏偏與公主長得像婚惫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子魂爪,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

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