iptables詳解

更多內容請訪問我的個人網站【Linux札記】

Linux 的內置firewall機制,是通過kernel中的netfilter模塊實現的(www.netfilter.ort)。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 &mdash;&mdash;dport 22 -j REJECT &mdash;&mdash;reject-with tcp-reset

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

REDIRECT 將封包重新導向到另一個端口(PNAT),進行完此處理動作後,將 會繼續比對其它規則。 這個功能可以用來實作通透式 porxy 或用來保護 web 服務器。例如:iptables -t nat -A PREROUTING -p tcp &mdash;&mdash;dport 80 -j REDIRECT &mdash;&mdash;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 &mdash;&mdash;to-ports 1024-31000

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

iptables -A INPUT -p tcp -j LOG &mdash;&mdash;log-prefix "INPUT packets"

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

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT &mdash;&mdash;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 &mdash;&mdash;dport 80 -j DNAT &mdash;&mdash;to-destination 192.168.1.1-192.168.1.10:80-100

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

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

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

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

iptables -t mangle -A PREROUTING -p tcp &mdash;&mdash;dport 22 -j MARK &mdash;&mdash;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是另一&ldquo;允許自我通信&rdquo;的行。

     

    問:我用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章