IPTABLES的基本概念小結 轉

iptables簡介

iptables實際上就是一種包過濾型防火牆。iptables是Linux系統下最常見的防火牆命令,但實際上它只是一個命令行工具,真正的內核防火牆是位於操作系統內核空間的netfilter通過iptables命令制定規則並執行,即可使得netfilter在內核層對數據包作出相應的處理

四表五鏈

iptables中的存放鏈的容器,而存放規則的容器。在數據包進入系統的時候,防火牆會對其報文作規則匹配,並執行相應的動作

四表:

  • filter表:用於過濾數據包
  • nat表:網絡地址轉換功能(IP+端口)
  • mangle表:拆封且修改數據報文並重新封裝
  • raw表:關閉nat表上啓用的鏈接追蹤機制,爲了提高效率使用的,raw本身的含義是指“原生的”、“未經過加工的”,符合raw表所對應規則的數據包將會跳過一些檢查,這樣就可以提高效率

        優先級爲 : raw > mangle > nat > filter

五鏈:

  • PREROUTING鏈:用於目標地址轉換(DNAT)   數據包進入路由之前
  • INPUT鏈:用於處理進入本機的數據包
  • OUTPUT鏈:用於處理由本機出去的數據包
  • FORWARD鏈:用於處理轉發數據包
  • POSTROUTING鏈:用於源地址轉換(SNAT) 發送到網卡之前

Ⅰ.【鏈】

鏈是規則的容器。在鏈上有一系列的規則處理動作。報文進入主機的整個鏈路如下圖。

① 進入主機的報文(通常爲請求報文),進入路由選擇前,進行判斷其目標是否爲本機IP,如果是則進入INPUT鏈執行該鏈上設定的規則,將請求送至應用層處理;若不是本機IP,則會執行FORWARD鏈上的規則,將請求報文轉發到目標主機,並通過POSTROUTING鏈送出。

② 本機發起的報文(通常爲響應報文),則會執行OUTPUT鏈上的規則,再由POSTROUTING鏈送出。

由此可見,任何報文進出都必須PREROUTING和POSTROUTING兩條鏈的。

Ⅱ. 【表】

表是鏈的容器。前面有說到,規則分爲很多種,比如說過濾端口、修改報文、轉發數據包等等。具有相同功能的規則的集合就叫做表。iptables默認有4張表,分別是負責過濾的filter表(默認缺省操作即針對該表)、負載轉換網絡地址的nat表、負責修改報文的mangle表以及負責數據跟蹤處理的raw表。那表和鏈是什麼關係呢?表的功能不同,決定了鏈上的規則所能處於的表也是不同的。也就是說,不同的鏈所能具有表對應的功能是不同的;反過來說,不同的表上能存在的鏈是固定的。其對應關係如下圖所示:

表是有優先級的,其優先順序如上圖所示,從左往右,優先級由高到低。

Ⅲ. 【規則】

前面一直在說規則。規則是由匹配條件和指定動作組成的集合。設定好匹配條件和指定處理動作以後,報文進入鏈路,會根據匹配條件去匹配報文,匹配成功以後就會按設定的動作去處理,比如接受包、拒絕包、轉發包等。

  • 匹配條件

iptables可以根據報文的源地址、目的地址、傳輸協議、服務類型等信息進行匹配。這些條件通常用命令參數來設定。常見的命令參數如下表:

參數

說明

-P

設置默認策略

-F

清空規則鏈

-L

查看規則鏈

-I num

num缺省爲0,即在規則鏈的頂部加入新規則;num可設定加入的位置

-A

在規則鏈的末尾加入新規則

-D num

刪除指定位置的規則

-s

匹配報文來源地址

-d

匹配報文目標地址

-i

匹配指定網卡流入的數據

-o

匹配指定網卡流出的數據

-p

匹配協議,可選項TCP、UDP、ICMP

-m

使用擴展模塊來匹配報文

—dport

匹配目標端口號

—sport

匹配來源端口號

  • 指定動作

動作

說明

ACCEPT

允許數據包通過

DROP

直接丟棄數據包,不給出響應

REJECT

拒絕數據包通過,給出拒絕響應

REDIRECT

本機端口重定向、映射、透明代理

SNAT

源地址轉換

DNAT

目標地址轉換

MASQUERADE

IP僞裝(NAT),用於ADSL

LOG

日誌記錄

舉例說明

下面舉例說明iptables的用法。

① 舉例:僅允許遠程主機訪問本機的80端口,本機地址10.0.0.254

iptables -F
iptables -A INPUT -p tcp -d 10.0.0.254 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -j DROP

② 舉例:將本地的80端口的請求轉發到8080端口,本機地址10.0.0.254

# 方式1:redirect
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 

# 方式2:DNAT
iptables -t nat -A PREROUTING -p tcp -d 10.0.0.254 --dport 80 -j DNAT --to-destination 10.0.0.254:8080

這裏列了兩種方式,第一種redirect方式實際上是端口重定向,只對本機IP有效,效率比DNAT高。第二種則是DNAT轉發模式,它既可以轉發到本機IP,也可以轉發到外部其他主機。

③ 舉例:只針對filter表,預設策略INPUT鏈DROP,其他兩個鏈ACCEPT,然後針對192.168.137.0/24開通22端口,對所有網段開放80端口,對所有網段開放21端口。

iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

小結

  1. 使用-t參數來指定對哪個表進行操作,缺省狀態下默認是對filter表。
  2. 要重視規則的順序,默認是由上到下進行匹配,前面若匹配成功並執行相應的動作以後,後面再有規則可以匹配到之前的報文,也無法執行相應的動作。這裏舉例說明下:

舉例:僅允許遠端IP爲192.168.0.1的主機訪問本機的22端口。

先來看常見的錯誤寫法:

iptables -P INPUT ACCEPT

iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT

上例中的規則想要實現僅允許遠端192.168.0.1的IP訪問本機的22端口。本機INPUT規則鏈預設爲ACCEPT允許所有包流入,第一條規則匹配到對本機的22端口的所有請求報文並執行丟棄動作,第二條規則匹配到來源於192.168.0.1對本機22端口的訪問,這時候允許執行動作是沒有任何效果的;因爲第一條規則直接拒絕了所有的包。所以這種寫法有誤。正確的寫法應該是:

iptables -P INPUT ACCEPT

iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

或者:

iptables -P INPUT DROP

iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT

iptables的基本概念以及常見參數先總結到這裏。關於iptables更多常用的命令,之後再抽時間總結整理吧。

The End.

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