IPtables 詳解

楊奇龍發表於2011-03-12

Linux 的內建firewall機制,是透過kernel中的netfilter模組實現的()。Linux kernel使用netfilter對進出的資料包進行過濾,netfilter由三個規則表組成,每個表又有許多內建的鏈組成。透過使用iptables命令可以對這些錶鏈進行操作,如新增、刪除和列出規則等。

一、Netfilter規則表—filter nat mangle

filter,用於路由網路資料包。是預設的,也就是說如果沒有指定-t引數,當建立一條新規則時,它會預設存放到該表內。

INPUT 網路資料包流向伺服器

OUTPUT 網路資料包從伺服器流出

FORWARD 網路資料包經伺服器路由

nat,用於NAT表.NAT(Net Address Translation )是一種IP地址轉換方法。

PREROUTING 網路資料包到達伺服器時可以被修改

OUTPUT 網路資料包由伺服器流出

POSTROUTING 網路資料包在即將從伺服器發出時可以被修改

mangle,用於修改網路資料包的表,如TOS(Type Of Service),TTL(Time To Live),等

INPUT 網路資料包流向伺服器

OUTPUT 網路資料包流出伺服器

FORWARD 網路資料包經由伺服器轉發

PREROUTING 網路資料包到達伺服器時可以被修改

POSTROUTING 網路資料包在即將從伺服器發出時可以被修改

1.配置Iptables

當資料包進入伺服器時,Linux Kernel會查詢對應的鏈,直到找到一條規則與資料包匹配。如果該規則的target是ACCEPT,就會跳過剩下的規則,資料包會被繼續傳送。如果該規則的target是DROP,該資料包會被攔截掉,kernel不會再參考其他規則。

Note:如果從始至終都沒有一條規則與資料包匹配,而且表末尾又沒有drop all的規則,那末該資料包會被accept。Cisco則相反,在表末尾會因含deny all的規則。

1.) Iptables的命令選項

iptables [-t tables] command option parameter target

-A 在鏈尾新增一條規則

-C 將規則新增到使用者定義鏈之前對其進行檢查

-D 從鏈中刪除一條規則

-E 重新命名使用者定義的鏈,不改變鏈本身

-F 清空鏈,刪除鏈上的所有規則

-I 在鏈中插入一條規則

-L 列出某個鏈上的規則,如iptables –L INPUT 列出INPUT鏈的規則

-N 建立一個新鏈

-P 定義某個鏈的預設策略

-R 替換鏈上的某條規則

-X 刪除某個使用者相關的鏈

-Z 將所有表的所有鏈的位元組和資料包計數器清零

2.) Iptables的命令引數

-p –protocol

應用於資料包的協議型別,可以是TCP UDP ICMP或ALL。!也可使用。

當使用-p tcp時,還可使用其他可以選項,以便允許進一步定義規則。選項包括:

——sport 允許指定匹配資料包源埠.port1:port ,表示port1和port2之間的所有埠

——dport 目的埠,和——sport雷同。

當使用-p !udp時,也有特殊的選項供使包括:

——sport,——dport,與-p tcp 相同,只不過用以用於UDP包。

使用-p icmp引數時,只有一個選項可用。

——icmp-type,允許在過濾規則中指定icmp型別。

-s –source 指定資料包的源地址。該引數後跟一個IP地址,一個帶有sub-net mask的網路地址,或一個主機名。(不建議使用主機名)

-d,- - destination 資料包的目的地址,同-s.

-j,——jump 用於指定一個target,告訴規則將該匹配的資料包傳送到該 target。Target可以是ACCEPT,DROP,QUEUE,RETURN.如果沒有-j,那麼不會對資料包進行任何操作,只是將計數器加1。

-i - - in-interface ,對於INPUT FORWARD PREROUTING鏈,該引數指定資料包到達伺服器時所使用的埠。

-o - - out-interface,對於OUTPUT FORWARD POSTROUTING鏈,該引數指定資料包離開伺服器時使用的埠。

3.) Iptables的命令target

建立規則的最後一步是指定Iptables對資料包的操作。只要某一規則匹配該資料包,就不會再有別的規則的操作。內建的target有:ACCEPT DROP QUEUE RETURN。

ACCEPT:允許資料包透過,到達目的地。

DROP:拒絕資料包透過,丟棄該包。

QUEUE:將資料包傳送回到使用者應用程式處理。

RETURN:不再根據當前鏈的其他規則來檢查資料包,而是直接返回,繼續被髮送到其目的地址,或下一個鏈。

2.應用Iptables規則 示例

允許WWW

iptables –A INPUT –p tcp –dport 80 –j ACCEPT

該規則被新增到filter表的INPUT鏈,允許目的埠是80的資料包。

在內部介面上允許DHCP

iptables –A INPUT –i eth0 –p tcp - - sport 68 - -dport 67 ACCEPTiptables –A INPUT –i eth0 –p ucp - -sport 68 - -dport 67 ACCEPT

以上同時允許TCP和UDP協議。

3.儲存和恢復Iptables

儲存Iptables

使用iptables-save可將現行的iptables規則儲存,

iptables-save > iptables儲存路徑,如# iptables-save > /etc/iptables.up.rule

恢復Iptables

使用iptables-restore 可從配置文件恢復iptables表到現行iptables表.

iptables-restore < /etc/iptables.up.rule

二、Ubuntu Server中的Iptables

Ubuntu Server6.06中已經預設安裝iptables,版本是1.3.3.預設狀態是關閉。

透過修改/etc/network/interfaces可將iptables開啟:

auto loIface lo inet loopbackauto eth0iface eth0 inet dhcp

#新增以下內容

pre-up iptables-restore < /etc/iptables.up.rule#call the restored rule when active the eth0post-down iptables-save > /etc/iptables.up.rule#restore the iptables rule when shutdown the interface eth0

然後重新啟用eth0即可。

另外,可隨時修改/etc/iptables.up.rule配置檔案,來更改iptables的規則Iptables.up.rul格式如下: 行與行之間不能有空行。三.Summary

iptables錶鏈中每條規則的順序很重要,如果首條是accept all,那末所有的資料包都會被允許透過firewall,因此應當適當的安排規則順序。通常的法則是:拒絕所有 允許少數.

預備知識(轉): iptable有三種佇列(表)規則,mangle queue, filter queue, nat queue。

1。The first is the mangle table which is responsible for the alteration of quality of service bits in the TCP header.

2。The second table is the filter queue which is responsible for packet filtering.

* Forward chain: Filters packets to servers protected by the firewall.

* Input chain: Filters packets destined for the firewall.

* Output chain: Filters packets originating from the firewall.

3。The third table is the nat queue which is responsible for network address translation. It has two built-in chains; these are:

* Pre-routing chain: NATs packets when the destination address of the packet needs to be changed.

* Post-routing chain: NATs packets when the source address of the packet needs to be changed

個人總結:

iptables執行規則時,是從從規則表中從上至下順序執行的,如果沒遇到匹配的規則,就一條一條往下執行,如果遇到匹配的規則後,那麼就執行本規則,執行後根據本規則的動作(accept, reject, log等),決定下一步執行的情況,後續執行一般有三種情況。

1。一種是繼續執行當前規則佇列內的下一條規則。比如執行過Filter佇列內的LOG後,還會執行Filter佇列內的下一條規則。

2。一種是中止當前規則佇列的執行,轉到下一條規則佇列。比如從執行過accept後就中斷Filter佇列內其它規則,跳到nat佇列規則去執行

3。一種是中止所有規則佇列的執行。

iptables 是採用規則堆疊的方式來進行過濾,當一個封包進入網路卡,會先檢查 Prerouting,然後檢查目的 IP 判斷是否需要轉送出去,接著就會跳到 INPUT 或 Forward 進行過濾,如果封包需轉送處理則檢查 Postrouting,如果是來自本機封包,則檢查 OUTPUT 以及 Postrouting。過程中如果符合某條規則將會進行處理,處理動作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,還多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些處理動作不會中斷過濾程式,某些處理動作則會中斷同一規則煉的過濾,並依照前述流程繼續進行下一個規則煉的過濾(注意:這一點與 ipchains 不同),一直到堆疊中的規則檢查完畢為止。透過這種機制所帶來的好處是,我們可以進行復雜、多重的封包過濾,簡單的說,iptables 可以進行縱橫交錯式的過濾(tables)而非煉狀過濾(chains)。

ACCEPT 將封包放行,進行完此處理動作後,將不再比對其它規則,直接跳往下一個規則煉(nat:postrouting)。

REJECT 攔阻該封包,並傳送封包通知對方,可以傳送的封包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(這個封包會要求對方關閉聯機),進行完此處理動作後,將不再比對其它規則,直接 中斷過濾程式。 範例如下:

iptables -A FORWARD -p TCP ——dport 22 -j REJECT ——reject-with tcp-reset

DROP 丟棄封包不予處理,進行完此處理動作後,將不再比對其它規則,直接中斷過濾程式。

REDIRECT 將封包重新導向到另一個埠(PNAT),進行完此處理動作後,將 會繼續比對其它規則。 這個功能可以用來實作通透式 porxy 或用來保護 web 伺服器。例如:iptables -t nat -A PREROUTING -p tcp ——dport 80 -j REDIRECT ——to-ports 8080

MASQUERADE 改寫封包來源 IP 為防火牆 NIC IP,可以指定 port 對應的範圍,進行完此處理動作後,直接跳往下一個規則煉(mangle:postrouting)。這個功能與 SNAT 略有不同,當進行 IP 偽裝時,不需指定要偽裝成哪個 IP,IP 會從網路卡直接讀取,當使用撥接連線時,IP 通常是由 ISP 公司的 DHCP 伺服器指派的,這個時候 MASQUERADE 特別有用。範例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE ——to-ports 1024-31000

LOG 將封包相關訊息紀錄在 /var/log 中,詳細位置請查閱 /etc/syslog.conf 組態檔,進行完此處理動作後,將會繼續比對其它規則。例如:

iptables -A INPUT -p tcp -j LOG ——log-prefix "INPUT packets"

SNAT 改寫封包來源 IP 為某特定 IP 或 IP 範圍,可以指定 port 對應的範圍,進行完此處理動作後,將直接跳往下一個規則煉(mangle:postrouting)。範例如下:

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT ——to-source 194.236.50.155-194.236.50.160:1024-32000

DNAT 改寫封包目的地 IP 為某特定 IP 或 IP 範圍,可以指定 port 對應的範圍,進行完此處理動作後,將會直接跳往下一個規則煉(filter:input 或 filter:forward)。範例如下:

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 ——dport 80 -j DNAT ——to-destination 192.168.1.1-192.168.1.10:80-100

MIRROR 鏡射封包,也就是將來源 IP 與目的地 IP 對調後,將封包送回,進行完此處理動作後,將會中斷過濾程式。

QUEUE 中斷過濾程式,將封包放入佇列,交給其它程式處理。透過自行開發的處理程式,可以進行其它應用,例如:計算聯機費用……等。

RETURN 結束在目前規則煉中的過濾程式,返回主規則煉繼續過濾,如果把自訂規則煉看成是一個子程式,那麼這個動作,就相當於提早結束子程式並返回到主程式中。

MARK 將封包標上某個代號,以便提供作為後續過濾的條件判斷依據,進行完此處理動作後,將會繼續比對其它規則。範例如下:

iptables -t mangle -A PREROUTING -p tcp ——dport 22 -j MARK ——set-mark 2

  • *mangle
  • :PREROUTING ACCEPT [48436:11233990]
  • :INPUT ACCEPT [48436:11233990]
  • :FORWARD ACCEPT [0:0]
  • :OUTPUT ACCEPT [29730:6162034]
  • :POSTROUTING ACCEPT [29730:6162034]
  • COMMIT
  • *nat
  • :PREROUTING ACCEPT [391:49336]
  • :POSTROUTING ACCEPT [1793:110951]
  • :OUTPUT ACCEPT [1793:110951]
  • COMMIT
  • *filter
  • :INPUT DROP [0:0]
  • :FORWARD DROP [0:0]
  • :OUTPUT ACCEPT [1418:147349]
  • -A INPUT -i lo -j ACCEPT
  • -A INPUT -m state --state ESTABLISHED -j ACCEPT
  • -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
  • -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT
  • -A INPUT -p all -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
  • -A INPUT -j DROP
  • -A OUTPUT -o lo -j ACCEPT
  • -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
  • -A OUTPUT -p tcp -m tcp --sport 631 -j ACCEPT
  • COMMIT

    首先,這個iptables配置本質上使得你的計算機假裝對任何不是由你發起的入站連線視而不見。這對轉發包也同 樣對待。這通常是一個好策略,使用:INPUT DROP和:FORWARD DROP的預設值。例外可以稍後在指定埠,地址等 等上進行建立。

    -A INPUT -i lo -j ACCEPT允許你的系統接受所有由你自己的網路介面卡發起的入站請求。這對透過ping自己, 獲得本地系統郵件轉發(例如當你的計算機想告訴你出現故障時)等等這樣的測試網路配置的操作很有用。

    -A INPUT -m state --state ESTABLISHED -j ACCEPT利用iptables的狀態包過濾效能使得你可以非常靈活地為入 站包實現預設的DROP策略。這一行主要說明任何由你發起的連線將被允許繼續進行連線。另外,你或許能夠向另 一臺伺服器傳送資料,但是永遠不知道它是否到達,因為當伺服器試圖應答時你的防火牆會沒有任何通知就丟棄 資料包。

    -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT允許入站SSH連線。你或許想將22埠修改為其他非標準埠, 並且確保任何想遠端SSH訪問上面提到的計算機的人在進行這種連線時都知道使用修改的埠。

    對於永遠不應該被遠端訪問的系統,你應該在應用這個檔案之前從中刪除這一行,但我的經驗是遠端SSH訪問是對 分散式網路進行安全管理的工具之一,因此大多數不在諸如網路上只有一臺計算機的家庭桌面這樣的單機系統的 人或許都希望對系統具有某種遠端SSH訪問。在將來你對iptables更精通之後,你可能會考慮用幾行代替這一行, 那幾行定義了什麼資源對遠端連線到計算機的嘗試是有效的,所以即使在非標準埠上,沒有系統攻擊者能夠從 錯誤的資源利用SSH闖入(例如一個不正確的IP地址,等等),但是這確實超出了本文討論的範圍。

    -A INPUT -p tcp -m tcp --dport 631 -j ACCEPT允許使用通用Unix列印系統(CUPS)的網路印表機進行連線。 如果你沒有這樣的印表機,請刪除這一行。比它更復雜,更安全的iptables規則可以被用來做同樣的事情,但這 是一個相當好的起點。

    -A INPUT -p all -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT是另一“允許自我通訊”的行。

    問:我用Linux作為代理讓區域網裡的所有機器上ADSL。用iptables設定NAT,所有的機器都

    能夠上網了。現在有一個新的要求,區域網裡有一臺WEB伺服器,需要從internet上能

    夠訪問,以前用Sygate作代理的時候,作過一個埠對映,將代理伺服器上的埠80映

    射到Web伺服器的80埠,請問用iptables應該如何來作這個對映?

    解:iptables -t nat -A PREROUTING -d "你的外網ip" --dport 80 -j DNAT --to "Web伺服器ip":80

  • 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-689274/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章