iptables 是執行在使用者空間的應用軟體，透過控制 Linux 核心 netfilter 模組，來管理網路封包的處理和轉發。在大部分 Linux 發行版中，可以透過 手冊頁 或 man iptables 獲取使用者手冊。通常 iptables 需要核心模組支援才能執行，此處相應的核心模組通常是 Xtables。因此，iptables 操作需要超級使用者許可權，其可執行檔案通常位於 sbiniptables 或 usrsbiniptables 。同時，需要說明的是，以上命令通常只用於處理 IPv4 資料包；而對於 IPv6 資料包，則使用類似的 ip6tables 命令。 目前，iptables 支援核心 24 以上版本，舊版核心環境下則使用 ipchains（於 22 版核心）或 ipwadm（於 20 版核心）完成類似的功能。2014 年 1 月 19 日起發行的 Linux 核心 313 版則使用 nftables 取而代之，但仍然提供 iptables 命令做為相容介面。 概要 iptables、ip6tables 等都使用 Xtables 框架。存在「表（tables）」、「鏈（chain）」和「規則（rules）」三個層面。 每個「表」指的是不同型別的資料包處理流程，如 filter 表表示進行資料包過濾，而 nat 錶針對連線進行地址轉換操作。每個表中又可以存在多個「鏈」，系統按照預訂的規則將資料包透過某個內建鏈，例如將從本機發出的資料透過 OUTPUT 鏈。在「鏈」中可以存在若干「規則」，這些規則會被逐一進行匹配，如果匹配，可以執行相應的動作，如修改資料包，或者跳轉。跳轉可以直接接受該資料包或拒絕該資料包，也可以跳轉到其他鏈繼續進行匹配，或者從當前鏈返回呼叫者鏈。當鏈中所有規則都執行完仍然沒有跳轉時，將根據該鏈的預設策略（「policy」）執行對應動作；如果也沒有預設動作，則是返回呼叫者鏈。 filter 表 filter 表是預設的表，如果不指明表則使用此表。其通常用於過濾資料包。其中的內建鏈包括： INPUT，輸入鏈。發往本機的資料包透過此鏈。 OUTPUT，輸出鏈。從本機發出的資料包透過此鏈。 FORWARD，轉發鏈。本機轉發的資料包透過此鏈。 nat 表 nat 表如其名，用於地址轉換操作。其中的內建鏈包括： PREROUTING，路由前鏈，在處理路由規則前透過此鏈，通常用於目的地址轉換（DNAT）。 POSTROUTING，路由後鏈，完成路由規則後透過此鏈，通常用於源地址轉換（SNAT）。 OUTPUT，輸出鏈，類似 PREROUTING，但是處理本機發出的資料包。 mangle 表 mangle 表用於處理資料包。其和 nat 表的主要區別在於，nat 表側重連線而 mangle 表側重每一個數據包。其中內建鏈列表如下。 PREROUTING OUTPUT FORWARD INPUT POSTROUTING raw 表 raw 表用於處理異常，有如下兩個內建鏈： PREROUTING OUTPUT 命令示例 防火牆示例 一個典型的工作站的防火牆配置例項。超級使用者（root）可以用 iptables L 指令顯示防火牆上的配置。完整的配置可以新增 v 或 vv 引數來顯示更詳細資訊，或者使用 iptablessave c 匯出生成當前表的命令。由於沒有指明「表」，因此預設使用 filter 表。 iptables L Chain INPUT policy DROP target prot opt source destination ACCEPT alllocalhostlocaldomain localhostlocaldomain ACCEPT allanywhere anywhere state RELATEDESTABLISHED REJECT allanywhere anywhere Chain FORWARD policy DROP target prot opt source destination Chain OUTPUT policy ACCEPT target prot opt source destination 以上配置允許本機連線所有外部的系統，拒絕（REJECT）或丟棄（DROP）任何發往本機的資料包，但是有以下例外（和 INPUT 鏈逐一對應）： 來自本地環回地址的連線。 已建立的連線（ESTABLISHED），如本機發起到遠端的連線後遠端的回應。 關聯的連線（RELATED），如 FTP 協議使用的額外埠。 此時，來自外部的 ping 將沒有回應： ping c 1 10001 PING 10001 10001 56 84 bytes of data 10001 ping statistics 1 packets transmitted 0 received 100 packet loss time 0ms 外部嘗試連線本機的 HTTP 埠（即 TCP 80 埠）將被拒絕連線： telnet 10001 80 Trying 10001 telnet connect to address 10001 Connection refused 但本機訪問外部（OUTPUT）均正常，因為其鏈為空且預設策略為接受（ACCEPT）；且本機不轉發（FORWARD）資料包，因為其預設策略為丟棄（DROP）。需要額外注意的是，這裡僅展示了 IPv4 的情況，若同時使用 IPv6 則需要另行配置 ip6tables。 埠重定向示例 iptables 的重要功能之一是用於埠和 或地址的轉換。如下示例展示了將預設 HTTP 埠的封包由 TCP 80 轉向 8080 埠。這樣，HTTP 的守護程序（daemon）可以允許由一般使用者許可權啟動，而不需要對一般使用者無法將埠號綁在 1024 埠以下的限制的問題多加考慮。 iptables t nat A PREROUTING p tcp dport 80 j REDIRECT toport 8080 如果有多個埠的資料需要轉發到一個埠，則可調取 multiport（多埠）模組，如下規則會將 ens0 介面上 UDP 埠 66 到 77、88 到 99 的資料包轉向 UDP 埠 443。 iptables t nat A PREROUTING i ens0 p udp m multiport dports 66778899 j REDIRECT toports 443 注意：如果你在你的電腦上面運行了這個指令，它只會對連到你的機器上的外部的 IP 發生效果。從本地端發起的連線不會遵循 nat 表上 PREROUTING 鏈的設定。如果你想讓本地端也遵循規則，你可以另外部索引鍵入下面的指令： iptables t nat A OUTPUT o lo p tcp dport 80 j REDIRECT toport 8080 這條規則會將 lo 介面上的封包輸出由 80 埠轉向到 8080 埠上面。 網路地址轉換示例 典型設定如辦公室用小型區域網，由一臺 Linux 主機作為路由器共享地址接入 Internet。 假設區域網介面為 eth0，地址使用 1921680024；而 Internet 介面為 eth1，使用的地址為 198511003。 在區域網使用者訪問 Internet 時，源地址需要被轉換為 198511003，則使用規則： iptables t nat I POSTROUTING s 1921680024 o eth1 j SNAT to 198511003 若需要在區域網 19216802 上開啟 HTTP 服務，則可以設定相應的 DNAT 服務，將訪問外部 TCP 80 埠的資料包重定向： iptables t nat I PREROUTING p tcp d 198511003 dport 80 j DNAT to 19216802 需要注意的是，轉發操作需要在 filter 表中 FORWARD 鏈中允許，並且開啟系統的轉發功能。 其他控制介面 前端控制介面及命令 有很多第三方軟體可以幫助設定 iptables 規則。前端介面像是 Ncurses 或圖型介面可以讓使用者用點選的方式產生許多簡單的規則。命令稿通常是參照 Unix shell 產生出來的（不過當然也有可能會使用其它種型別的命令稿），它們有的會用一些預先定義好的規則或簡單的範本來呼叫 iptables 或 iptablesrestore 執行。一些 Linux 發行版公司會在它們的發行版裡麵包含這些方式，當然像這樣的方式能產生的變化就相當有限，不過也因為產生規則的方式很簡單，所以甚至可以利用 php 網頁撰寫的方式來產生這些規則。 此類前端裝置如生成器（generator）或指令碼（script）往往會被其模板限制，模板僅僅能使用使用者定義規則並替換指定的部分，如只能替換埠或 IP 地址，同時，生成的規則往往難以達到最佳狀態，需要進行進一步最佳化，如此會增加開發和運維的成本。如果使用者想要了解 iptables 並且最佳化自己的規則，則需要自己建立規則。 前端的設定 Firewall Builder 圖形前端配合規則 字集產生器、及自動規則集（automated ruleset）載入。 Shorewall，以本文為基礎的規則產生器。 其它的工具 Fwsnort iptables 侵入測試以字串比對法及是諾特規則（Snort Rule）來進行 FWSnort ，Translates a Snort IDS ruleset into an IPTables ruleset IptablesNetfilter 圖表 為了較好地瞭解一個封包穿越核心層的 X 表（Xtables）之表 鏈（tablechain），你可以參考下列圖表的使用： Netfilter 封包流；勾 表（hooktable）秩列 參照 ipchains 為 iptables 的前一代 Netlink 為 Netfilter 使用之 API NuFW 延伸到 Netfilter 之認證防火墻 nftables 為 iptables 的後繼者 firewalld 其它防火墻的解決方案 PF firewall ipfirewall ipfilter 外部連結 The netfilteriptables project Web page Freshmeat project page for the iptables package The netfilteriptables documentation page outdated 參考文獻 CategoryLinux 核心功能 Category 防火牆軟體 CategoryLinux 安全軟體 Category 自由安全軟體 Category 命令列軟體