本页使用了标题或全文手工转换

iptables

维基百科,自由的百科全书
跳到导航 跳到搜索

iptables
原作者 羅斯迪·魯塞爾(Rusty Russell)
開發者 Netfilter核心團隊
初始版本 1998年
穩定版本
穩定版本
1.8.0
(2018年7月7日,​16天前​(2018-07-07[1]
编程语言 C
操作系统 Linux
类型 封包過濾
许可协议 GNU通用公共许可证
網站 http://www.netfilter.org/
源代码库 https://git.netfilter.org/iptables/

iptables是運行在使用者空間的應用軟體,通過控制Linux內核netfilter模組,來管理網路封包的流動與轉送。在大部份Linux系統上,可使用/usr/sbin/iptables來操作iptables,用戶手冊在手冊頁(Man page[2])中,可以透過 man iptables 指令取得。通常iptables都需要内核層級的模組來配合運作,Xtables是主要在内核層級裡面iptables API運作功能的模組。因相關動作上的需要,iptables的操作需要用到超级用户的權限。

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

歷史[编辑]

操作摘要[编辑]

网络数据包通过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)秩列[1]

參照[编辑]

  • ipchains為iptables的前一代
  • Netlink為Netfilter使用之API
  • NuFW延伸到Netfilter之認證防火墻

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

外部連結[编辑]

参考文献[编辑]