iptables指令邏輯詳解

前言:本文主要講解iptables的基本概念,工作處理流程,配置指令

 

一、基本概念

iptables用以進行網絡防火牆,具體概念由表(table)、鏈(Chain)、規則構成。一個iptables包含多個表,一個表包含多條鏈、一條鏈包含多條規則,每條規則包含一個匹配項和數據包處理動作。iptables包含filter、nat、mangle、raw四張表,其中filter表最常用,鏈一共有PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING五條鏈(hook,即5個鉤子函數),每個鏈上都有一些規則,一個規則定義了匹配模式和處理動作。具體每張表只能包含特定鏈,而一條鏈可以有多種規則,指定匹配模式和處理方式,如果一個數據包無法匹配鏈上的任何一條規則,則採取默認處理動作。

注:一共有4張表、5條鏈,但是每張表都只能包含特定的鏈,每條鏈可以包含不同的規則。具體關係如下圖:

 

二、iptables處理流程

在得知iptables內部的靜態結構後,需要進一步瞭解各個模塊間的相互作用,如何實現防火牆,檢測、修改、轉發、重定向、丟棄數據包的。理解iptable如何工作關鍵是理解下圖:

 

 

整個iptables的封包流向如上圖所示:

 封包首先經過nat->PREROUTING,進行路由判斷,本包數據是轉發還是放行進入本機,是否需要進行網絡地址轉換。若果需要轉發則走filter->FORWARD鏈,如果放行進本機,走filter->INPUT鏈。所以網絡封包有兩條線路:

1)轉發線路:

nat-PREROUTING  ------------> filter-FORWARD-------------->nat-POSTROUTING

2)放行路線:

nat-PREROUTING------->filter-INPUT-------->local_process--------->nat-OUTPUT---------->filter-OUTPUT------->nat-POSTROUTING

更詳細的流向:

三、iptables配置指令

指令基本模式如下:

iptables [-t table_name] -option [chain_name] [rule_no] [rule] [-j action] 
表示對錶tablbe_name中的chain_name鏈的規則執行<option>操作。表名由-t參數指定,chain_name指定鏈,rule_no指定chain_name鏈中的第幾條規則(規則下標從1開始),rule用以定義規則的匹配模式(數據包匹配),action表示匹配rule的數據包採取何種動作。

1. -t table_name

如果缺少表名,則表示對錶filter中chain_name的鏈執行操作。

 

2. 對於option說明

  • 管理鏈上規則:(增、刪、改、查)

-A:在規則鏈後附加一條規則

-I:在規則連前添加一條規則

-D:刪除一條規則,需要指定規則號

-F:清空鏈上所有規則

-R:替換某條規則

-L:列出鏈中所有規則,不指定鏈名則查所有的鏈。

 

  • 鏈本身管理

-N:創建一個新鏈

-X:刪除一條鏈

-E:重新命名鏈

-P:對鏈指定默認的處理動作,如果某個數據包匹配不到規則,採取默認動作

 

3. 對於rule的寫法:

rule表示爲條件匹配,包含了三種匹配:基本匹配、拓展匹配;拓展匹配又分爲隱式拓展匹配、顯示拓展匹配

  • 基本匹配:

一般參數都是單斜杆開始

 -p 協議名 [-i/o 網卡名]  [-s 源IP/源子網]  [-d 目標IP/目標子網] 

-i/o:

指定出入口網卡名,例如 -i eth1,指定網卡eth流入的數據包

-p:

指定協議,-p tcp,指定tcp協議

-s :

指定源ip

-d:

指定目的ip

利用以上參數來對數據包進行過濾,即匹配規則。

  • 顯示拓展匹配:

顯式拓展匹配表示用-m 選項顯示指定拓展項的類型,而後指定該類型拓展項的指定參數,例如

-m limit --limit 3/s
這一條匹配項表示該拓展項爲limit(表示是限制),--limit是該類拓展項的一個限制速率的參數名。就是限制速率。再者
-m state --state NEW ESTABLISTHED 

指定state拓展項,表示檢查連接狀態,--state指定要檢查的狀態爲NEW ESTABLISHED。

常用顯示拓展項:

 

  • 隱式拓展項:

隱式拓展項即不需要使用-m ext_name來指定拓展的名稱,可以省略。例如

-m tcp、-m udp、-m icmp,但是省略的前提條件是包含-p tcp、-p udp、-p icmp時可以省略。

隱式拓展項的參數如下:

4. -j

跳到一個動作處理數據包,可以是默認動作,也可以是一個自定義鏈。

ACCEPT

REJECT

DROP

RETURN

DNAT

該動作用以對進入本機的ip封包進行網絡地址轉,一般後面會跟隨參數--to-destination 192.168.0.101類似的內網地址參數用以Nat。

 

iptables -t nat -A PREROUTING -i  eth0 -p tcp -d 139.151.134.155 --dport 8080 -j DNAT --to-destination 192.168.0.101 

SNAT

該動作用以對出去本機的ip封包進行網絡地址轉,一般後面會跟隨參數--to-source 139.151.134.155類似的外網可用地址。

iptables -t nat -A POSTROTING -o eth0 -p tcp -j SNAT --to-source 139.151.134.155
REDIRECT 

該動作用以端口重定向 

iptables -t nat -A PREROUTING  -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080-8090

 

參數解釋:

-P 設置默認策略:iptables -P INPUT (DROP
-F 清空規則鏈
-L 查看規則鏈
-A 在規則鏈的末尾加入新規則
-I num 在規則鏈的頭部加入新規則
-D num 刪除某一條規則
-s 匹配來源地址IP/MASK,加歎號"!"表示除這個IP外。
-d 匹配目標地址
-i 網卡名稱 匹配從這塊網卡流入的數據
-o 網卡名稱 匹配從這塊網卡流出的數據
-p 匹配協議,如tcp,udp,icmp
--dport num 匹配目標端口號
--sport num 匹配來源端口號

大寫字母都是指定操作動作。

 

-t, --table table 對指定的表 table 進行操作, table 必須是 raw, nat,filter,mangle 中的一個。如果不指定此選項,默認的是 filter 表。

 
# 通用匹配:源地址目標地址的匹配
-p:指定要匹配的數據包協議類型;
-s, --source [!] address[/mask] :把指定的一個/一組地址作爲源地址,按此規則進行過濾。當後面沒有 mask 時,address 是一個地址,比如:192.168.1.1;當 mask 指定時,可以表示一組範圍內的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但這裏是指定地址爲目的地址,按此進行過濾。
-i, --in-interface [!] <網絡接口name> :指定數據包的來自來自網絡接口,比如最常見的 eth0 。注意:它只對 INPUT,FORWARD,PREROUTING 這三個鏈起作用。如果沒有指定此選項, 說明可以來自任何一個網絡接口。同前面類似,"!" 表示取反。
-o, --out-interface [!] <網絡接口name> :指定數據包出去的網絡接口。只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起作用。

 
# 查看管理命令
-L, --list [chain] 列出鏈 chain 上面的所有規則,如果沒有指定鏈,列出表上所有鏈的所有規則。

 
# 規則管理命令
-A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規則,也就是說,這條規則會被放到最後,最後纔會被執行。規則是由後面的匹配來指定。
-I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規則。如果指定的規則號是1,則在鏈的頭部插入。這也是默認的情況,如果沒有指定規則號。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個或多個指定規則。
-R num:Replays替換/修改第幾條規則

 
# 鏈管理命令(這都是立即生效的)
-P, --policy chain target :爲指定的鏈 chain 設置策略 target。注意,只有內置的鏈才允許有策略,用戶自定義的是不允許的。
-F, --flush [chain] 清空指定鏈 chain 上面的所有規則。如果沒有指定鏈,清空該表上所有鏈的所有規則。
-N, --new-chain chain 用指定的名字創建一個新的鏈。
-X, --delete-chain [chain] :刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鏈。這並不會對鏈內部照成任何影響。
-Z, --zero [chain] :把指定鏈,或者表中的所有鏈上的所有計數器清零。
-m,  指定拓展項,具體拓展項見help。
-j, --jump target <指定目標> :即滿足某條件時該執行什麼樣的動作。target 可以是內置的目標,比如 ACCEPT,也可以是用戶自定義的鏈。
-h:顯示幫助信息;

https://wangchujiang.com/linux-command/c/iptables.html

https://www.91yun.co/archives/1690

 

四、規則保存與恢復:

iptables-save

iptables-restore

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章