iptables

Linux防火牆軟體

iptables是運行在使用者空間的應用軟體,通過控制Linux內核netfilter模組,來管理網路封包的處理和轉發。在大部分Linux發行版中,可以通過 手冊頁頁面存檔備份,存於網際網路檔案館) 或 man iptables 獲取用戶手冊。通常iptables需要內核模塊支持才能運行,此處相應的內核模塊通常是Xtables。因此,iptables操作需要超級用戶權限,其可執行文件通常位於 /sbin/iptables/usr/sbin/iptables 。同時,需要說明的是,以上命令通常只用於處理 IPv4 數據包;而對於 IPv6 數據包,則使用類似的 ip6tables 命令。[1]

iptables
原作者羅斯迪·魯塞爾(Rusty Russell)
開發者Netfilter核心團隊
首次發布1998年
當前版本1.8.8(2022年5月13日,​2年前​(2022-05-13
源代碼庫https://git.netfilter.org/iptables/
編程語言C
操作系統Linux
類型封包過濾
許可協議GNU通用公共許可證
網站www.netfilter.org

目前,iptables 支持內核2.4以上版本,舊版內核環境下則使用ipchains(於2.2版內核)或 ipwadm(於2.0版內核)完成類似的功能。2014年1月19日起發行的Linux內核3.13版則使用nftables取而代之,但仍然提供 iptables 命令做為兼容接口。[2]

概要

編輯
 
網絡數據包通過Netfilter時的工作流向

iptables、ip6tables等都使用Xtables框架。存在「表(tables)」、「鏈(chain)」和「規則(rules)」三個層面。

每個「表」指的是不同類型的數據包處理流程,如filter表表示進行數據包過濾,而nat表針對連接進行地址轉換操作。每個表中又可以存在多個「鏈」,系統按照預訂的規則將數據包通過某個內建鏈,例如將從本機發出的數據通過OUTPUT链。在「鏈」中可以存在若干「規則」,這些規則會被逐一進行匹配,如果匹配,可以執行相應的動作,如修改數據包,或者跳轉。跳轉可以直接接受該數據包或拒絕該數據包,也可以跳轉到其他鏈繼續進行匹配,或者從當前鏈返回調用者鏈。當鏈中所有規則都執行完仍然沒有跳轉時,將根據該鏈的默認策略(「policy」)執行對應動作;如果也沒有默認動作,則是返回調用者鏈。[3]

filter表

編輯

filter表是默認的表,如果不指明表則使用此表。其通常用於過濾數據包。其中的內建鏈包括:

  • INPUT,輸入鏈。發往本機的數據包通過此鏈。
  • OUTPUT,輸出鏈。從本機發出的數據包通過此鏈。
  • FORWARD,轉發鏈。本機轉發的數據包通過此鏈。

nat表

編輯

nat表如其名,用於地址轉換操作。其中的內建鏈包括:

  • PREROUTING,路由前鏈,在處理路由規則前通過此鏈,通常用於目的地址轉換(DNAT)。
  • POSTROUTING,路由後鏈,完成路由規則後通過此鏈,通常用於源地址轉換(SNAT)。
  • OUTPUT,輸出鏈,類似PREROUTING,但是處理本機發出的數據包。

mangle表

編輯

mangle表用於處理數據包。其和nat表的主要區別在於,nat表側重連接而mangle表側重每一個數據包。[4]其中內建鏈列表如下。

  • PREROUTING
  • OUTPUT
  • FORWARD
  • INPUT
  • POSTROUTING

raw表

編輯

raw表用於處理異常,有如下兩個內建鏈:

  • PREROUTING
  • OUTPUT

命令示例

編輯

防火牆示例

編輯

一個典型的工作站的防火牆配置實例。超級用戶(root)可以用" iptables -L"指令顯示防火牆上的配置。完整的配置可以添加-v-vv參數來顯示更詳細信息,或者使用 iptables-save -c 導出生成當前表的命令。由於沒有指明「表」,因此默認使用filter表

 # 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

以上配置允許本機連接所有外部的系統,拒絕(REJECT)或丟棄(DROP)任何發往本機的數據包,但是有以下例外(和INPUT链逐一對應):

  • 來自本地環回地址的連接。
  • 已建立的連接(ESTABLISHED),如本機發起到遠端的連接後遠端的回應。
  • 關聯的連接(RELATED),如FTP協議使用的額外端口。[5]

此時,來自外部的ping將沒有回應:

 $  ping -c 1 10.0.0.1 
 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 
 --- 10.0.0.1 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

但本機訪問外部(OUTPUT)均正常,因為其鏈為空且默認策略為接受(ACCEPT);且本機不轉發(FORWARD)數據包,因為其默認策略為丟棄(DROP)。需要額外注意的是,這裡僅展示了IPv4的情況,若同時使用IPv6則需要另行配置ip6tables。

端口重定向示例

編輯

iptables的重要功能之一是用於端口和/或地址的轉換。如下示例展示了將預設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埠上面。

典型設置如辦公室用小型局域網,由一台Linux主機作為路由器共享地址接入Internet

假設局域網接口為eth0,地址使用192.168.0.0/24;而Internet接口為eth1,使用的地址為198.51.100.3。

在局域網用戶訪問Internet時,源地址需要被轉換為198.51.100.3,則使用規則:

 iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to 198.51.100.3 

若需要在局域網192.168.0.2上開啟HTTP服務,則可以設置相應的DNAT服務,將訪問外部TCP 80端口的數據包重定向:

 iptables -t nat -I PREROUTING -p tcp -d 198.51.100.3 --dport 80 -j DNAT --to 192.168.0.2 

需要注意的是,轉發操作需要在filter表FORWARD链中允許,並且打開系統的轉發功能。[6]

其他控制界面

編輯

前端控制介面及命令

編輯

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

此類前端裝置如生成器(generator)或腳本(script)往往會被其模板限制,模板僅僅能使用用戶定義規則並替換指定的部分,如只能替換端口或IP地址,同時,生成的規則往往難以達到最佳狀態,需要進行進一步優化,如此會增加開發和運維的成本。如果用戶想要了解iptables並且優化自己的規則,則需要自己創建規則。

前端的設定

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

其它的工具

編輯

Iptables/Netfilter圖表

編輯

為了較好地了解一個封包穿越內核層的X表(Xtables)之表/鏈(table/chain),你可以參考下列圖表的使用:

參照

編輯

其它防火墻的解決方案

編輯

外部連結

編輯

參考文獻

編輯
  1. ^ Carla Schroder. How to Write iptables Rules for IPv6. www.linux.com. 2017-08-03 [2022-01-22]. (原始內容存檔於2019-06-12). 
  2. ^ The netfilter.org "nftables" project. netfilter.org. [2022-01-22]. (原始內容存檔於2020-11-12). 
  3. ^ iptables详细教程:基础、架构、清空规则、追加规则、应用实例. lesca.me. 2012-03-23 [2022-01-22]. (原始內容存檔於2020-11-27). 
  4. ^ Linux 2.4 NAT HOWTO: Saying How To Mangle The Packets. netfilter.org. [2022-01-22]. (原始內容存檔於2021-01-10). 
  5. ^ Major Hayden. Active FTP connections through iptables. major.io. 2007-07-01 [2022-01-22]. (原始內容存檔於2018-12-11). 
  6. ^ 7.4. FORWARD and NAT Rules Red Hat Enterprise Linux 4. access.redhat.com. [2022-01-22]. (原始內容存檔於2019-07-19).