首頁 > 軟體

Iptables防火牆規則使用詳解

2020-06-16 16:49:37

iptables是組成Linux平台下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網路地址轉換(NAT)等功能。在日常Linux運維工作中,經常會設定iptables防火牆規則,用來加固服務安全。以下對iptables的規則使用做了總結性梳理:

iptables首先需要了解的:
1)規則概念
規則(rules)其實就是網路管理員預定義的條件,規則一般的定義為“如果封包頭符合這樣的條件,就這樣處理這個封包”。規則儲存在核心空間的資訊 包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協定(如TCP、UDP、ICMP)和服務型別(如HTTP、FTP和SMTP)等。
當封包與規則匹配時,iptables就根據規則所定義的方法來處理這些封包,如放行(accept),拒絕(reject)和丟棄(drop)等。設定防火牆的主要工作是新增,修改和刪除等規則。
其中:
匹配(match):符合指定的條件,比如指定的 IP 地址和埠。
丟棄(drop):當一個包到達時,簡單地丟棄,不做其它任何處理。
接受(accept):和丟棄相反,接受這個包,讓這個包通過。
拒絕(reject):和丟棄相似,但它還會向傳送這個包的源主機傳送錯誤訊息。這個錯誤訊息可以指定,也可以自動產生。
目標(target):指定的動作,說明如何處理一個包,比如:丟棄,接受,或拒絕。
跳轉(jump):和目標類似,不過它指定的不是一個具體的動作,而是另一個鏈,表示要跳轉到那個鏈上。
規則(rule):一個或多個匹配及其對應的目標。

2)iptables和netfilter的關係:
Iptables和netfilter的關係是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道 netfilter。其實iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是 netfilter,它是Linux核心中實現包過濾的內部結構。

3)iptables的規則表和鏈
表(tables):提供特定的功能,iptables內建了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾,網路地址轉換、包重構(修改)和資料跟蹤處理。
鏈(chains):是封包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一 條或數條規則。當一個封包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該封包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該封包;否則iptables將繼續檢查下一條規則,如果該封包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的預設策略來處理封包。

Iptables採用“表”和“鏈”的分層結構,在Linux中現在是四張表五個鏈。下面羅列一下這四張表和五個鏈(注意一定要明白這些表和鏈的關係及作用)。

規則表:
    1)filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾封包 核心模組:iptables_filter.
    2)Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用於網路地址轉換(IP、埠) 核心模組:iptable_nat
    3)Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改封包的服務型別、TTL、並且可以設定路由實現QOS核心模組:iptable_mangle(別看這個表這麼麻煩,咱們設定策略時幾乎都不會用到它)
   4)Raw表——兩個鏈:OUTPUT、PREROUTING
作用:決定封包是否被狀態跟蹤機制處理 核心模組:iptable_raw

規則鏈:
   1)INPUT——進來的封包應用此規則鏈中的策略
   2)OUTPUT——外出的封包應用此規則鏈中的策略
   3)FORWARD——轉發封包時應用此規則鏈中的策略
   4)PREROUTING——對封包作路由選擇前應用此鏈中的規則
(記住!所有的封包進來的時侯都先由這個鏈處理)
   5)POSTROUTING——對封包作路由選擇後應用此鏈中的規則
(所有的封包出來的時侯都先由這個鏈處理)

管理和設定iptables規則:

4)iptables傳輸封包的過程

   1)當一個封包進入網絡卡時,它首先進入PREROUTING鏈,核心根據封包目的IP判斷是否需要轉送出去。
   2)如果封包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。封包到了INPUT鏈後,任何進程都會收到它。本機上執行的程式可以傳送封包,這些封包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。
   3)如果封包是要轉發出去的,且核心允許轉發,封包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。

如果還是不清楚封包經過iptables的基本流程,再看下面更具體的流程圖:

從圖中可將iptables封包報文的處理過程分為三種型別:
1)目的為本機的報文
報文以本機為目的地址時,其經過iptables的過程為:
1.封包從network到網絡卡
2.網絡卡接收到封包後,進入raw表的PREROUTING鏈。這個鏈的作用是在連線跟蹤之前處理報文,能夠設定一條連線不被連線跟蹤處理。(註:不要在raw表上新增其他規則)
3.如果設定了連線跟蹤,則在這條連線上處理。
4.經過raw處理後,進入mangle表的PREROUTING鏈。這個鏈主要是用來修改報文的TOS、TTL以及給報文設定特殊的MARK。(註:通常mangle表以給報文設定MARK為主,在這個表裡面,千萬不要做過濾/NAT/偽裝這類的事情)
5.進入nat表的PREROUTING鏈。這個鏈主要用來處理 DNAT,應該避免在這條鏈裡面做過濾,否則可能造成有些報文會漏掉。(註:它只用來完成源/目的地址的轉換)
6.進入路由決定封包的處理。例如決定報文是上本機還是轉發或者其他地方。(註:此處假設報文交給本機處理)
7.進入mangle表的 INPUT 鏈。在把報文實際送給本機前,路由之後,我們可以再次修改報文。
8.進入filter表的 INPUT 鏈。在這兒我們對所有送往本機的報文進行過濾,要注意所有收到的並且目的地址為本機的報文都會經過這個鏈,而不管哪個介面進來的或者它往哪兒去。
9. 進過規則過濾,報文交由本地進程或者應用程式處理,例如伺服器或者用戶端程式。
2)本地主機發出報文
封包由本機發出時,其經過iptables的過程為:
1.本地進程或者應用程式(例如伺服器或者用戶端程式)發出封包。
2.路由選擇,用哪個源地址以及從哪個介面上出去,當然還有其他一些必要的資訊。
3.進入raw表的OUTPUT鏈。這裡是能夠在連線跟蹤生效前處理報文的點,在這可以標記某個連線不被連線跟蹤處理。
4.連線跟蹤對原生的封包進行處理。
5.進入 mangle 表的 OUTPUT 鏈,在這裡我們可以修改封包,但不要做過濾(以避免副作用)。
6.進入 nat 表的 OUTPUT 鏈,可以對防火牆自己發出的資料做目的NAT(DNAT) 。
7.進入 filter 表的 OUTPUT 鏈,可以對本地出去的封包進行過濾。
8.再次進行路由決定,因為前面的 mangle 和 nat 表可能修改了報文的路由資訊。
9.進入 mangle 表的 POSTROUTING 鏈。這條鏈可能被兩種報文遍歷,一種是轉發的報文,另外就是本機產生的報文。
10.進入 nat 表的 POSTROUTING 鏈。在這我們做源 NAT(SNAT),建議你不要在這做報文過濾,因為有副作用。即使你設定了預設策略,一些報文也有可能溜過去。
11.進入出去的網路介面。
3)轉發報文
報文經過iptables進入轉發的過程為:
1.封包從network到網絡卡
2.網絡卡接收到封包後,進入raw表的PREROUTING鏈。這個鏈的作用是在連線跟蹤之前處理報文,能夠設定一條連線不被連線跟蹤處理。(註:不要在raw表上新增其他規則)
3.如果設定了連線跟蹤,則在這條連線上處理。
4.經過raw處理後,進入mangle表的PREROUTING鏈。這個鏈主要是用來修改報文的TOS、TTL以及給報文設定特殊的MARK。(註:通常mangle表以給報文設定MARK為主,在這個表裡面,千萬不要做過濾/NAT/偽裝這類的事情)
5.進入nat表的PREROUTING鏈。這個鏈主要用來處理 DNAT,應該避免在這條鏈裡面做過濾,否則可能造成有些報文會漏掉。(註:它只用來完成源/目的地址的轉換)
6.進入路由決定封包的處理。例如決定報文是上本機還是轉發或者其他地方。(註:此處假設報文進行轉發)
7.進入 mangle 表的 FORWARD 鏈,這裡也比較特殊,這是在第一次路由決定之後,在進行最後的路由決定之前,我們仍然可以對封包進行某些修改。
8.進入 filter 表的 FORWARD 鏈,在這裡我們可以對所有轉發的封包進行過濾。需要注意的是:經過這裡的封包是轉發的,方向是雙向的。
9.進入 mangle 表的 POSTROUTING 鏈,到這裡已經做完了所有的路由決定,但封包仍然在本地主機,我們還可以進行某些修改。
10.進入 nat 表的 POSTROUTING 鏈,在這裡一般都是用來做 SNAT ,不要在這裡進行過濾。
11.進入出去的網路介面。

接下來說下iptables規則設定用法

1)iptables的基本語法格式
iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]
說明:
表名、鏈名:用於指定iptables命令所操作的表和鏈;
命令選項:用於指定管理iptables規則的方式(比如:插入、增加、刪除、??看等;
條件匹配:用於指定對符合什麼樣 條件的封包進行處理;
目標動作或跳轉:用於指定封包的處理方式(比如允許通過、拒絕、丟棄、跳轉(Jump)給其它鏈處理。

2)iptables命令的管理控制選項
-A 在指定鏈的末尾新增(append)一條新的規則
-D 刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除
-I 在指定鏈中插入(insert)一條新的規則,預設在第一行新增
-R 修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換
-L 列出(list)指定鏈中所有的規則進行檢視(預設是filter表,如果列出nat表的規則需要新增-t,即iptables -t nat -L)
-E 重新命名使用者定義的鏈,不改變鏈本身
-F 清空(flush)
-N 新建(new-chain)一條使用者自己定義的規則鏈
-X 刪除指定表中使用者自定義的規則鏈(delete-chain)
-P 設定指定鏈的預設策略(policy)
-Z 將所有表的所有鏈的位元組和封包計數器清零
-n 使用數位形式(numeric)顯示輸出結果
-v 檢視規則表詳細資訊(verbose)的資訊
-V 檢視版本(version)
-h 獲取幫助(help)

3)防火牆處理封包的四種方式ACCEPT 允許封包通過
DROP 直接丟棄封包,不給任何回應資訊
REJECT 拒絕封包通過,必要時會給資料傳送端一個響應的資訊。
LOG在/var/log/messages檔案中記錄紀錄檔資訊,然後將封包傳遞給下一條規則

4)iptables防火牆規則的儲存與恢復
iptables-save把規則儲存到檔案中,再由目錄rc.d下的指令碼(/etc/rc.d/init.d/iptables)自動裝載
使用命令iptables-save來儲存規則。
一般用:
iptables-save > /etc/sysconfig/iptables
生成儲存規則的檔案/etc/sysconfig/iptables,
也可以用:
service iptables save
它能把規則自動儲存在/etc/sysconfig/iptables中。
當計算機啟動時,rc.d下的指令碼將用命令iptables-restore呼叫這個檔案,從而就自動恢復了規則。

5)iptables防火牆常用的策略梳理
設定預設鏈策略
ptables的filter表中有三種鏈:INPUT, FORWARD和OUTPUT。
預設的鏈策略是ACCEPT,可以將它們設定成DROP,如下命令就將所有包都拒絕了:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

---------------------------------------------------------------------------------------------------------------------------
其實,在運維工作中最常用的兩個規則就是白名單規則和NAT轉發規則
1)白名單規則
在linux終端命令列裡操作時,如果不是預設的filter表時,需要指定表;
如果在/etc/sysconfig/iptables檔案裡設定,就在對應表的設定區域內設定;
上面兩種方式設定效果是一樣的!

比如開通本機的22埠,允許192.168.1.0網段的伺服器存取(-t filter表設定可以省略,預設就是這種表的設定)
[root@linux-node1 ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
或者
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

開通本機的80埠,只允許192.168.1.150機器存取(32位元掩碼表示單機,單機指定時可以不加掩碼)
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

然後儲存規則,重新啟動iptables
[root@linux-node1 ~]# service iptables save
[root@linux-node1 ~]# service iptables restart

或者在/etc/sysconfig/iptables檔案裡設定如下(其實上面在終端命令列裡設定並save和restart防火牆後,就會自動儲存規則到/etc/sysconfig/iptables這個檔案中的):
[root@bastion-IDC ~]# cat /etc/sysconfig/iptables
......
*filter
:INPUT ACCEPT [442620:173026884]
:FORWARD ACCEPT [118911:23993940]
:OUTPUT ACCEPT [8215384:539509656]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

[root@bastion-IDC ~]# service iptables restart


IT145.com E-mail:sddin#qq.com