现在的位置: 首页 > 综合 > 正文

iptables原理与使用

2014年03月12日 ⁄ 综合 ⁄ 共 5808字 ⁄ 字号 评论关闭

转自鸟哥的私房菜。

 

原理分析与概念介绍

 

 iptables 的表格 (table)
與鏈 (chain)


事實上,那個圖 9.3-1
所列出的規則僅是 iptables 眾多表格當中的一個鏈 (chain) 而已。
什麼是鏈呢?這得由 iptables 的名稱說起。為什麼稱為 ip"tables" 呢?
因為這個防火牆軟體裡面有多個表格 (table) ,每個表格都定義出自己的預設政策與規則,
且每個表格的用途都不相同

。我們可以使用底下這張圖來稍微瞭解一下:

iptables 的表格與相關鏈示意圖
圖 9.3-2、iptables 的表格與相關鏈示意圖

剛剛圖 9.3-1 的規則內容僅只是圖 9.3-2 內的某個 chain 而已

而預設的情況下,咱們 Linux 的 iptables 至少就有三個表格,包括管理本機進出的 filter 、管理後端主機
(防火牆內部的其他電腦) 的 nat 、管理特殊旗標使用的 mangle (較少使用) 。更有甚者,我們還可以自訂額外的鏈呢!
真是很神奇吧!每個表格與其中鏈的用途分別是這樣的:

  • filter (過濾器)
    :主要跟進入 Linux 本機的封包有關,這個是預設的 table 喔!

    • INPUT
      :主要與想要進入我們 Linux 本機的封包有關;
    • OUTPUT
      :主要與我們 Linux 本機所要送出的封包有關;
    • FORWARD
      :這個咚咚與 Linux 本機比較沒有關係,
      他可以『轉遞封包』到後端的電腦中,與下列 nat table 相關性較高。
  • nat (位址轉換)
    :是 Network Address Translation 的縮寫,
    這個表格主要在進行來源與目的之 IP 或 port 的轉換,與 Linux 本機較無關,主要與 Linux
    主機後的區域網路內電腦較有相關。

    • PREROUTING
      :在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)
    • POSTROUTING
      :在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE)
    • OUTPUT
      :與發送出去的封包有關
  • mangle (破壞者)
    :這個表格主要是與特殊的封包的路由旗標有關,
    早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD 鏈。
    由於這個表格與特殊旗標相關性較高,所以像咱們這種單純的環境當中,較少使用 mangle 這個表格。

所以說,如果你的 Linux 是作為 www 服務,那麼要開放用戶端對你的 www 要求有回應,就得要處理 filter 的 INPUT 鏈;
而如果你的 Linux 是作為區域網路的路由器,那麼就得要分析 nat 的各個鏈以及 filter 的 FORWARD 鏈才行。也就是說,
其實各個表格的鏈結之間是有關係的!簡單的關係可以由下圖這麼看:

iptables 內建各表格與鏈的相關性
圖 9.3-3、iptables 內建各表格與鏈的相關性

上面的圖示很複雜喔!不過基本上你依舊可以看出來,我們的 iptables 可以控制三種封包的流向:

  • 封包進入 Linux 主機使用資源 (路徑 A)

    在路由判斷後確定是向 Linux 主機要求資料的封包,主要就會透過 filter 的 INPUT 鏈來進行控管;
  • 封包經由 Linux 主機的轉遞,沒有使用主機資源,而是向後端主機流動 (路徑 B)

    在路由判斷之前進行封包表頭的修訂作業後,發現到封包主要是要透過防火牆而去後端,此時封包就會透過路徑 B 來跑動。
    也就是說,該封包的目標並非我們的 Linux 本機。主要經過的鏈是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
    這路徑 B 的封包流向使用情況,我們會在本章的 9.5 小節來跟大家作個簡單的介紹。
  • 封包由 Linux 本機發送出去 (路徑 C)

    例如回應用戶端的要求,或者是 Linux 本機主動送出的封包,都是透過路徑 C 來跑的。先是透過路由判斷,
    決定了輸出的路徑後,再透過 filter 的 OUTPUT 鏈來傳送的!當然,最終還是會經過 nat 的 POSTROUTING 鏈。
Tips:

有沒有發現有兩個『路由判斷』呢?因為網路是雙向的,所以進與出要分開來看!因此,進入的封包需要路由判斷,
送出的封包當然也要進行路由判斷才能夠發送出去啊!瞭解乎?

鳥哥的圖示

由於 mangle 這個表格很少被使用,如果將圖 9.3-3 的 mangle 拿掉的話,那就容易看的多了:


iptables 內建各表格與鏈的相關性(簡圖)
圖 9.3-4、iptables 內建各表格與鏈的相關性(簡圖)

透過圖 9.3-4 你就可以更輕鬆的瞭解到,事實上與本機最有關的其實是 filter 這個表格內的 INPUT 與 OUTPUT
這兩條鏈,如果你的 iptables 只是用來保護 Linux 主機本身的話,那 nat
的規則根本就不需要理他,直接設定為開放即可。

不過,如果你的防火牆事實上是用來管制 LAN 內的其他主機的話,那麼你就必須要再針對
filter 的 FORWARD 這條鏈,還有 nat 的 PREROUTING, POSTROUTING 以及 OUTPUT 進行額外的規則訂定才行。
nat 表格的使用需要很清晰的路由概念才能夠設定的好,建議新手先不要碰!最多就是先玩一玩最陽春的 nat
功能『IP 分享器的功能』就好了! ^_^!這部份我們在本章的最後一小節會介紹的啦!

 

規則的觀察與清除

如果你在安裝的時候選擇沒有防火牆的話,那麼 iptables 在一開始的時候應該是沒有規則的,不過,
可能因為你在安裝的時候就有選擇系統自動幫你建立防火牆機制,那系統就會有預設的防火牆規則了!
無論如何,我們先來看看目前本機的防火牆規則是如何吧!

[root@www ~]# iptables [-t tables] [-L] [-nv]

選項與參數:
-t :後面接 table ,例如 nat 或 filter ,若省略此項目,則使用預設的 filter
-L :列出目前的 table 的規則
-n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多!
-v :列出更多的資訊,包括通過該規則的封包總位元數、相關的網路介面等


範例:列出 filter table 三條鏈的規則

[root@www ~]# iptables -L -n

Chain INPUT (policy ACCEPT)    <==針對 INPUT 鏈,且預設政策為可接受

target               prot opt source     destination  <==說明欄

RH-Firewall-1-INPUT  all  --  0.0.0.0/0  0.0.0.0/0
    <==規則跳到 RH 鏈去檢查


Chain FORWARD (policy ACCEPT) <==針對 FORWARD 鏈,且預設政策為可接受

target               prot opt source     destination
RH-Firewall-1-INPUT  all  --  0.0.0.0/0  0.0.0.0/0


Chain OUTPUT (policy ACCEPT) <==針對 OUTPUT 鏈,且預設政策為可接受

target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)  <==自訂鏈的規則順序

target     prot opt source     destination
ACCEPT     all  --  0.0.0.0/0  0.0.0.0/0                  <==第 1 條規則

ACCEPT     icmp --  0.0.0.0/0  0.0.0.0/0    icmp type 255 <==第 2 條規則

ACCEPT     esp  --  0.0.0.0/0  0.0.0.0/0                  <==第 3 條規則

ACCEPT     ah   --  0.0.0.0/0  0.0.0.0/0                  <==底下類推共 9 條規則

ACCEPT     udp  --  0.0.0.0/0  224.0.0.251  udp dpt:5353
ACCEPT     udp  --  0.0.0.0/0  0.0.0.0/0    udp dpt:631
ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0    tcp dpt:631
ACCEPT     all  --  0.0.0.0/0  0.0.0.0/0    state RELATED,ESTABLISHED
REJECT     all  --  0.0.0.0/0  0.0.0.0/0    reject-with icmp-host-prohibited


範例:列出 nat table 三條鏈的規則

[root@www ~]# iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

在上表中,每一個 Chain 就是前面提到的每個鏈囉~ Chain 那一行裡面括號的 policy 就是預設的政策,
那底下的 target, prot 代表什麼呢?

  • target:代表進行的動作, ACCEPT 是放行,而 REJECT 則是拒絕,此外,尚有 DROP (丟棄) 的項目!
  • prot:代表使用的封包協定,主要有 tcp, udp 及 icmp 三種封包格式;
  • opt:額外的選項說明
  • source :代表此規則是針對哪個『來源 IP』進行限制?
  • destination :代表此規則是針對哪個『目標 IP』進行限制?

在輸出結果中,第一個範例因為沒有加上 -t 的選項,所以預設就是 filter 這個表格內的 INPUT,
OUTPUT, FORWARD 三條鏈的規則囉。由於預設規則中,INPUT 與 FORWARD 的規則一致,因此 CentOS
將兩條鏈的規則寫在一塊,變成一個自訂鏈 RH-Firewall-1-INPUT 的鏈!你得要注意的是,最後一條規則的政策是 REJECT (拒絕) 喔!
所以,雖然 INPUT 與 FORWARD 的政策是放行 (ACCEPT),不過其實不合前面 8 條規則的封包全部都會被第 9 條規則拒絕。

不過這個指令的觀察只是作個格式化的查閱,要詳細解釋每個規則會比較不容易解析。舉例來說,
我們將上述的九條規則依據輸出結果來說明一下,結果會變成:

  1. 無論任何來源 (0.0.0.0/0) 且要去任何目標的封包,不論任何封包格式 (prot 為 all),通通都接受
  2. 只要是 icmp 類型為 255 號的,就予以放行
  3. 只要是封包格式為 esp 的,就予以放行 (特殊功能)
  4. 只要是封包格式為 ah 的,就予以放行 (特殊功能)
  5. 只要是要傳送給目標為 224.0.0.251 且為 udp 埠口 5353 的,就予以接受
  6. 只要是傳給 port 631 的 udp 封包就接受
  7. 只要是傳給 port 631 的 tcp 封包就接受
  8. 只要是封包狀態為 RELATED,ESTABLISHED 就予以接受
  9. 全部的封包資訊通通拒絕

最有趣的應該是第一條規則了,怎麼會所有的封包資訊都予以接受?如果都接受的話,那麼後續的規則根本就不會有用嘛!
其實那條規則是僅針對每部主機都有的內部迴圈測試網路 (lo) 介面啦!如果沒有列出介面,那麼我們就很容易搞錯囉~
所以,近來鳥哥都建議使用 iptables-save 這個指令來觀察防火牆規則啦!因為 iptables-save
會列出完整的防火牆規則,只是並沒有規格化輸出而已。

[root@www ~]# iptables-save [-t table]

選項與參數:
-t :可以僅針對某些表格來輸出,例如僅針對 nat 或 filter 等等


[root@www ~]# iptables-save

# Generated by iptables-save v1.3.5 on Wed Jan 26 18:25:15 2011
*filter                       <==星號開頭的指的是表格,這裡為 filter

:INPUT ACCEPT [0:0]           <==冒號開頭的指的是鏈,三條內建一條自訂

:FORWARD ACCEPT [0:0]         <==三條內建鏈的政策都是 ACCEPT 囉!

:OUTPUT ACCEPT [4:496]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT    <==針對 INPUT 的規則

-A FORWARD -j RH-Firewall-1-INPUT  <==針對 FORWARD 的規則

-A RH-Firewall-1-INPUT -i lo -j ACCEPT
 <==針對自訂鏈 RH 的規則

-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Jan 26 18:25:15 2011

由上面的輸出來看,有底線的那條規則當中, -i lo 指的就是由 lo 介面卡進來的封包!
這樣看就清楚多了!因為有寫到介面的關係啊!不像之前的 iptables -L -n 嘛!這樣瞭解乎!
不過,既然這個規則不是我們想要的,那該如何修改規則呢?鳥哥建議,先刪除規則再慢慢建立各個需要的規則!
那如何清除規則?這樣做就對了:

[root@www ~]# iptables [-t tables] [-FXZ]

選項與參數:
-F :清除所有的已訂定的規則;
-X :殺掉所有使用者 "自訂" 的 chain (應該說的是 tables )囉;
-Z :將所有的 chain 的計數與流量統計都歸零


範例:清除本機防火牆 (filter) 的所有規則

[root@www ~]# iptables -F

[root@www ~]# iptables -X

[root@www ~]# iptables -Z


由於這三個指令會將本機防火牆的所有規則都清除,但卻不會改變預設政策 (policy) ,
所以如果你不是在本機下達這三行指令時,很可能你會被自己擋在家門外 (若 INPUT 設定為 DROP 時)!要小心啊!

一般來說,我們在重新定義防火牆的時候,都會先將規則給他清除掉。還記得我們前面談到的,
防火牆的『規則順序』是有特殊意義的
,所以囉,
當然先清除掉規則,然後一條一條來設定會比較容易一點啦。底下就來談談定義預設政策吧!

 

抱歉!评论已关闭.