iptables

维基百科,自由的百科全书
跳转至: 导航搜索
iptables
原作者 羅斯迪·魯塞爾(Rusty Russell)
開發者 Netfilter Core Team
初始版本 1998年
穩定版本 1.4.21 / 2013年11月22日;8個月前 (2013-11-22)[1]
编程语言 C
操作系统 Linux
类型 Packet filtering
许可协议 GNU General Public License
網站 www.netfilter.org

iptablesnetfilter(網路過濾器)是一個工作於使用者空間防火墙應用軟體,允許系統管理員可以調整設定X表(Xtables)提供相關的系統表格(目前主要位于iptables/netfilter)以及相關的「链」與「規則」來管理網路封包的流動與轉送的動作。因相關動作上的需要,iptables的操作需要用到超级用户的權限。在大部份的Linux系統上面,iptables是使用/usr/sbin/iptables來操作,文件則放置在手冊頁(Man page[2])底下,可以透過 man iptables 指令取得。通常iptables都需要内核層級的模組來配合運作,Xtables是主要在内核層級裡面iptables API運作功能的模組。

目前iptables係在2.4、2.6及3.0的内核底下運作,舊版的Linux内核(2.2)使用ipchainsipwadm(Linux 2.0)來達成類似的功能,2014年1月19日起發行的新版Linux内核(3.13后)则使用nftables取而代之。

操作摘要[编辑]

Flow of network packets through Netfilter

iptables和ip6_tables、arp_tables一同都是建構在Xtables的架構下,這個方案讓系統管理員定義「表(tables)」、「链(chain)」、「規則(rules)」三個資料來處理封包的運送。每一個「表」都和不同的封包處理有關、決定封包是否可以穿越的是「链」、而一條「規則」在鍵裡面則可以決定是否送往下一條链(或其它的動作),這個處理可以在巢狀的結構裡面重複使用。每一個網路封包從抵達到離開該電腦至少會經過一個链(亦即轉送或本機路由)。

一開始,是由封包的來源決定它應該穿過哪一個链。iptables的架構預先在過濾器(filter)裡頭定義了三個鍵:INPUT(輸入)、OUTPUT(輸出)、跟FORWARD(轉發)。預先定義的链也同樣會具有一個預設的"policy"(政策)像是DROP,讓封包在歷經規則到最後仍沒有符合的項目時,可以使用這個"policy"來進行操作。系統管理員可以視需要新增其它的链。這些链沒有預設的策略可以處理。如果一個封包到了這些链的最後仍然沒有符合的項目,就會回到前一個呼叫它的链。另外,一個链裡頭也可以是空白的。

每條在链的規則都包含了符合的封包相關資料。它也會包含"target"的資料。當一個封包穿過一個链,每個規則會依序檢查它。如果沒有規則與封包不相符,則這個封包會被傳到下一個規則計算,如果與規則相處的話,就會開始運行規則裡頭由target制定的動作,這個動作會決定這個封包要不要在這個链裡頭繼續運作。

封包穿過链的同時會因為:

  1. 有規則與封包參數相處,因而決定這個封包的處理方式,像是"ACCEPT"(接受)或是"DROP"(丟棄)。
  2. 有規則呼叫RETURN target,則會回歸到上一層呼叫的链裡頭。
  3. 沒有規則與之相處,則會到達這個链的最底層。(視有無預設政策來決定是否採用預設政策或回歸上一層呼叫的链)

範例[编辑]

下面的例子是一個已經都設定好了防火牆的工作站。根目錄(root)使用者可以用" iptables -L"這個指令來顯示防火牆上的配置。(完整的配置可以使用 iptables-save -c 顯示出來,如果有問題的話也可以使用這個指令來追查。)

# iptables -L
Chain INPUT(policy DROP)
target     prot opt source               destination
ACCEPT     all  --  localhost.localdomain  localhost.localdomain
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
REJECT     all  --  anywhere             anywhere
Chain FORWARD(policy DROP)
target     prot opt source               destination
Chain OUTPUT(policy ACCEPT)
target     prot opt source               destination

RELATED(關連), ESTABLISHED(建立)的規則使用線上狀態以致大多數客服端程式(比如:網頁瀏覽器,ssh...)能夠運作。

$ w3m http://en.wikipedia.org/wiki/Main_Page

(打開維基英文主頁)

電腦不需要回應ping且沒有服務被提供。連接要求呈拒絕(REJECT)或則過時(配合DROP使用)之狀態、在於埠都被掃描到時。

$  ping -c 1 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
--- 62.78.243.6 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

嘗試連接到HTTP埠(TCP 80)

$ telnet 10.0.0.1 80
Trying 10.0.0.1...
telnet: connect to address 10.0.0.1: Connection refused

轉向範例[编辑]

底下簡單示範如果把預設HTTP埠的封包由80轉向8080埠。如此一來,則HTTP的daemon可以允許由一般使用啟動,而不需要煩惱一般使用者無法將埠號綁在1024埠以下的限制。

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

注意:如果你在你的電腦上面運行了這個指令,它只會對連到你的機器上的外部的IP位置發生效果。從本地端上來的連線將無法在nat表格上的PREROUTING鏈上面發生效果。如果你想要讓本地端也可以發生效果,你可以另外鍵入下面的規則:

iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080

這條規則會將lo介面上的封包輸出由80埠轉向到8080埠上面。

前端控制介面及命令[编辑]

iptables的應用上面有許多第三方的軟體可以協助設定規則。前端介面像是Ncurses或圖型介面可以讓使用者用點選的方式產生許多簡單的規則。命令稿通常是參照Unix shell產生出來的(不過當然也有可能會使用其它種類型的命令稿),它們有的會用一些預先定義好的規則或簡單的範本來呼叫iptables或 iptables-restore 使用。Linux發行版公司有的會在它們的發行版裡面收納這些方式進來,當然像這樣的方式能產生的變化就相當的有限,不過也因為產生規則的方式很簡單,所以甚至可以利用php網頁撰寫的方式來產生這些規則。

諸如此種前端裝置,產生器及(generator)及原字集(script)經常被它們內建的模版系統所限制,而且模板能夠為使用者定義規則(user-defined rules)提供替代的地點。同樣的,所產生的規則為了使用者所期待的防火墻效應一般不會是最佳化的狀態,如此的運作將可能會使發展人員增加維護費用。使用者如要很合理的了解iptables、且要他們的規則集(ruleset)最佳化,那就可能需要建構他們自已的規則集。

前端的設定[编辑]

  • Firewall Builder —圖形前端配合規則/字集產生器、及自動規則集(automated ruleset)載入。
  • Shorewall,以本文為基礎的規則產生器。

其它的工具[编辑]

  • Fwsnort - iptables侵入測試以字串比對法及是諾特規則(Snort Rule)來進行FWSnort,Translates a Snort IDS ruleset into an IPTables ruleset.

Iptables/Netfilter圖表[编辑]

為了較好來了解一個封包穿越内核層的X表(Xtables)之表/鏈(table/chain),你可以發現到下列圖表的使用:

  • Netfilter封包流;勾/表(hook/table)秩列[2]

參照[编辑]

  • ipchains為iptables前驅裝置
  • Netlink為Netfilter使用之API
  • NuFW延伸到Netfilter之認證防火墻

其它防火墻的解決方案[编辑]

外部連結[编辑]

参考文献[编辑]