淺談iptables

1.Iptables是什么

iptables是linux系統(tǒng)下用來做防火墻的二進(jìn)制文件(linux上位于/sbin/iptables娩脾,android中位于/system/bin/iptables)赵誓,底層依賴于內(nèi)核的netfilter模塊,用來完成封包過濾柿赊、封包重定向和網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)等功能(在android上需要root使用)架曹。

2.Iptables怎么用

舉個(gè)例子來簡單看看iptables命令的基本用法。

iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to 8123

意思是在nat轉(zhuǎn)發(fā)表的OUTPUT輸出鏈中增加這樣一條規(guī)則:倘若OUTPUT輸出鏈攔到了tcp請求闹瞧,則將其重定向到本地的8123端口绑雄。

可以看到iptables中有規(guī)則的概念奥邮,那么先通過iptables傳輸數(shù)據(jù)包的過程來簡單了解下表和鏈?zhǔn)鞘裁匆约八麄冎g的關(guān)系万牺。

image-20210417103442251.png
  1. 當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí)罗珍,它首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要轉(zhuǎn)送出去脚粟。

  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)過OUTPUT鏈噪沙,然后到達(dá)POSTROUTING鏈輸出。

  3. 如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的吐根,且內(nèi)核允許轉(zhuǎn)發(fā)正歼,數(shù)據(jù)包就會(huì)如圖所示向右移動(dòng),經(jīng)過FORWARD鏈拷橘,然后到達(dá)POSTROUTING鏈輸出局义。

可以看到就是對(duì)數(shù)據(jù)包傳輸路徑的一種抽象,一個(gè)數(shù)據(jù)包根據(jù)其具體場景以固定的順序依次經(jīng)過PREROUTING冗疮、INPUT等各個(gè)鏈萄唇,在經(jīng)過各個(gè)鏈時(shí),又有不同的表在監(jiān)聽這個(gè)鏈术幔,而nat另萤、filter等中有包含一系列的規(guī)則,當(dāng)一個(gè)數(shù)據(jù)包到達(dá)一個(gè)鏈時(shí)特愿,iptables就會(huì)從鏈中第一條規(guī)則開始檢查仲墨,看該數(shù)據(jù)包是否滿足規(guī)則所定義的條件。如果滿足揍障,系統(tǒng)就會(huì)根據(jù)該條規(guī)則所定義的方法處理該數(shù)據(jù)包目养;否則iptables將繼續(xù)檢查下一條規(guī)則。

值得注意的是毒嫡,

  1. 不同的表允許監(jiān)聽的鏈?zhǔn)遣煌陌┮希缫话阌脕碜鼍W(wǎng)絡(luò)地址轉(zhuǎn)換的nat表只能監(jiān)聽PREOUTROUTING、POSTROUTING和OUTPUT鏈兜畸。

  2. 監(jiān)聽同一個(gè)鏈上的多個(gè)表的檢查的順序是有先后的努释,raw->mangle->nat->filter。

至此我們了解了表咬摇、鏈和規(guī)則是什么以及他們之間的關(guān)系伐蒂,下面來具體看下iptables命令的基本用法

img

更多關(guān)于各command肛鹏、parameter的具體含義以及用法可以參考https://wangchujiang.com/linux-command/c/iptables.html

3.Iptables的基本工作原理

iptables對(duì)網(wǎng)絡(luò)數(shù)據(jù)包做過濾或攔截時(shí)其維度只能局限于網(wǎng)絡(luò)數(shù)據(jù)包收發(fā)的ip地址逸邦、端口號(hào)恩沛、網(wǎng)卡、tcp/udp協(xié)議缕减,因此可以推測iptables最終是在ip層對(duì)網(wǎng)絡(luò)數(shù)據(jù)包做的攔截雷客。

fflmrw0ar5.png

那iptables基于netfilter具體是怎么做到在各個(gè)鏈上對(duì)數(shù)據(jù)包做攔截的呢?

/net/ipv4/ip_output.c

int ip_output(struct sock *sk, struct sk_buff *skb)
{
    ...
    return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, skb, NULL, dev,
                ip_finish_output,
                !(IPCB(skb)->flags & IPSKB_REROUTED));
}

/net/ipv4/ip_input.c

int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{   
    ...
    return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL,
               ip_rcv_finish);
    ...

/net/ipv4/ip_forward.c

int ip_forward(struct sk_buff *skb)
{
    ...
        return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev,
               rt->dst.dev, ip_forward_finish);
    ...

可以看到內(nèi)核在每一個(gè)數(shù)據(jù)轉(zhuǎn)發(fā)的關(guān)鍵節(jié)點(diǎn)都調(diào)用了NF_HOOK這個(gè)宏桥狡,來看下NF_HOOK這個(gè)宏干了啥

#define NF_HOOK(pf, hook, skb, indev, outdev, okfn)                              
({int __ret;                                                                      
if (list_empty(&nf_hooks[pf][hook]) ||//查看這個(gè)hook點(diǎn)是否有hook函數(shù)要執(zhí)行            
    (__ret=nf_hook_slow(pf, hook, &(skb), indev, outdev, okfn, INT_MIN)) == 1)//執(zhí)行具體的hook函數(shù)
        __ret = (okfn)(skb);//若hook決定不攔截搅裙,則繼續(xù)回調(diào)原有函數(shù)
__ret;})

關(guān)于NF_HOOK相關(guān)具體邏輯可參見https://sites.google.com/site/ibmsdu/network-security-development/netfilter%E8%AE%BE%E8%AE%A1%E4%B8%8E%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裹芝,隨后出現(xiàn)的幾起案子部逮,更是在濱河造成了極大的恐慌,老刑警劉巖局雄,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甥啄,死亡現(xiàn)場離奇詭異存炮,居然都是意外死亡炬搭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門穆桂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宫盔,“玉大人,你說我怎么就攤上這事享完∽瓢牛” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵般又,是天一觀的道長彼绷。 經(jīng)常有香客問我,道長茴迁,這世上最難降的妖魔是什么寄悯? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮堕义,結(jié)果婚禮上猜旬,老公的妹妹穿的比我還像新娘。我一直安慰自己倦卖,他們只是感情好洒擦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怕膛,像睡著了一般熟嫩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褐捻,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天掸茅,我揣著相機(jī)與錄音洋侨,去河邊找鬼。 笑死倦蚪,一個(gè)胖子當(dāng)著我的面吹牛希坚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陵且,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼裁僧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慕购?” 一聲冷哼從身側(cè)響起聊疲,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沪悲,沒想到半個(gè)月后获洲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殿如,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年贡珊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涉馁。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡门岔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烤送,到底是詐尸還是另有隱情寒随,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布帮坚,位于F島的核電站妻往,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏试和。R本人自食惡果不足惜讯泣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灰署。 院中可真熱鬧判帮,春花似錦、人聲如沸溉箕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肴茄。三九已至晌畅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寡痰,已是汗流浹背抗楔。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工棋凳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人连躏。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓剩岳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親入热。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拍棕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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