linux:iptables詳解

iptabels是與Linux內(nèi)核集成的包過(guò)濾防火墻系統(tǒng),幾乎所有的linux發(fā)行版本都會(huì)包含iptables的功能。如果 Linux 系統(tǒng)連接到因特網(wǎng)或 LAN、服務(wù)器或連接 LAN 和因特網(wǎng)的代理服務(wù)器, 則iptables有利于在 Linux 系統(tǒng)上更好地控制 IP 信息包過(guò)濾和防火墻配置。

netfilter/iptables過(guò)濾防火墻系統(tǒng)是一種功能強(qiáng)大的工具,可用于添加、編輯和除去規(guī)則,這些規(guī)則是在做信息包過(guò)濾決定時(shí),防火墻所遵循和組成的規(guī)則。這些規(guī)則存儲(chǔ)在專用的信 息包過(guò)濾表中,而這些表集成在 Linux 內(nèi)核中。在信息包過(guò)濾表中,規(guī)則被分組放在我們所謂的鏈(chain)中。

雖然netfilter/iptables包過(guò)濾系統(tǒng)被稱為單個(gè)實(shí)體,但它實(shí)際上由兩個(gè)組件netfilter 和 iptables 組成。

netfilter 組件也稱為內(nèi)核空間(kernelspace),是內(nèi)核的一部分,由一些信息包過(guò)濾表組成,這些表包含內(nèi)核用來(lái)控制信息包過(guò)濾處理的規(guī)則集。

iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過(guò)濾表中的規(guī)則變得容易。

優(yōu)點(diǎn)

netfilter/iptables的最大優(yōu)點(diǎn)是它可以配置有狀態(tài)的防火墻。有狀態(tài)的防火墻能夠指定并記住為發(fā)送或接收信息包所建立的連接的狀態(tài)。防火墻可以從信息包的連接跟蹤狀態(tài)獲得該信 息。在決定新的信息包過(guò)濾時(shí),防火墻所使用的這些狀態(tài)信息可以增加其效率和速度。這里有四種有效狀態(tài),名稱分別為 ESTABLISHED 、 INVALID 、 NEW 和 RELATED 。

狀態(tài) ESTABLISHED指出該信息包屬于已建立的連接,該連接一直用于發(fā)送和接收信息包并且完全有效。 INVALID 狀態(tài)指出該信息包與任何已知的流或連接都不相關(guān)聯(lián),它可能包含錯(cuò)誤的數(shù)據(jù)或頭。狀態(tài) NEW 意味著該信息包已經(jīng)或?qū)?dòng)新的連接,或者它與尚未用于發(fā)送和接收信息包的連接相關(guān)聯(lián)。最后, RELATED 表示該信息包正在啟動(dòng)新連接,以及它與已建立的連接相關(guān)聯(lián)。

netfilter/iptables的另一個(gè)重要優(yōu)點(diǎn)是,它使用戶可以完全控制防火墻配置和信息包過(guò)濾。您可以定制自己的規(guī)則來(lái)滿足您的特定需求,從而只允許您想要的網(wǎng)絡(luò)流量進(jìn)入系統(tǒng)。

另外,netfilter/iptables是免費(fèi)的,這對(duì)于那些想要節(jié)省費(fèi)用的人來(lái)說(shuō)十分理想,它可以代替昂貴的防火墻解決方案。

原理

iptables的原理主要是對(duì)數(shù)據(jù)包的控制,看下圖:



(1) 一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),它首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要轉(zhuǎn)發(fā) 出去。
(2) 如果數(shù)據(jù)包就是進(jìn)入本機(jī)的,它就會(huì)沿著圖向下移動(dòng),到達(dá)INPUT鏈。數(shù)據(jù)包到了INPUT鏈后,任何進(jìn)程都會(huì)收到它。本機(jī)上運(yùn)行的程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包會(huì)經(jīng) 過(guò)OUTPUT鏈,然后到達(dá)POSTROUTING鏈輸出。
(3)如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會(huì)如圖所示向右移動(dòng),經(jīng)過(guò) FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出。

規(guī)則、表和鏈
1.規(guī)則(rules)

規(guī)則(rules)其實(shí)就是網(wǎng)絡(luò)管理員預(yù)定義的條件,規(guī)則一般的定義為“如果數(shù)據(jù)包頭符合這樣的條件,就這樣處理這個(gè)數(shù)據(jù)包”。規(guī)則存儲(chǔ)在內(nèi)核空間的信息包過(guò)濾表中,這些規(guī)則分別指定了源地址、目的地址、傳輸協(xié)議(如TCP、UDP、ICMP)和服務(wù)類型(如HTTP、FTP和SMTP)等。當(dāng)數(shù)據(jù)包與規(guī)則匹配時(shí),iptables就根據(jù)規(guī)則所定義的方法來(lái)處理這些數(shù)據(jù)包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作就是添加、修改和刪除這些規(guī)則。

2.鏈(chains)

鏈(chains)是數(shù)據(jù)包傳播的路徑,每一條鏈其實(shí)就是眾多規(guī)則中的一個(gè)檢查清單,每一條鏈中可以有一條或數(shù)條規(guī)則。當(dāng)一個(gè)數(shù)據(jù)包到達(dá)一個(gè)鏈時(shí),iptables就會(huì)從鏈中第一條規(guī)則開(kāi)始檢查,看該數(shù)據(jù)包是否滿足規(guī)則所定義的條件。如果滿足,系統(tǒng)就會(huì)根據(jù)該條規(guī)則所定義的方法處理該數(shù)據(jù)包;否則iptables將繼續(xù)檢查下一條規(guī)則,如果該數(shù)據(jù)包不符合鏈中任一條規(guī)則,iptables就會(huì)根據(jù)該鏈預(yù)先定義的默認(rèn)策略來(lái)處理數(shù)據(jù)包。

3.表(tables)

表(tables)提供特定的功能,iptables內(nèi)置了4個(gè)表,即raw表、filter表、nat表和mangle表,分別用于實(shí)現(xiàn)包過(guò)濾,網(wǎng)絡(luò)地址轉(zhuǎn)換和包重構(gòu)的功能。



(1)RAW表
只使用在PREROUTING鏈和OUTPUT鏈上,因?yàn)閮?yōu)先級(jí)最高,從而可以對(duì)收到的數(shù)據(jù)包在連接跟蹤前進(jìn)行處理。一但用戶使用了RAW表,在 某個(gè)鏈上,RAW表處理完后,將跳過(guò)NAT表和 ip_conntrack處理,即不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理了。
(2)filter表
主要用于過(guò)濾數(shù)據(jù)包,該表根據(jù)系統(tǒng)管理員預(yù)定義的一組規(guī)則過(guò)濾符合條件的數(shù)據(jù)包。對(duì)于防火墻而言,主要利用在filter表中指定的規(guī)則來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)包的過(guò)濾。Filter表是默認(rèn)的表,如果沒(méi)有指定哪個(gè)表,iptables 就默認(rèn)使用filter表來(lái)執(zhí)行所有命令,filter表包含了INPUT鏈(處理進(jìn)入的數(shù)據(jù)包),RORWARD鏈(處理轉(zhuǎn)發(fā)的數(shù)據(jù)包),OUTPUT鏈(處理本地生成的數(shù)據(jù)包)在filter表中只能允許對(duì)數(shù)據(jù)包進(jìn)行接受,丟棄的操作,而無(wú)法對(duì)數(shù)據(jù)包進(jìn)行更改。
(3)nat表
主要用于網(wǎng)絡(luò)地址轉(zhuǎn)換NAT,該表可以實(shí)現(xiàn)一對(duì)一,一對(duì)多,多對(duì)多等NAT 工作,iptables就是使用該表實(shí)現(xiàn)共享上網(wǎng)的,NAT表包含了PREROUTING鏈(修改即將到來(lái)的數(shù)據(jù)包),POSTROUTING鏈(修改即將出去的數(shù)據(jù)包),OUTPUT鏈(修改路由之前本地生成的數(shù)據(jù)包)
(4)mangle表
主要用于對(duì)指定數(shù)據(jù)包進(jìn)行更改,在內(nèi)核版本2.4.18 后的linux版本中該表包含的鏈為:INPUT鏈(處理進(jìn)入的數(shù)據(jù)包),RORWARD鏈(處理轉(zhuǎn)發(fā)的數(shù)據(jù)包),OUTPUT鏈(處理本地生成的數(shù)據(jù)包)POSTROUTING鏈(修改即將出去的數(shù)據(jù)包),PREROUTING鏈(修改即將到來(lái)的數(shù)據(jù)包)

規(guī)則表之間的優(yōu)先順序:

Raw——mangle——nat——filter

規(guī)則鏈之間的優(yōu)先順序(分三種情況):

第一種情況:入站數(shù)據(jù)流向

從外界到達(dá)防火墻的數(shù)據(jù)包,先被PREROUTING規(guī)則鏈處理(是否修改數(shù)據(jù)包地址等),之后會(huì)進(jìn)行路由選擇(判斷該數(shù)據(jù)包應(yīng)該發(fā)往何處),如果數(shù)據(jù)包 的目標(biāo)主機(jī)是防火墻本機(jī)(比如說(shuō)Internet用戶訪問(wèn)防火墻主機(jī)中的web服務(wù)器的數(shù)據(jù)包),那么內(nèi)核將其傳給INPUT鏈進(jìn)行處理(決定是否允許通 過(guò)等),通過(guò)以后再交給系統(tǒng)上層的應(yīng)用程序(比如Apache服務(wù)器)進(jìn)行響應(yīng)。

第二沖情況:轉(zhuǎn)發(fā)數(shù)據(jù)流向

來(lái)自外界的數(shù)據(jù)包到達(dá)防火墻后,首先被PREROUTING規(guī)則鏈處理,之后會(huì)進(jìn)行路由選擇,如果數(shù)據(jù)包的目標(biāo)地址是其它外部地址(比如局域網(wǎng)用戶通過(guò)網(wǎng) 關(guān)訪問(wèn)QQ站點(diǎn)的數(shù)據(jù)包),則內(nèi)核將其傳遞給FORWARD鏈進(jìn)行處理(是否轉(zhuǎn)發(fā)或攔截),然后再交給POSTROUTING規(guī)則鏈(是否修改數(shù)據(jù)包的地 址等)進(jìn)行處理。

第三種情況:出站數(shù)據(jù)流向

防火墻本機(jī)向外部地址發(fā)送的數(shù)據(jù)包(比如在防火墻主機(jī)中測(cè)試公網(wǎng)DNS服務(wù)器時(shí)),首先被OUTPUT規(guī)則鏈處理,之后進(jìn)行路由選擇,然后傳遞給POSTROUTING規(guī)則鏈(是否修改數(shù)據(jù)包的地址等)進(jìn)行處理。

iptables是采用規(guī)則堆棧的方式來(lái)進(jìn)行過(guò)濾,當(dāng)一個(gè)封包進(jìn)入網(wǎng)卡,會(huì)先檢查 Prerouting,然后檢查目的IP判斷是否需要轉(zhuǎn)送出去,接著就會(huì)跳到INPUT 或 Forward 進(jìn)行過(guò)濾,如果封包需轉(zhuǎn)送處理則檢查 Postrouting,如果是來(lái)自本機(jī)封包,則檢查 OUTPUT 以及Postrouting。過(guò)程中如果符合某條規(guī)則將會(huì)進(jìn)行處理,處理動(dòng)作除了 ACCEPT、REJECT、DROP、REDIRECT 和MASQUERADE 以外,還多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK等,其中某些處理動(dòng)作不會(huì)中斷過(guò)濾程序,某些處理動(dòng)作則會(huì)中斷同一規(guī)則鏈的過(guò)濾,并依照前述流程繼續(xù)進(jìn)行下一個(gè)規(guī)則鏈的過(guò)濾(注意:這一點(diǎn)與ipchains不同),一直到堆棧中的規(guī)則檢查完畢為止。透過(guò)這種機(jī)制所帶來(lái)的好處是,我們可以進(jìn)行復(fù)雜、多重的封包過(guò)濾,簡(jiǎn)單的說(shuō),iptables可以進(jìn)行縱橫交錯(cuò)式的過(guò)濾(tables)而非鏈狀過(guò)濾(chains)。ACCEPT 將封包放行,進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接跳往下一個(gè)規(guī)則鏈(nat:postrouting)。

那么如何使用iptables在以上流程中控制對(duì)數(shù)據(jù)包的處理行為呢?當(dāng)然是使用iptables與其相關(guān)的參數(shù)了。

1、iptables命令格式

iptables的命令格式較為復(fù)雜,一般的格式如下:

iptables [-t 表] -命令 匹配   操作

說(shuō)明
(1) -t 表
表選項(xiàng)用于指定命令應(yīng)用于哪個(gè)iptables內(nèi)置表。
(2)命令
命令選項(xiàng)用于指定iptables的執(zhí)行方式,包括插入規(guī)則,刪除規(guī)則和添加規(guī)則,如下表所示

-P  --policy        <鏈名>  定義默認(rèn)策略
-L  --list          <鏈名>  查看iptables規(guī)則列表
-A  --append        <鏈名>  在規(guī)則列表的最后增加1條規(guī)則
-I  --insert        <鏈名>  在指定的位置插入1條規(guī)則
-D  --delete        <鏈名>  從規(guī)則列表中刪除1條規(guī)則
-R  --replace       <鏈名>  替換規(guī)則列表中的某條規(guī)則
-F  --flush         <鏈名>  刪除表中所有規(guī)則
-Z  --zero          <鏈名>  將表中數(shù)據(jù)包計(jì)數(shù)器和流量計(jì)數(shù)器歸零
-X  --delete-chain  <鏈名>  刪除自定義鏈
-v  --verbose       <鏈名>  與-L他命令一起使用顯示更多更詳細(xì)的信息

(3) 匹配規(guī)則
匹配選項(xiàng)指定數(shù)據(jù)包與規(guī)則匹配所具有的特征,包括源地址,目的地址,傳輸協(xié)議和端口號(hào),如下表所示

-i --in-interface    網(wǎng)絡(luò)接口名>     指定數(shù)據(jù)包從哪個(gè)網(wǎng)絡(luò)接口進(jìn)入,
-o --out-interface   網(wǎng)絡(luò)接口名>     指定數(shù)據(jù)包從哪個(gè)網(wǎng)絡(luò)接口輸出
-p ---proto          協(xié)議類型        指定數(shù)據(jù)包匹配的協(xié)議,如TCP、UDP和ICMP等
-s --source          源地址或子網(wǎng)>   指定數(shù)據(jù)包匹配的源地址
   --sport           源端口號(hào)>       指定數(shù)據(jù)包匹配的源端口號(hào)
   --dport           目的端口號(hào)>     指定數(shù)據(jù)包匹配的目的端口號(hào)
-m --match           匹配的模塊      指定數(shù)據(jù)包規(guī)則所使用的過(guò)濾模塊

iptables執(zhí)行規(guī)則時(shí),是從規(guī)則表中從上至下順序執(zhí)行的,如果沒(méi)遇到匹配的規(guī)則,就一條一條往下執(zhí)行,如果遇到匹配的規(guī)則后,那么就執(zhí)行本規(guī)則,執(zhí)行后根據(jù)本規(guī)則的動(dòng)作(accept,reject,log,drop等),決定下一步執(zhí)行的情況,后續(xù)執(zhí)行一般有三種情況。

  • 一種是繼續(xù)執(zhí)行當(dāng)前規(guī)則隊(duì)列內(nèi)的下一條規(guī)則。比如執(zhí)行過(guò)Filter隊(duì)列內(nèi)的LOG后,還會(huì)執(zhí)行Filter隊(duì)列內(nèi)的下一條規(guī)則。
  • 一種是中止當(dāng)前規(guī)則隊(duì)列的執(zhí)行,轉(zhuǎn)到下一條規(guī)則隊(duì)列。比如從執(zhí)行過(guò)accept后就中斷Filter隊(duì)列內(nèi)其它規(guī)則,跳到nat隊(duì)列規(guī)則去執(zhí)行
  • 一種是中止所有規(guī)則隊(duì)列的執(zhí)行。

2、iptables規(guī)則的動(dòng)作

前面我們說(shuō)過(guò)iptables處理動(dòng)作除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 以外,還多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK等。我們只說(shuō)明其中最常用的動(dòng)作:

REJECT 攔阻該數(shù)據(jù)包,并返回?cái)?shù)據(jù)包通知對(duì)方,可以返回的數(shù)據(jù)包有幾個(gè)選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個(gè)數(shù)據(jù)包包會(huì)要求對(duì)方關(guān)閉聯(lián)機(jī)),進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接中斷過(guò)濾程序。 范例如下:

iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply

DROP 丟棄數(shù)據(jù)包不予處理,進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接中斷過(guò)濾程序。
REDIRECT 將封包重新導(dǎo)向到另一個(gè)端口(PNAT),進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。這個(gè)功能可以用來(lái)實(shí)作透明代理 或用來(lái)保護(hù)web 服務(wù)器。例如:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081

MASQUERADE 改寫封包來(lái)源IP為防火墻的IP,可以指定port 對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,直接跳往下一個(gè)規(guī)則鏈(mangle:postrouting)。這個(gè)功能與 SNAT 略有不同,當(dāng)進(jìn)行IP 偽裝時(shí),不需指定要偽裝成哪個(gè) IP,IP 會(huì)從網(wǎng)卡直接讀取,當(dāng)使用撥接連線時(shí),IP 通常是由 ISP 公司的 DHCP服務(wù)器指派的,這個(gè)時(shí)候 MASQUERADE 特別有用。范例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000

LOG 將數(shù)據(jù)包相關(guān)信息紀(jì)錄在 /var/log 中,詳細(xì)位置請(qǐng)查閱 /etc/syslog.conf 配置文件,進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。例如:

iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"

SNAT 改寫封包來(lái)源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將直接跳往下一個(gè)規(guī)則煉(mangle:postrouting)。范例如下:

iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200

DNAT 改寫數(shù)據(jù)包包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將會(huì)直接跳往下一個(gè)規(guī)則鏈(filter:input 或 filter:forward)。范例如下:

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100

MIRROR 鏡像數(shù)據(jù)包,也就是將來(lái)源 IP與目的地IP對(duì)調(diào)后,將數(shù)據(jù)包返回,進(jìn)行完此處理動(dòng)作后,將會(huì)中斷過(guò)濾程序。
QUEUE 中斷過(guò)濾程序,將封包放入隊(duì)列,交給其它程序處理。透過(guò)自行開(kāi)發(fā)的處理程序,可以進(jìn)行其它應(yīng)用,例如:計(jì)算聯(lián)機(jī)費(fèi)用.......等。
RETURN 結(jié)束在目前規(guī)則鏈中的過(guò)濾程序,返回主規(guī)則鏈繼續(xù)過(guò)濾,如果把自訂規(guī)則煉看成是一個(gè)子程序,那么這個(gè)動(dòng)作,就相當(dāng)于提早結(jié)束子程序并返回到主程序中。
MARK 將封包標(biāo)上某個(gè)代號(hào),以便提供作為后續(xù)過(guò)濾的條件判斷依據(jù),進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。范例如下:

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22

看了本文是不是對(duì)iptables參數(shù)有所了解了,下文我會(huì)使用實(shí)例來(lái)更詳細(xì)的說(shuō)明iptables的參數(shù)的用法。

保存規(guī)則

使用iptables程序建立的規(guī)則只會(huì)保存在內(nèi)存中,通常我們?cè)谛薷牧薸ptables的規(guī)則重啟 iptables 后,之前修改的規(guī)則又消失了。那么如何保存新建立的規(guī)則呢?

方法1 對(duì)于RHEL和ceontos系統(tǒng)可以使用service iptables save將當(dāng)前內(nèi)存中的規(guī)則保存到/etc/sysconfig/iptables文件中

[root@lampbo ~]# service iptables save

方法2 修改/etc/sysconfig/iptables-config 將里面的IPTABLES_SAVE_ON_STOP="no", 這一句的"no"改為"yes"這樣每次服務(wù)在停止之前會(huì)自動(dòng)將現(xiàn)有的規(guī)則保存在 /etc/sysconfig/iptables 這個(gè)文件中去。

規(guī)則示例

先回顧下iptables的格式:

iptables [-t table] command [match] [-j target/jump]

-t 參數(shù)用來(lái)指定規(guī)則表,內(nèi)建的規(guī)則表有三個(gè),分別是:nat、mangle 和 filter,當(dāng)未指定規(guī)則表時(shí),則一律視為是 filter。

各個(gè)規(guī)則表的功能如下:

nat 此規(guī)則表?yè)碛?Prerouting 和 postrouting 兩個(gè)規(guī)則鏈,主要功能為進(jìn)行一對(duì)一、一對(duì)多、多對(duì)多等網(wǎng)址轉(zhuǎn)換工作(SNAT,DNAT),由于轉(zhuǎn)換的特性,需進(jìn)行目的地網(wǎng)址轉(zhuǎn)換的數(shù)據(jù)包,就不需要進(jìn)行來(lái)源網(wǎng)址轉(zhuǎn)換,反之亦然,因此為了提升改寫封包的效率,在防火墻運(yùn)作時(shí),每個(gè)封包只會(huì)經(jīng)過(guò)這個(gè)規(guī)則表一次。如果我們把數(shù)據(jù)包過(guò)濾的規(guī)則定義在這個(gè)數(shù)據(jù)表里,將會(huì)造成無(wú)法對(duì)同一包進(jìn)行多次比對(duì),因此這個(gè)規(guī)則表除了作網(wǎng)址轉(zhuǎn)換外,請(qǐng)不要做其它用途。

mangle 此規(guī)則表?yè)碛?Prerouting、FORWARD 和 postrouting 三個(gè)規(guī)則鏈。除了進(jìn)行網(wǎng)址轉(zhuǎn)譯工作會(huì)改寫封包外,在某些特殊應(yīng)用可能也必須去改寫數(shù)據(jù)包(TTL、TOS)或者是設(shè)定 MARK(將數(shù)據(jù)包作記號(hào),以進(jìn)行后續(xù)的過(guò)濾),這時(shí)就必須將這些工作定義在 mangle 規(guī)則表中。

filter 這個(gè)規(guī)則表是預(yù)設(shè)規(guī)則表,擁有 INPUT、FORWARD 和 OUTPUT 三個(gè)規(guī)則鏈,這個(gè)規(guī)則表顧名思義是用來(lái)進(jìn)行封包過(guò)濾的動(dòng)作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我們會(huì)將基本規(guī)則都建立在此規(guī)則表中。

(一)、常用命令示例:

1、命令 -A, --append

范例:iptables -A INPUT -p tcp --dport 80 -j ACCEPT

說(shuō)明 :新增規(guī)則到INPUT規(guī)則鏈中,規(guī)則時(shí)接到所有目的端口為80的數(shù)據(jù)包的流入連接,該規(guī)則將會(huì)成為規(guī)則鏈中的最后一條規(guī)則。

2、命令 -D, --delete

范例:iptables -D INPUT -p tcp --dport 80 -j ACCEPT

或 : iptables -D INPUT 1

說(shuō)明: 從INPUT規(guī)則鏈中刪除上面建立的規(guī)則,可輸入完整規(guī)則,或直接指定規(guī)則編號(hào)加以刪除。

3、命令 -R, --replace

范例: iptables -R INPUT 1 -s 192.168.0.1 -j DROP

說(shuō)明 取代現(xiàn)行第一條規(guī)則,規(guī)則被取代后并不會(huì)改變順序。

4、命令 -I, --insert

范例:iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

說(shuō)明: 在第一條規(guī)則前插入一條規(guī)則,原本該位置上的規(guī)則將會(huì)往后移動(dòng)一個(gè)順位。

5、命令 -L, --list

范例: iptables -L INPUT

說(shuō)明:列出INPUT規(guī)則鏈中的所有規(guī)則。

6、命令 -F, --flush

范例: iptables -F INPUT

說(shuō)明: 刪除INPUT規(guī)則鏈中的所有規(guī)則。

7、命令 -Z, --zeroLINUX教程 centos教程

范例:iptables -Z INPUT

說(shuō)明 將INPUT鏈中的數(shù)據(jù)包計(jì)數(shù)器歸零。它是計(jì)算同一數(shù)據(jù)包出現(xiàn)次數(shù),過(guò)濾阻斷式攻擊不可少的工具。

8、命令 -N, --new-chain

范例: iptables -N denied

說(shuō)明: 定義新的規(guī)則鏈。

9、命令 -X, --delete-chain

范例: iptables -X denied

說(shuō)明: 刪除某個(gè)規(guī)則鏈。

10、命令 -P, --policy

范例 :iptables -P INPUT DROP

說(shuō)明 :定義默認(rèn)的過(guò)濾策略。 數(shù)據(jù)包沒(méi)有找到符合的策略,則根據(jù)此預(yù)設(shè)方式處理。

11、命令 -E, --rename-chain

范例: iptables -E denied disallowed

說(shuō)明: 修改某自訂規(guī)則鏈的名稱。

(二)常用封包比對(duì)參數(shù):

1、參數(shù) -p, --protocol

范例:iptables -A INPUT -p tcp

說(shuō)明:比對(duì)通訊協(xié)議類型是否相符,可以使用 ! 運(yùn)算子進(jìn)行反向比對(duì),例如:-p ! tcp ,意思是指除 tcp 以外的其它類型,包含udp、icmp ...等。如果要比對(duì)所有類型,則可以使用 all 關(guān)鍵詞,例如:-p all。

2、參數(shù) -s, --src, --source

范例: iptables -A INPUT -s 192.168.1.100

說(shuō)明:用來(lái)比對(duì)數(shù)據(jù)包的來(lái)源IP,可以比對(duì)單機(jī)或網(wǎng)絡(luò),比對(duì)網(wǎng)絡(luò)時(shí)請(qǐng)用數(shù)字來(lái)表示屏蔽,例如:-s 192.168.0.0/24,比對(duì) IP 時(shí)可以使用!運(yùn)算子進(jìn)行反向比對(duì),例如:-s ! 192.168.0.0/24。

3、參數(shù) -d, --dst, --destination

范例: iptables -A INPUT -d 192.168.1.100

說(shuō)明:用來(lái)比對(duì)封包的目的地 IP,設(shè)定方式同上。

4、參數(shù) -i, --in-interface

范例 iptables -A INPUT -i lo

說(shuō)明:用來(lái)比對(duì)數(shù)據(jù)包是從哪個(gè)網(wǎng)卡進(jìn)入,可以使用通配字符 + 來(lái)做大范圍比對(duì),如:-i eth+ 表示所有的 ethernet 網(wǎng)卡,也可以使用 ! 運(yùn)算子進(jìn)行反向比對(duì),如:-i ! eth0。這里lo指本地?fù)Q回接口。

5、參數(shù) -o, --out-interface

范例:iptables -A FORWARD -o eth0

說(shuō)明:用來(lái)比對(duì)數(shù)據(jù)包要從哪個(gè)網(wǎng)卡流出,設(shè)定方式同上。

6、參數(shù) --sport, --source-port

范例:iptables -A INPUT -p tcp --sport 22

說(shuō)明:用來(lái)比對(duì)數(shù)據(jù)的包的來(lái)源端口號(hào),可以比對(duì)單一端口,或是一個(gè)范圍,例如:--sport 22:80,表示從 22 到 80 端口之間都算是符合件,如果要比對(duì)不連續(xù)的多個(gè)端口,則必須使用 --multiport 參數(shù),詳見(jiàn)后文。比對(duì)端口號(hào)時(shí),可以使用 ! 運(yùn)算子進(jìn)行反向比對(duì)。

7、參數(shù) --dport, --destination-port

范例 iptables -A INPUT -p tcp --dport 22
說(shuō)明 用來(lái)比對(duì)封包的目的地端口號(hào),設(shè)定方式同上。

8、參數(shù) --tcp-flags

范例:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN

說(shuō)明:比對(duì) TCP 封包的狀態(tài)標(biāo)志號(hào),參數(shù)分為兩個(gè)部分,第一個(gè)部分列舉出想比對(duì)的標(biāo)志號(hào),第二部分則列舉前述標(biāo)志號(hào)中哪些有被設(shè),未被列舉的標(biāo)志號(hào)必須是空的。TCP 狀態(tài)標(biāo)志號(hào)包括:SYN(同步)、ACK(應(yīng)答)、FIN(結(jié)束)、RST(重設(shè))、URG(緊急)PSH(強(qiáng)迫推送) 等均可使用于參數(shù)中,除此之外還可以使用關(guān)鍵詞 ALL 和 NONE 進(jìn)行比對(duì)。比對(duì)標(biāo)志號(hào)時(shí),可以使用 ! 運(yùn)算子行反向比對(duì)。

9、參數(shù) --syn

范例:iptables -p tcp --syn

說(shuō)明:用來(lái)比對(duì)是否為要求聯(lián)機(jī)之TCP 封包,與 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !運(yùn)算子,可用來(lái)比對(duì)非要求聯(lián)機(jī)封包。

10、參數(shù) -m multiport --source-port

范例: iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110 -j ACCEPT

說(shuō)明 用來(lái)比對(duì)不連續(xù)的多個(gè)來(lái)源端口號(hào),一次最多可以比對(duì) 15 個(gè)端口,可以使用 ! 運(yùn)算子進(jìn)行反向比對(duì)。

11、參數(shù) -m multiport --destination-port

范例 :iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110 -j ACCEPT

說(shuō)明:用來(lái)比對(duì)不連續(xù)的多個(gè)目的地端口號(hào),設(shè)定方式同上。

12、參數(shù) -m multiport --port

范例:iptables -A INPUT -p tcp -m multiport --port 22,53,80,110 -j ACCEPT

說(shuō)明:這個(gè)參數(shù)比較特殊,用來(lái)比對(duì)來(lái)源端口號(hào)和目的端口號(hào)相同的數(shù)據(jù)包,設(shè)定方式同上。注意:在本范例中,如果來(lái)源端口號(hào)為 80,目的地端口號(hào)為 110,這種數(shù)據(jù)包并不算符合條件。

13、參數(shù) --icmp-type

范例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP

說(shuō)明:用來(lái)比對(duì) ICMP 的類型編號(hào),可以使用代碼或數(shù)字編號(hào)來(lái)進(jìn)行比對(duì)。請(qǐng)打 iptables -p icmp --help 來(lái)查看有哪些代碼可用。這里是指禁止ping如,但是可以從該主機(jī)ping出。

14、參數(shù) -m limit --limit

范例:iptables -A INPUT -m limit --limit 3/hour

說(shuō)明:用來(lái)比對(duì)某段時(shí)間內(nèi)數(shù)據(jù)包的平均流量,上面的例子是用來(lái)比對(duì):每小時(shí)平均流量是否超過(guò)一次3個(gè)數(shù)據(jù)包。 除了每小時(shí)平均次外,也可以每秒鐘、每分鐘或每天平均一次,默認(rèn)值為每小時(shí)平均一次,參數(shù)如后: /second、 /minute、/day。 除了進(jìn)行數(shù)據(jù)包數(shù)量的比對(duì)外,設(shè)定這個(gè)參數(shù)也會(huì)在條件達(dá)成時(shí),暫停數(shù)據(jù)包的比對(duì)動(dòng)作,以避免因洪水攻擊法,導(dǎo)致服務(wù)被阻斷。

15、參數(shù) --limit-burst

范例:iptables -A INPUT -m limit --limit-burst 5

說(shuō)明:用來(lái)比對(duì)瞬間大量封包的數(shù)量,上面的例子是用來(lái)比對(duì)一次同時(shí)涌入的封包是否超過(guò) 5 個(gè)(這是默認(rèn)值),超過(guò)此上限的封將被直接丟棄。使用效果同上。

16、參數(shù) -m mac --mac-source

范例:iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 -j ACCEPT

說(shuō)明:用來(lái)比對(duì)數(shù)據(jù)包來(lái)源網(wǎng)絡(luò)接口的硬件地址,這個(gè)參數(shù)不能用在 OUTPUT 和 Postrouting 規(guī)則鏈上,這是因?yàn)榉獍统龅骄W(wǎng)后,才能由網(wǎng)卡驅(qū)動(dòng)程序透過(guò) ARP 通訊協(xié)議查出目的地的 MAC 地址,所以 iptables 在進(jìn)行封包比對(duì)時(shí),并不知道封包會(huì)送到個(gè)網(wǎng)絡(luò)接口去。

17、參數(shù) --mark

范例:iptables -t mangle -A INPUT -m mark --mark 1

說(shuō)明:用來(lái)比對(duì)封包是否被表示某個(gè)號(hào)碼,當(dāng)封包被比對(duì)成功時(shí),我們可以透過(guò) MARK 處理動(dòng)作,將該封包標(biāo)示一個(gè)號(hào)碼,號(hào)碼最不可以超過(guò) 4294967296。

18、參數(shù) -m owner --uid-owner

范例:iptables -A OUTPUT -m owner --uid-owner 500

說(shuō)明:用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定使用者所產(chǎn)生的,這樣可以避免服務(wù)器使用 root 或其它身分將敏感數(shù)據(jù)傳送出,可以降低系統(tǒng)被駭?shù)膿p失。可惜這個(gè)功能無(wú)法比對(duì)出來(lái)自其它主機(jī)的封包。

19、參數(shù) -m owner --gid-owner

范例:iptables -A OUTPUT -m owner --gid-owner 0

說(shuō)明:用來(lái)比對(duì)來(lái)自本機(jī)的數(shù)據(jù)包,是否為某特定使用者群組所產(chǎn)生的,使用時(shí)機(jī)同上。

20、參數(shù) -m owner --pid-owner

范例:iptables -A OUTPUT -m owner --pid-owner 78

說(shuō)明:用來(lái)比對(duì)來(lái)自本機(jī)的數(shù)據(jù)包,是否為某特定行程所產(chǎn)生的,使用時(shí)機(jī)同上。

21、參數(shù) -m owner --sid-owner

范例: iptables -A OUTPUT -m owner --sid-owner 100

說(shuō)明: 用來(lái)比對(duì)來(lái)自本機(jī)的數(shù)據(jù)包,是否為某特定聯(lián)機(jī)(Session ID)的響應(yīng)封包,使用時(shí)機(jī)同上。

22、參數(shù) -m state --state

范例: iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

說(shuō)明 用來(lái)比對(duì)聯(lián)機(jī)狀態(tài),聯(lián)機(jī)狀態(tài)共有四種:INVALID、ESTABLISHED、NEW 和 RELATED。

23、iptables -L -n -v 可以查看計(jì)數(shù)器

INVALID 表示該數(shù)據(jù)包的聯(lián)機(jī)編號(hào)(Session ID)無(wú)法辨識(shí)或編號(hào)不正確。ESTABLISHED 表示該數(shù)據(jù)包屬于某個(gè)已經(jīng)建立的聯(lián)機(jī)。NEW 表示該數(shù)據(jù)包想要起始一個(gè)聯(lián)機(jī)(重設(shè)聯(lián)機(jī)或?qū)⒙?lián)機(jī)重導(dǎo)向)。RELATED 表示該數(shù)據(jù)包是屬于某個(gè)已經(jīng)建立的聯(lián)機(jī),所建立的新聯(lián)機(jī)。例如:FTP-DATA 聯(lián)機(jī)必定是源自某個(gè) FTP 聯(lián)機(jī)。

(三)常用的處理動(dòng)作:

-j 參數(shù)用來(lái)指定要進(jìn)行的處理動(dòng)作,常用的處理動(dòng)作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK。

分別說(shuō)明如下:

ACCEPT 將數(shù)據(jù)包放行,進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接跳往下一個(gè)規(guī)則鏈(natostrouting)。
REJECT 攔阻該數(shù)據(jù)包,并傳送數(shù)據(jù)包通知對(duì)方,可以傳送的數(shù)據(jù)包有幾個(gè)選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個(gè)數(shù)據(jù)包會(huì)要求對(duì)方關(guān)閉聯(lián)機(jī)),進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接 中斷過(guò)濾程序。 范例如下:

iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

DROP 丟棄包不予處理,進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接中斷過(guò)濾程序。
REDIRECT 將包重新導(dǎo)向到另一個(gè)端口(PNAT),進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。 這個(gè)功能可以用來(lái)實(shí)作通透式porxy 或用來(lái)保護(hù) web 服務(wù)器。例如:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

MASQUERADE 改寫數(shù)據(jù)包來(lái)源 IP為防火墻 NIC IP,可以指定 port 對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,直接跳往下一個(gè)規(guī)則(mangleostrouting)。這個(gè)功能與 SNAT 略有不同,當(dāng)進(jìn)行 IP 偽裝時(shí),不需指定要偽裝成哪個(gè) IP,IP 會(huì)從網(wǎng)卡直接讀取,當(dāng)使用撥號(hào)連接時(shí),IP 通常是由 ISP 公司的 DHCP 服務(wù)器指派的,這個(gè)時(shí)候 MASQUERADE 特別有用。范例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

LOG 將封包相關(guān)訊息紀(jì)錄在 /var/log 中,詳細(xì)位置請(qǐng)查閱 /etc/syslog.conf 配置文件,進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其規(guī)則。例如:

iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

SNAT 改寫封包來(lái)源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將直接跳往下一個(gè)規(guī)則(mangleostrouting)。范例如下:

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

DNAT 改寫封包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將會(huì)直接跳往下一個(gè)規(guī)煉(filter:input 或 filter:forward)。范例如下:

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination
192.168.1.1-192.168.1.10:80-100

MIRROR 鏡像數(shù)據(jù)包,也就是將來(lái)源 IP 與目的地 IP 對(duì)調(diào)后,將數(shù)據(jù)包送回,進(jìn)行完此處理動(dòng)作后,將會(huì)中斷過(guò)濾程序。
QUEUE 中斷過(guò)濾程序,將數(shù)據(jù)包放入隊(duì)列,交給其它程序處理。透過(guò)自行開(kāi)發(fā)的處理程序,可以進(jìn)行其它應(yīng)用,例如:計(jì)算聯(lián)機(jī)費(fèi).......等。
RETURN 結(jié)束在目前規(guī)則鏈中的過(guò)濾程序,返回主規(guī)則鏈繼續(xù)過(guò)濾,如果把自訂規(guī)則鏈看成是一個(gè)子程序,那么這個(gè)動(dòng)作,就相當(dāng)提早結(jié)束子程序并返回到主程序中。
MARK 將數(shù)據(jù)包標(biāo)上某個(gè)代號(hào),以便提供作為后續(xù)過(guò)濾的條件判斷依據(jù),進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。范例如下:

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

文章來(lái)源:
http://www.lampbo.org/linux-xuexi/linux-advance/iptables-jiaocheng-principle-introduce.html
http://www.lampbo.org/linux-xuexi/linux-advance/iptables-options.html
http://www.lampbo.org/linux-xuexi/linux-advance/iptables-config-rules-demo.html

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

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