iptables的四表五鏈與NAT工作原理

image

本文主要介紹了iptables的基本工作原理和四表五鏈等基本概念以及NAT的工作原理齐媒。

1蹦浦、iptables簡介

我們先來看一下netfilter官網(wǎng)對iptables的描述:

iptables is the userspace command line program used to configure the Linux 2.4.x and later packet filtering ruleset. It is targeted towards system administrators.

Since Network Address Translation is also configured from the packet filter ruleset, iptables is used for this, too.

The iptables package also includes ip6tables. ip6tables is used for configuring the IPv6 packet filter.

也就是說iptables實際上只是位于用戶空間的一個面向系統(tǒng)管理員的Linux防火墻的管理工具而已菲饼,而真正實現(xiàn)防火墻功能的是netfilter吵护,它是Linux內(nèi)核中實現(xiàn)包過濾的內(nèi)核模塊赡若,iptables對應(yīng)在內(nèi)核中的模塊應(yīng)該是ip_tables达布,我們查看系統(tǒng)內(nèi)核中ip_tables的信息的時候可以看到ip_tables.ko這個模塊是在netfilter這個目錄下的。

image

實際上除了iptables還有如nftables逾冬、firewalld等防火墻工具都是在用戶空間(用戶層)對相應(yīng)的內(nèi)核空間中對應(yīng)的netfilter相關(guān)的模塊進行操作的工具黍聂。

2、iptables的四表五鏈

2.1 iptables流程圖

首先我們來看一下下面的這張圖了解一下iptables中的表和鏈的概念身腻。圖中使用箭頭展示了用戶訪問使用了iptables的機器的過程产还,其中按照箭頭的順序我們就可以將其梳理為一條大的帶有分支的鏈條,在每個需要進行操作的模塊處都標有名稱和相應(yīng)的括號嘀趟,括號內(nèi)的就是iptables的四表脐区,而每個模塊都可以視為一個鏈。

image

CentOS7中的input鏈中還有nat表她按,但是在CentOS6中并沒有牛隅。

之所以叫做鏈就是因為在訪問該鏈的時候會按照每個鏈對應(yīng)的表依次進行查詢匹配執(zhí)行的操作,如PREROUTING鏈對應(yīng)的就是(raw->mangle->nat)尤溜,每個表按照優(yōu)先級順序進行連接倔叼,每個表中還可能有多個規(guī)則,因此最后看起來就像鏈一樣宫莱,因此稱為鏈丈攒。而iptables的表中存儲的就是對應(yīng)的規(guī)則和需要執(zhí)行的操作,這里以路由器為例查看其中iptablesfilter表:

image

注意每一個鏈對應(yīng)的表都是不完全一樣的,表和鏈之間是多對多的對應(yīng)關(guān)系巡验。但是不管一個鏈對應(yīng)多少個表际插,它的表都是按照下面的優(yōu)先順序來進行查找匹配的。

表的處理優(yōu)先級:raw>mangle>nat>filter显设。

2.2 四表

iptables的四個表iptable_filter框弛,iptable_mangleiptable_nat捕捂,iptable_raw瑟枫,默認表是filter(沒有指定表的時候就是filter表)。

  • filter 表:用來對數(shù)據(jù)包進行過濾指攒,具體的規(guī)則要求決定如何處理一個數(shù)據(jù)包慷妙。

    對應(yīng)的內(nèi)核模塊為:iptable_filter,其表內(nèi)包括三個鏈:input允悦、forward膝擂、output;

  • nat 表:nat 全稱:network address translation 網(wǎng)絡(luò)地址轉(zhuǎn)換,主要用來修改數(shù)據(jù)包的 IP 地址隙弛、端口號信息架馋。

    對應(yīng)的內(nèi)核模塊為:iptable_nat,其表內(nèi)包括三個鏈:prerouting全闷、postrouting叉寂、output;

  • mangle 表:主要用來修改數(shù)據(jù)包的服務(wù)類型,生存周期室埋,為數(shù)據(jù)包設(shè)置標記办绝,實現(xiàn)流量整形伊约、策略路由等姚淆。

    對應(yīng)的內(nèi)核模塊為:iptable_mangle,其表內(nèi)包括五個鏈:prerouting屡律、postrouting腌逢、inputoutput超埋、forward;

  • raw 表:主要用來決定是否對數(shù)據(jù)包進行狀態(tài)跟蹤搏讶。

    對應(yīng)的內(nèi)核模塊為:iptable_raw,其表內(nèi)包括兩個鏈:output霍殴、prerouting;

raw表只使用在PREROUTING鏈和OUTPUT鏈上,因為優(yōu)先級最高媒惕,從而可以對收到的數(shù)據(jù)包在系統(tǒng)進行ip_conntrack(連接跟蹤)前進行處理。一但用戶使用了raw表,在某個鏈上来庭,raw表處理完后妒蔚,將跳過NAT表和ip_conntrack處理,即不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理了。RAW表可以應(yīng)用在那些不需要做nat的情況下肴盏,以提高性能科盛。

2.3 五鏈

iptables的五個鏈PREROUTINGINPUT菜皂,FORWARD贞绵,OUTPUTPOSTROUTING恍飘。

  • input 鏈:當收到訪問防火墻本機地址的數(shù)據(jù)包時榨崩,將應(yīng)用此鏈中的規(guī)則;
  • output 鏈:當防火墻本機向外發(fā)送數(shù)據(jù)包時章母,將應(yīng)用此鏈中的規(guī)則蜡饵;
  • forward 鏈:當收到需要通過防火中轉(zhuǎn)發(fā)給其他地址的數(shù)據(jù)包時,將應(yīng)用此鏈中的規(guī)則胳施,注意如果需要實現(xiàn)forward轉(zhuǎn)發(fā)需要開啟Linux內(nèi)核中的ip_forward功能溯祸;
  • prerouting 鏈:在對數(shù)據(jù)包做路由選擇之前,將應(yīng)用此鏈中的規(guī)則舞肆;
  • postrouting 鏈:在對數(shù)據(jù)包做路由選擇之后焦辅,將應(yīng)用此鏈中的規(guī)則;

2.4 iptables的常見情況

下面我們利用上面的流程圖來對幾種常見的情況解析:關(guān)鍵點在于發(fā)往iptables主機的數(shù)據(jù)包的目的地址是否是iptables主機本機椿胯。如果是筷登,那我們就可以理解為常見的開啟了iptables防火墻的網(wǎng)站服務(wù)器主機;如果不是哩盲,那就是走ip_forward進行轉(zhuǎn)發(fā)前方,比如我們常見的NAT路由器的NAT服務(wù)和策略路由等。如下圖為開啟了ip_forward功能的openwrt路由器廉油。

image

3惠险、NAT工作原理

接下來介紹一些NAT(Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換)的基本知識抒线,眾所周知班巩,IPv4的公網(wǎng)IP地址已經(jīng)枯竭,但是需要接入互聯(lián)網(wǎng)的設(shè)備還在不斷增加嘶炭,這其中NAT就發(fā)揮了很大的作用(此處不討論IPv6)抱慌。NAT服務(wù)器提供了一組私有的IP地址池(10.0.0.0/8、172.16.0.0/12眨猎、192.168.0.0/16)抑进,使得連接該NAT服務(wù)器的設(shè)備能夠獲得一個私有的IP地址(也稱局域網(wǎng)IP/內(nèi)網(wǎng)IP),當設(shè)備需要連接互聯(lián)網(wǎng)的時候睡陪,NAT服務(wù)器將該設(shè)備的私有IP轉(zhuǎn)換成可以在互聯(lián)網(wǎng)上路由的公網(wǎng)IP(全球唯一)寺渗。NAT的實現(xiàn)方式有很多種夕凝,這里我們主要介紹三種:靜態(tài)NAT動態(tài)NAT和網(wǎng)絡(luò)地址端口轉(zhuǎn)換(NAPT)户秤。

3.1 BNAT

  • 靜態(tài)NAT:LVS的官方文檔中也稱為(N-to-N mapping)
    码秉,前面的N指的是局域網(wǎng)中需要聯(lián)網(wǎng)的設(shè)備數(shù)量,后面的N指的是該NAT服務(wù)器所擁有的公網(wǎng)IP的數(shù)量鸡号。既然數(shù)量相等转砖,那么就可以實現(xiàn)靜態(tài)轉(zhuǎn)換,即一個設(shè)備對應(yīng)一個公網(wǎng)IP鲸伴,這時候的NAT服務(wù)器只需要維護一張靜態(tài)的NAT映射轉(zhuǎn)換表府蔗。

    內(nèi)網(wǎng)IP 外網(wǎng)IP
    192.168.1.55 219.152.168.222
    192.168.1.59 219.152.168.223
    192.168.1.155 219.152.168.224
  • 動態(tài)NAT:LVS的官方文檔中也稱為(M-to-N mapping)
    ,注意這時候的M>N汞窗,也就是說局域網(wǎng)中需要聯(lián)網(wǎng)的設(shè)備數(shù)量多于NAT服務(wù)器擁有的公網(wǎng)IP數(shù)量姓赤,這時候就需要由NAT服務(wù)器來實現(xiàn)動態(tài)的轉(zhuǎn)換,這樣每個內(nèi)網(wǎng)設(shè)備訪問公網(wǎng)的時候使用的公網(wǎng)IP就不一定是同一個IP仲吏。

在一些家用路由器中不铆,DMZ是指一部所有端口都暴露在外部網(wǎng)絡(luò)的內(nèi)部網(wǎng)絡(luò)主機,除此以外的端口都被轉(zhuǎn)發(fā)裹唆。嚴格來說這不是真正的DMZ誓斥,因為該主機仍能訪問內(nèi)部網(wǎng)絡(luò),并非獨立于內(nèi)部網(wǎng)絡(luò)之外的许帐。但真正的DMZ是不允許訪問內(nèi)部網(wǎng)絡(luò)的劳坑,DMZ和內(nèi)部網(wǎng)絡(luò)是分開的。這種 DMZ主機并沒有真正DMZ所擁有的子網(wǎng)劃分的安全優(yōu)勢成畦,其常常以一種簡單的方法將所有端口轉(zhuǎn)發(fā)到另外的防火墻或NAT設(shè)備上距芬。

3.2 NAPT

以上的這兩種都屬于基本網(wǎng)絡(luò)地址轉(zhuǎn)換(Basic NAT),這種轉(zhuǎn)換在技術(shù)上比較簡單循帐,僅支持地址轉(zhuǎn)換框仔,不支持端口映射,這也就帶來了另一個問題就是資源的浪費惧浴。我們知道一個IP實際上可以對應(yīng)多個端口存和,而我們訪問應(yīng)用實際上是通過IP地址+端口號的形式來訪問的,即客戶端訪問的時候發(fā)送請求到服務(wù)器端應(yīng)用程序監(jiān)聽的端口即可實現(xiàn)訪問衷旅。那么NAPT就是在這基礎(chǔ)上的擴展延申,它在IP地址的基礎(chǔ)上加上了端口號纵朋,支持了端口映射的功能柿顶。

  • NAPT:NAPT實際上還可以分為源地址轉(zhuǎn)換(SNAT)目的地址轉(zhuǎn)換(DNAT)兩種。注意這個源地址和目的地址是針對NAT服務(wù)器而言操软,我們通過下面一張圖來說明:
image

首先我們這里有一個客戶端嘁锯,上面運行著一個瀏覽器,假設(shè)它使用的是5566端口,它需要訪問14.25.23.47這個Web服務(wù)器的HTTPS服務(wù)的443端口家乘,它在訪問的時候需要經(jīng)過局域網(wǎng)出口的這個路由器網(wǎng)關(guān)(同時也是NAT服務(wù)器)蝗羊,路由器對它進行一個NAPT的源地址轉(zhuǎn)換(SNAT),這個時候客戶端的請求經(jīng)過NAT服務(wù)器之后變成了222.17.23.45:7788這個IP端口對Web服務(wù)器的443端口進行訪問仁锯。注意在這個過程中耀找,目標服務(wù)器(Web服務(wù)器)的IP和端口是一直沒有改變的。

接下來在Web服務(wù)器接收到請求之后业崖,需要返回數(shù)據(jù)給發(fā)送請求的設(shè)備野芒,注意這時候web服務(wù)器返回數(shù)據(jù)的指向IP應(yīng)該是剛剛NAT服務(wù)器發(fā)送請求的227.17.23.45:7788這個IP端口,這時候路由器網(wǎng)關(guān)再進行一次NAPT的目標地址轉(zhuǎn)換(DNAT)双炕,目標的IP端口就是最開始發(fā)送請求的192.168.1.77:5566這個端口狞悲。

實際上對于大多數(shù)人來說日常接觸到最多的就是路由器做的SNAT和DNAT操作,它們一般成對出現(xiàn)用于解決公網(wǎng)IP資源不足的問題妇斤,需要注意的是NAT是可以進行嵌套操作的摇锋,即NAT下面的網(wǎng)絡(luò)設(shè)備還可以繼續(xù)做NAT,只要做NAT的網(wǎng)段不和上層的NAT的網(wǎng)段相同即可站超。

4乱投、iptables配置

在了解清楚iptables的工作原理和每個表以及鏈的作用之后,我們就可以根據(jù)其特點進行針對性的配置顷编。

iptables 的基本語法命令格式

iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制類型]
  • 表名戚炫、鏈名:指定iptables命令所操作的,未指定表名時將默認使用filter表媳纬;
  • 管理選項:表示iptables規(guī)則的操作方式双肤,比如:插入增加钮惠、刪除茅糜、查看等;
  • 匹配條件:指定要處理的數(shù)據(jù)包的特征素挽,不符合指定條件的數(shù)據(jù)包不處理蔑赘;
  • 控制類型:指數(shù)據(jù)包的處理方式,比如:允許accept预明、拒絕reject缩赛、丟棄drop日志LOG等撰糠;
iptables 命令的常用管理選項
-A:在指定鏈的末尾添加一條新的規(guī)則
-D:刪除指定鏈中的某一條規(guī)則酥馍,可刪除指定序號或具體內(nèi)容
-I:在指定鏈中插入一條新規(guī)則,未指定序號時默認作為第一條規(guī)則
-R:修改阅酪、替換指定鏈中的某一條規(guī)則旨袒,可指定規(guī)則序號或具體內(nèi)容
-L:列出指定鏈中所有的規(guī)則汁针,未指定鏈名,則列出表中的所有鏈
-F:清空指定鏈中所有的規(guī)則砚尽,未指定鏈名施无,則清空表中的所有鏈
-P:設(shè)置指定鏈的默認策略
-n:使用數(shù)字形式顯示輸出結(jié)果
-v:查看規(guī)則列表時顯示詳細的信息
-h:查看命令幫助信息
--line-numbers:查看規(guī)則列表時,同時顯示規(guī)則在鏈中的順序號

在添加規(guī)則之前我們先開啟iptables的獨立log功能必孤,對于centos6猾骡,我們可以執(zhí)行以下操作:

echo "kern.*     /var/log/iptables.log" >> /etc/rsyslog.conf
# 記錄所有級別的日志到指定目錄中
service rsyslog restart
# 重啟rsyslog服務(wù)使配置生效

接著我們開始添加一條比較有針對性的規(guī)則:

iptables -A INPUT -j LOG --log-prefix "*** INPUT ***" --log-level debug
iptables -t filter -A INPUT -p tcp -s 192.168.100.100 --dport 80 -j REJECT 

上述兩條命令第一條增加了一條記錄日志的規(guī)則,對于INPUT鏈中的所有操作都記錄到日志中隧魄,添加日志前綴*** INPUT ***并設(shè)定日志級別為debug

第二條是在INPUT鏈的filter表中插入一條規(guī)則卓练,限定對192.168.100.100這個IP使用tcp協(xié)議訪問本機的目的端口80端口的時候拒絕掉數(shù)據(jù)包。

image

接著我們嘗試訪問發(fā)現(xiàn)無法正常顯示頁面购啄。

image

再查看日志發(fā)現(xiàn)iptables日志中多了很多請求被拒絕的記錄襟企。

image

再清空所有的規(guī)則,此時可以正常訪問狮含,且不再繼續(xù)記錄日志顽悼,因為記錄日志的那條規(guī)則也被我們清空掉了。

image
image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末几迄,一起剝皮案震驚了整個濱河市蔚龙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌映胁,老刑警劉巖木羹,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異解孙,居然都是意外死亡坑填,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門弛姜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脐瑰,“玉大人,你說我怎么就攤上這事廷臼〔栽冢” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵荠商,是天一觀的道長寂恬。 經(jīng)常有香客問我,道長结啼,這世上最難降的妖魔是什么掠剑? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮郊愧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己唯卖,他們只是感情好型酥,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焦蘑,像睡著了一般盯拱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上例嘱,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天狡逢,我揣著相機與錄音,去河邊找鬼拼卵。 笑死奢浑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的腋腮。 我是一名探鬼主播雀彼,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼即寡!你這毒婦竟也來了徊哑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤聪富,失蹤者是張志新(化名)和其女友劉穎莺丑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墩蔓,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡梢莽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钢拧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟹漓。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖源内,靈堂內(nèi)的尸體忽然破棺而出葡粒,到底是詐尸還是另有隱情,我是刑警寧澤膜钓,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布嗽交,位于F島的核電站,受9級特大地震影響颂斜,放射性物質(zhì)發(fā)生泄漏夫壁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一沃疮、第九天 我趴在偏房一處隱蔽的房頂上張望盒让。 院中可真熱鬧梅肤,春花似錦、人聲如沸邑茄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肺缕。三九已至左医,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間同木,已是汗流浹背浮梢。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留彤路,地道東北人秕硝。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像斩萌,于是被迫代替她去往敵國和親缝裤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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