Linux防火墻很多年的產(chǎn)品迭代過(guò)程是ipfw->ipchains->iptables>nftables(4.0)狭吼。而我們現(xiàn)在用的是iptables這代產(chǎn)品。
iptables說(shuō)明
是一種功能強(qiáng)大的信息包過(guò)濾工具邑滨,可用于添加、編輯和除去規(guī)則叶眉,這些規(guī)則是在做信息包過(guò)濾決定時(shí)慷妙,防火墻所遵循和組成的規(guī)則僻焚。這些規(guī)則存儲(chǔ)在專用的信息包過(guò)濾表中,而這些表集成在 Linux 內(nèi)核中膝擂。在信息包過(guò)濾表中虑啤,規(guī)則被分組放在鏈(chain)中。
Linux在內(nèi)核中設(shè)置了五個(gè)位置能實(shí)現(xiàn)包處理猿挚,任何報(bào)文到達(dá)這五個(gè)位置都要檢查和我們?cè)O(shè)置的規(guī)則是否相符咐旧,是否滿足驶鹉,滿足以后怎么處理绩蜻,如沒(méi)有符合的條件就按照默認(rèn)處理機(jī)制去處理。因用戶是不能操作內(nèi)核的室埋,內(nèi)核中的所有接口都是通過(guò)系統(tǒng)調(diào)用向外提供的办绝,所以Linux開(kāi)發(fā)了一個(gè)在用戶空間專門讓用戶通過(guò)系統(tǒng)調(diào)用操作內(nèi)核的工具伊约,可以用這個(gè)工具寫內(nèi)容送到內(nèi)核這五個(gè)位置上,幫我們來(lái)生成規(guī)則孕蝉,這個(gè)工具在用戶空間上叫做iptables,在內(nèi)核空間上叫做netfilter屡律。
iptables五鏈
Linux內(nèi)核中五個(gè)能過(guò)濾報(bào)文的位置稱為五個(gè)鉤子,分別是 prerouting降淮、input超埋、output、forward佳鳖、postrouting霍殴,此后在鉤子上定義規(guī)則。當(dāng)iptables引用這些鉤子時(shí)不能使用鉤子名稱系吩,要使用與鉤子名同名的全大寫字母——鏈来庭。
這五個(gè)鏈分別是
- PREROUTING:報(bào)文進(jìn)入路由表之前
- INPUT:通過(guò)路由表后目標(biāo)IP為本機(jī)
- FORWARD:通過(guò)路由表后目標(biāo)IP不為本機(jī)
- OUTPUT:由本機(jī)產(chǎn)生,向外轉(zhuǎn)發(fā)
- POSTROUTING:發(fā)送到網(wǎng)卡接口之前
流入的報(bào)文數(shù)據(jù)先在PREROUTING上做一些處理穿挨,然后在路由決策上判斷報(bào)文中目標(biāo)IP是本機(jī)還是其他主機(jī)月弛,如果是本機(jī)發(fā)送到INPUT處理,是其他主機(jī)發(fā)送到FORWARD進(jìn)行轉(zhuǎn)發(fā)科盛,到這一步的全部流程我們稱之為前半場(chǎng)或上半場(chǎng)帽衙。之后本機(jī)處理好報(bào)文數(shù)據(jù)向外發(fā)送時(shí),或者本機(jī)進(jìn)程主動(dòng)訪問(wèn)外部主機(jī)發(fā)送報(bào)文時(shí)都要發(fā)給OUTPUT來(lái)處理土涝,無(wú)論是通過(guò)FORWARD進(jìn)行報(bào)文轉(zhuǎn)發(fā)或是來(lái)自O(shè)UTPUT過(guò)濾后的本機(jī)報(bào)文都要在次通過(guò)路由決策來(lái)判斷經(jīng)由主機(jī)的哪塊網(wǎng)卡發(fā)送報(bào)文佛寿,每一塊網(wǎng)卡都有下一條,都有下一臺(tái)主機(jī)但壮,路由來(lái)決策一條最佳的路線冀泻。路由過(guò)后,數(shù)據(jù)報(bào)文還在本地之前蜡饵,可通過(guò)POSTROUTING對(duì)數(shù)據(jù)最后做一次處理弹渔。從上半場(chǎng)之后的全部步驟稱為后半場(chǎng)或下半場(chǎng)。
按照?qǐng)?bào)文流向區(qū)分:
- 流入本機(jī):PREROUTING --> INPUT
- 由本機(jī)流出:OUTPUT --> POSTROUTING
- 轉(zhuǎn)發(fā):PREROUTING --> FORWARD --> POSTROUTING
iptables四表
上面的五鏈?zhǔn)前凑説ook鉤子來(lái)區(qū)分的溯祸,而四表是按照對(duì)數(shù)據(jù)包的操作來(lái)區(qū)分肢专。4個(gè)表:filter,nat,mangle,raw,默認(rèn)表是filter(沒(méi)有指定表的時(shí)候就是filter表)焦辅。表的處理優(yōu)先級(jí):raw>mangle>nat>filter博杖。
- filter:過(guò)濾,防火墻
PREROUTING筷登, OUTPUT - nat:修改源IP端口或目標(biāo)IP或端口
PREROUTING剃根,[INPUT,]OUTPUT前方,POSTROUTING - mangle:拆解修改報(bào)文再封裝
PREROUTING狈醉,INPUT廉油,F(xiàn)ORWARD,OUTPUT苗傅,POSTROUTING
raw:關(guān)閉nat表上的連接追蹤機(jī)制
PREROUTING抒线, OUTPUT
iptables數(shù)據(jù)包流程
基本步驟如下:
- 數(shù)據(jù)包到達(dá)網(wǎng)絡(luò)接口,比如 eth0渣慕。
- 進(jìn)入 raw 表的 PREROUTING 鏈嘶炭,作用是在連接跟蹤之前事先處理數(shù)據(jù)包。
- 如果進(jìn)行了連接跟蹤逊桦,在此處理旱物。
- 進(jìn)入 mangle 表的 PREROUTING 鏈,在此可以修改數(shù)據(jù)包卫袒,比如 TOS 等宵呛。
- 進(jìn)入 nat 表的 PREROUTING 鏈,可以在此做DNAT夕凝,但不要做過(guò)濾宝穗。
- 決定路由,看是交給本地主機(jī)還是轉(zhuǎn)發(fā)給其它主機(jī)码秉。
這里分兩種不同的情況逮矛,一種是數(shù)據(jù)包轉(zhuǎn)發(fā)給其它主機(jī),這時(shí)候它會(huì)依次經(jīng)過(guò):
- 進(jìn)入 mangle 表的 FORWARD 鏈转砖,這里也比較特殊须鼎,這是在第一次路由決定之后,在進(jìn)行最后的路由決定之前府蔗,我們?nèi)匀豢梢詫?duì)數(shù)據(jù)包進(jìn)行某些修改晋控。
- 進(jìn)入 filter 表的 FORWARD 鏈,在這里我們可以對(duì)所有轉(zhuǎn)發(fā)的數(shù)據(jù)包進(jìn)行過(guò)濾姓赤。需要注意的是:經(jīng)過(guò)這里的數(shù)據(jù)包是轉(zhuǎn)發(fā)的赡译,方向是雙向的。
- 進(jìn)行路由決定不铆。
- 進(jìn)入 mangle 表的 POSTROUTING 鏈蝌焚,到這里已經(jīng)做完了所有的路由決定,但數(shù)據(jù)包仍然在本地主機(jī)誓斥,我們還可以進(jìn)行某些修改只洒。
- 進(jìn)入 nat 表的 POSTROUTING 鏈,在這里一般都是用來(lái)做 SNAT 劳坑,不要在這里進(jìn)行過(guò)濾毕谴。
- 進(jìn)入出去的網(wǎng)絡(luò)接口。完畢。
另一種情況是析珊,數(shù)據(jù)包就是發(fā)給本地主機(jī)的,那么它會(huì)依次穿過(guò):
- 進(jìn)入 mangle 表的 INPUT 鏈蔑穴,這里是在路由之后忠寻,交由本地主機(jī)之前,我們也可以進(jìn)行一些相應(yīng)的修改存和。
- 進(jìn)入 filter 表的 INPUT 鏈奕剃,在這里我們可以對(duì)流入的所有數(shù)據(jù)包進(jìn)行過(guò)濾,無(wú)論它來(lái)自哪個(gè)網(wǎng)絡(luò)接口捐腿。
- 交給本地主機(jī)的應(yīng)用程序進(jìn)行處理纵朋。
- 處理完畢后進(jìn)行路由決定,看該往那里發(fā)出茄袖。
- 進(jìn)入 raw 表的 OUTPUT 鏈操软,這里是在連接跟蹤處理本地的數(shù)據(jù)包之前。
- 連接跟蹤對(duì)本地的數(shù)據(jù)包進(jìn)行處理宪祥。
- 進(jìn)入 mangle 表的 OUTPUT 鏈聂薪,在這里我們可以修改數(shù)據(jù)包,但不要做過(guò)濾蝗羊。
- 進(jìn)入 nat 表的 OUTPUT 鏈藏澳,可以對(duì)防火墻自己發(fā)出的數(shù)據(jù)做 NAT 。
- 進(jìn)入 filter 表的 OUTPUT 鏈耀找,可以對(duì)本地出去的數(shù)據(jù)包進(jìn)行過(guò)濾翔悠。
- 再次進(jìn)行路由決定。
- 進(jìn)入 mangle 表的 POSTROUTING 鏈野芒,同上一種情況的第9步蓄愁。注意,這里不光對(duì)經(jīng)過(guò)防火墻的數(shù)據(jù)包進(jìn)行處理狞悲,還對(duì)防火墻自己產(chǎn)生的數(shù)據(jù)包進(jìn)行處理涝登。
- 進(jìn)入 nat 表的 POSTROUTING 鏈,同上一種情況的第10步效诅。
- 進(jìn)入出去的網(wǎng)絡(luò)接口胀滚。完畢。