有意無意中搜尋到的,覺得寫的還不錯,備忘收藏一下^^
http://itzone.hk/article/index.php?tid=14過濾規則專題(一)
過濾規則專題(一)
http://itzone.hk/article/article.php?aid=200502161756193879您也許已經對「-p」、「-s」
、「-i」等選項感到迷惑,這一章正是要介紹這些過濾規則內的詳細設定。其實iptables是由多
個不同的表組成,包括filter、nat和mangle,我們在過往三章所介紹的,全都是使用filter這個table,即是有關過濾規則的
table,而nat則是關於新建立的網絡連接,有PREROUTING、OUTPUT和POSTROUTING這三道chain,以下將會介紹一切有關filter這個table的過濾規則選項。
(1) -p (Protocol,封包使用協定)
「-p」的語法如下:-p, --protocol [!] protocol「protocol」
可以是「tcp」、「udp」、「icmp」或「all」,其中「all」代表所有protocol都能適用於這道規則,若果您輸入「-p
all」的話,其效果就等同您沒有輸入過一樣。iptables會查看/etc/protocols內所支援的協定,因此您也可在「protocol」一
欄中輸入那些名字或數字,例如我想過濾所有進入的GGP(Gateway-Gateway Protocol)封包,可使用以下指令:iptables -A INPUT -p ggp -j DROP另外,「-p 0」是代表「-p all」,其意義剛才已經解釋過了。在「protocol」一欄前加上「!」號,代表所有不是該protocol的封包都能符合此規則,例如除了TCP封包外,我想過濾其餘所有封包,可以輸入以下指令:iptables -A INPUT -p ! tcp -s 127.0.0.1 -j DROP
(2) -s (Source,封包來源)
「-s」的語法如下:-s, --source [!] address[/mask]「address」
可以是主機名稱,例如localhost和beryl等,當然也可以是一個IP地址,這樣就能指定封包是源自哪一部電腦。假若您想確定封包是來自哪一個網
絡的話,您便要輸入「mask」,例如您想阻隔來自203.194.207.0/24整個網絡的TCP封包,您可以輸入以下指令iptables -A INPUT -p tcp -s 203.194.207.0/24 -j DROP與「-p」類似,在「address」前加上「!」號代表除了該地址外的所有封包都符合此規則,例如您的電腦只容許您某位朋友(如137.189.3.8)連線過來,您可以輸入以下指令:iptables -A INPUT -p tcp -s ! 137.189.3.8 -j DROP當
然您也可輸入「iptables -A INPUT -p tcp -s 137.189.3.8 -j
ACCEPT」,但這並不代表您已經過濾了其他封包,這樣只是「容許您的朋友進入」,但並未做到「阻止其他人進入」這個效果。因此在設計上您要在這道規則
後加上「iptables -A INPUT -p tcp -j DROP」:iptables -A INPUT -p tcp -s 137.189.3.8 -j ACCEPT
iptables -A INPUT -p tcp -j DROP
(3) -d (Destination,封包目的地)
「-d」的語法如下:-d, --destination [!] address[/mask]與「-s」的設定和概念是一模一樣的,請讀者參閱(2)。
(4) -j (Jump,如何處理封包)
「-j」的語法如下:-j, --jump target「Jump」
代表封包符合規則時,應如何處理這個封包,如以往所看到的,「target」可以是DROP和ACCEPT,分別代表把封包消滅和接受封包。另外還有
LOG、REJECT、ULOG和TCPMSS,以及只有在nat
table才能使用的SNAT、DNAT、MASQUERADE、REDIRECT,和只有在mangle
table才能使用的MARK、TOS、DSCP和ECN。詳細內容將在稍後介紹。
(5) -i (Input interface,網絡介面來源)
「-i」的語法如下:-i, --in-interface [!] name每
一個網絡數據都需要經過網絡介面送出或進入,一般電腦的網絡介面名稱為eth0、eth1等,在Sparc電腦的介面名稱為hme0、hme1等,虛擬介
面的名稱可能是eth0:1、eth0:2、eth1:1諸如此類。因為我們的電腦可能有兩張網絡卡,或者在一張網絡卡上有兩個或以上的介面,因此我們會
遇上只想過濾來自某個介面的封包的情形,例如我們想過濾一切來自「lo」這個介面(i.e. loopback)的封包,我們可以使用以下指令:iptables -A INPUT -i lo -j DROP「-
i」只適用於INPUT、FORWARD和nat所擁有的PREROUTING,因為您不會在OUTPUT內有意思地定義「輸入介面」這個參數。另外,假
若您想同時讓eth0、eth0:1和eth0:2使用同一道過濾規則(常用於擁有多個虛擬網絡介面的電腦),那麼我們可以在「name」後加上「+」
號:iptables -A INPUT -i eth0+ -p icmp -j DROP那麼我們便能以一道規則,同時適用於以「eth0」為字首的網絡介面,它能把所有源於「eth0+」的ICMP封包過濾掉。與「-i」和「-o」類似,在「name」欄前加上「!」號代表顛倒的意思。
(6) -o (Output interface,網絡送出介面)
「-o」的語法如下:-o, --out-interface [!] name「-o」的用法與「-i」一模一樣,但「-o」只適於FORWARD、OUTPUT和nat的POSTROUTING。另外,只有FORWARD才要同時使用「-i」和「-o」選項。
(7) -f (Fragment,封包段)
「-f」的語法如下:[!] -f, --fragment一個封包的大小是有限的,而且每個封包的大小是該協定所決定的,因此您不能隨意更改封包的大小,所以當一個封包從某協定轉移到另一個協定(例如TCP封包被封裝成IP封包),便有可能出現分段化(Fragmentation),把原本大封包分散成數個小封包。問題是當封包被拆散後,只有第一個小封包擁有該大封包的標頭資料,而第二個和以後的小封包均只剩下一般數據,於是只有第一個封包才有機會符合過濾規則,第二個和以後的封包由於沒有標頭的關係,所以都不會被過濾。因此我們需要「-f」選項來設定過濾第二個和以後的封包。例如:iptables -A INPUT -f -s 137.189.3.4 -j DROP會消滅所有來自137.189.3.4的第二個或以後的封包段。其實讓不完整的封包段流入網絡該不會釀成任何危險,因為在接收的一方根本無法把封包段重整還原,於是程式便會把進來封包全部拒絕。
(8) -c (Counter,累加器初值設定)
「-c」的語法如下:-c, --set-counters PKTS BYTES「-c」在加入過濾規則時會把總封包數目和總數據流量分別設為「PKTS」和「BYTES」。
剛才八個選項是iptables的核心選項,以下五個選項是較次要的:
(9) -v (Verbose,詳細內容)
「-v」會把iptables內的所有設定詳細列出,例如「iptables -L -v」。
(10) -n (Numeric,數值顯示)
「-n」會直接將數值資料輸出,例如IP地址、網絡掩碼等。
(11) -x (Exact,精確數值顯示)
「-x」會把數值資料,例如總封包流量及總數據流量,以精確的數值顯示,並不會把數值以GB、MB或KB作為約數顯示。
(12) --line-numbers(行碼顯示)
「--line-numbers」會在每道過濾規則旁邊加上規則行號,例如:Chain INPUT (policy ACCEPT)
num target prot opt
source
destination
1 ACCEPT icmp --
beryl
anywhere
2 ACCEPT icmp --
127.0.0.2
anywhere
3 ACCEPT icmp --
127.0.0.3
anywhere
4 ACCEPT icmp --
127.0.0.4
anywhere
Chain FORWARD (policy ACCEPT)
num target prot opt
source
destination
Chain OUTPUT (policy ACCEPT)
num target prot opt
source
destination
(13) --modprobe(載入iptables模組)
「--modprobe」會把iptables的延伸模組載入,供該規則使用。延伸
模組將在下一篇介紹。資料參考
[1] Rusty Russell. "Linux 2.4 Packet Filtering HOWTO" [Online]. Available: http://www.netfilter.org/documentation/HOWTO//packet-filtering-HOWTO.html
[2] Rusty Russell and Harald Welte. "Linux Netfilter Hacking HOWTO" [Online]. Available: http://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO.html
[3] J. Postel. "RFC 793 - Transmission Control Protocol". Sept. 1981 [Online]. Available: http://www.faqs.org/rfcs/rfc793.html
過濾規則專題(二)過濾規則專題(二)http://itzone.hk/article/article.php?aid=200502162126430483 剛才所提到的核心選項其實不足以應付我們的需求,例如我想過濾所有來自外部的網頁伺服器請求,但我根本無法讓iptables知道要阻
隔送往port 80的封包。因此我們需要擴展iptables的功能,於是便有iptables模組的出現,來支援更複雜的過濾規則。至
今共有18個流行的iptables模組,我們會逐一介紹。我們可使用「-m」(Match)選項來載入那些模組,例如您想載入「TCP」模組,您便需要輸入「-m
tcp」。當我們使用「-p tcp」時,其實iptables會自動載入TCP模組,但只有一小部分「-p」選項有這個例外功能。更多的iptables模組可往 http://www.netfilter.org 尋找。
(1) TCP
這個該會是大家最常用的選項,只要大家輸入「-p tcp」時便能使用。TCP模組有以下選項:
(1.1) --source-port
即是來源埠,其語法如下:--source-port [!] port[:port]假如我想過濾所有來自port 1025的封包,我們可以使用:iptables -A INPUT -p tcp --source-port 1025 -j DROP其實「--source-port」也可縮寫為「--sport」。另外,如果您想一次過過濾某個範圍的port,您可以使用「port:port」,例如您想過濾port 1025至3000的封包:iptables -A INPUT -p tcp --sport 1025:3000 -j DROP加上「!」即代表顛倒的意思。
(1.2) --destination-port即是目的地埠,其語法如下:--destination-port [!] port[:port]其用法與「--source-port」相同。其縮寫為「--dport」。(1.3) --tcp-flags--tcp-flags [!] mask compTCP封包的flag共有六種,分別是SYN、ACK、FIN、RST、URG和PSH,詳細解釋請參閱RFC793。這些不同種類的封包控制了TCP連線的狀態,現在有許多網絡攻擊模式都是以TCP的弱點出發,透過不同的TCP連線狀態來偽裝或竊聽。若果您想讓您的電腦能主動連接其他主機,但卻不想其他主機主動連接您,您可以過濾所有來自外部,並含「SYN」的封包,因為只有主動連接的主機才會發送「SYN」封包,例子如下:iptables -A INPUT -p tcp --tcp-flags ALL SYN -j DROP當中「ALL」代表該規則會查看全部flags,「SYN」則代表該封包要有syn這個flag,而其餘五個flags都沒有被設定。即是說如果我們把剛才的指令寫成:iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j DROP是與剛才的指令等效的。當中「mask」的flags要以逗號分隔。另外,在「--tcp-flags」後加上「!」號代表顛倒的意思。設定--tcp-flags的過濾規則需要讀者對TCP和TCP exploit技巧有一定認識,例如FIN攻擊、RST攻擊及連接埠掃描(port scanning)等,在此不作詳談。(1.4) --syn[!] --syn「--syn」即等同於「--tcp-flags SYN,ACK,FIN SYN」,由於太常用的關係,因此額外以一個選項表示。加上「!」號有顛倒的意思。(1.5) --tcp-option--tcp-option [!] numberTCP
標頭的其中一個欄是「option」,首一個bytes是option
number,即「--tcp-option」後面的「number」,因此「number」的範圍是0至255,根據RFC793,只有number
= 0, 1, 2是被定義的,3或以後的選項並未定義。各數字選項的定義請參閱RFC793。(1.6) --mss--mss value[:value]MSS(Maximum Segment Size)代表每個封包的最大容量,每次建立TCP連接時,雙方主機都會交換MSS值,以確保大家有相同的最大封包大小。「value」是以byte為單位,使用「value:value」能設定MSS的範圍。
(2) UDP
只要您使用「-p udp」就會載入UDP模組。它只提供「--source-port 」和「--destination-port」,用法與TCP相同。
(3) ICMP
當大家使用「-p icmp」時,就會載入ICMP模組。(3.1) --icmp-type [!] typename「typename」所指的是ICMP封包種類名稱,ICMP定義了大量封包種類,讀者可輸入「iptables -p icmp -h」顯示所有iptables所支援的封包類型。各類型封包的定義請參考RFC792。大
部份使用ICMP過濾規則的情況,都是為了防止ICMP偽導向攻擊(ICMP redirection
attack),即某駭客主機向其他電腦發放ICMP redirection封包,讓受害主機錯誤認為駭客主機才是預設通訊閘(Default
gateway),那麼受害主機所有送出網絡的數據都會傳送至駭客主機。ICMP
redirection的「typename」有兩種,分別是「network-redirect」和「host-redirect」,一般來說我們都會
消滅這兩類封包。iptables -A INPUT -p icmp --icmp-typename network-redirect -j DROP
iptables -A INPUT -p icmp --icmp-typename host-redirect -j DROP
(4) MAC
MAC(Medium Access Control)是屬於數據鏈路層(Data-link layer)的,每一個網絡裝置都有一個6
bytes的MAC地址,該6個bytes都以「:」分隔,由於MAC地址是唯一的,因此您可利用MAC地址來確知封包是來自哪一部電腦。您需要輸入「-m mac」來使用此選項,而並非「-p mac」。 (4.1) --mac-source--mac-source [!] address「address」就是MAC地址,其格式為XX:XX:XX:XX:XX:XX,共6個bytes,因為MAC地址並不會重覆,所以您能準確地針對某部主機來過濾封包。
(5) Limit
「Limit」模組是用來限制在某段時間,該規則的核對次數,即是間接限制了某種封包接收和傳送的速度,於是我們可用「Limit」選項來控制網絡流量。您需要輸入「-m limit」來載入Limit模組。(5.1) --limit--limit rate「-
-limit」即是在某時段內最高的核對次數,例如「--limit
6/second」就是每秒最多符合五次,若果多過五次的話,則該封包並不符合這規則。除了「second」這個單位外,還有「minute」、
「hour」和「day」,而且「second」可以縮寫為「s」,其他單位亦同樣有縮寫,例如「--limit 6/s」、「--limit
10/m」、「--limit 20/h」等等。大家可能還未聯想到「核對次數」與「流量控制」的關係,因為您可以控制到每秒、每分鐘和每小時只符合多少次,例如:iptables -A INPUT -p icmp -s 11.22.33.44 -m limit --limit 6/m -j ACCEPT那
麼這道規則只會每分鐘核對六次,過了六次後,就算符合「-p icmp -s
127.0.0.1」這個標頭也