iptables--規則

1.基本語法

基本語法如下:

iptables [-t table ] command [match] [target/jump]

對於這個句法沒什麼可說的,但注意 target 指令必須在最後。爲了易讀,我們一般用這種語法。總之,你將見到的大部分規則都是按這種語法寫的。在[table]處指定表名。一般情況下沒有必要指定使用的表,因爲 iptables 默認使用 filter 表來執行所有的命令。command告訴程序該做什麼,比如:插入一個規則,還是在鏈的末尾增加一個規則,還是刪除一個規則。match 細緻地描述了包的某個特點,以使這個包區別於其它所有的包。在這裏,我們可以指定包的來源 IP 地址,網絡接口,端口,協議類型,或者其他什麼。最後是數據包的目標所在。若數據包符合所有的 match,內核就用 target 來處理它,或者說把包發往 target。比如,我們可以讓內核把包發送到當前表中的其他鏈(可能是我們自己建立的),或者只是丟棄這個包而沒有什麼處理,或者向發送者返回某個特殊的應答。

2.表

選項-t 用來指定使用哪個表,它可以是下面介紹的表中的任何一個,默認的是
filter 表。

Table (表名) Explanation (註釋)
nat 主要用處是網絡地址轉換,即 Network AddressTranslation,縮寫爲 NAT。做過 NAT 操作的數據包的地址就被改變了,當然這種改變是根據我們的規則進行的。屬於一個流的包只會經過這個表一次。如果第一個包被允許做 NAT 或 Masqueraded,那麼餘下的包都會自動地被做相同的操作。也就是說,餘下的包不會再通過這個表,一個一個的被 NAT,而是自動地完成。這就是我們爲什麼不應該在這個表中做任何過濾的主要原因,對這一點,後面會有更加詳細的討論。PREROUTING 鏈的作用是在包剛剛到達防火牆時改變它的目的地址,如果需要的話。OUTPUT 鏈改變本地產生的包的目的地址。POSTROUTING 鏈在包就要離開防火牆之前改變其源地址。
mangle 主要用來 mangle 數據包。我們可以改變不同的包及包頭的內容,比如TTL,TOS 或 MARK。注意 MARK 並沒有真正地改動數據包,它只是在內核空間爲包設了一個標記。防火牆內的其他的規則或程序(如 tc)可以使用這種標記對包進行過濾或高級路由。這個表有五個內建的鏈: PREROUTING , POSTROUTING , OUTPUT , INPUT和 FORWARD 。 PREROUTING 在包進入防火牆之後、路由判斷之前改變包, POSTROUTING 是在所有路由判斷之後。 OUTPUT 在確定包的目的之前更改數據包。 INPUT 在包被路由到本地之後,但在用戶空間的程序看到它之前改變包。 FORWARD 在最初的路由判斷之後、最後一次更改包的目的之前 mangle 包。注意,mangle 表不能做任何NAT,它只是改變數據包的 TTL,TOS 或 MARK,而不是其源目地址。NAT 是在 nat 表中操作的。
filter 專門過濾包的,內建三個鏈,可以毫無問題地對包進行 DROP、LOG、ACCEPT 和 REJECT 等操作。 FORWARD 鏈過濾所有不是本地產生的並且目的地不是本地(所謂本地就是防火牆了)的包,而 INPUT 恰恰針對那些目的地是本地的包。 OUTPUT 是用來過濾所有本地生成的包的。

3.命令

command 指定iptables 對我們提交的規則要做什麼樣的操作。這些操作可能是在某個表裏增加或刪除一些東西,或做點兒其他什麼。

命令 -A, --append
舉例 iptables -A INPUT …
說明 在所選擇的鏈末添加規則。當源地址或目的地址是以名字而不是ip 地址的形式出現時,若這些名字可以被解析爲多個地址,則這條規則會和所有可用的地址結合。
命令 -C, --check
舉例 iptables -C INPUT --dport 80 -j DROP
說明 檢查所選鏈中的規則是否存在
命令 -D, --delete
舉例 iptables -D INPUT --dport 80 -j DROP 或 iptables -D INPUT 1
說明 從所選鏈中刪除規則。有兩種方法指定要刪除的規則:一是把規則完完整整地寫出來,再就是指定規則在所選鏈中的序號(每條鏈的規則都各自從 1 被編號)。
命令 -R, --replace
舉例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
說明 在所選中的鏈裏指定的行上(每條鏈的規則都各自從 1 被編號)替換規則。它主要的用處是試驗不同的規則。當源地址或目的地址是以名字而不是 ip 地址的形式出現時,若這些名字可以被解析爲多個地址,則這條 command 會失敗。
命令 -I, --insert
舉例 iptables -I INPUT 1 --dport 80 -j ACCEPT
說明 根據給出的規則序號向所選鏈中插入規則。如果序號爲 1,規則會被插入鏈的頭部,其實默認序號就是 1。
命令 -L, --list
舉例 iptables -L INPUT
說明 列出所選鏈的所有規則。如果沒有指定鏈,則顯示指定表中的所有鏈。如果什麼都沒有指定,就顯示默認表所有的鏈。精確輸出受其它參數影響,如-n 和-v 等參數,下面會介紹。
命令 -S, --list-rules
舉例 iptables -S INPUT
說明 打印所選鏈的所有規則。如果沒有指定鏈,則顯示指定表中的所有鏈。如果什麼都沒有指定,就顯示默認表所有的鏈。
命令 -F, --flush
舉例 iptables -F INPUT
說明 清空所選的鏈。如果沒有指定鏈,則清空指定表中的所有鏈。如果什麼都沒有指定,就清空默認表所有的鏈。當然,也可以一條一條地刪,但用這個 command 會快些。
命令 -Z, --zero
舉例 iptables -Z INPUT
說明 把指定鏈(如未指定,則認爲是所有鏈)的所有計數器歸零。
命令 -N, --new-chain
舉例 iptables -N allowed
說明 根據用戶指定的名字建立新的鏈。上面的例子建立了一個名爲allowed 的鏈。注意,所用的名字不能和已有的鏈、target 同名。
命令 -X, --delete-chain
舉例 iptables -X allowed
說明 刪除指定的用戶自定義鏈。這個鏈必須沒有被引用,如果被引用,在刪除之前你必須刪除或者替換與之有關的規則。如果沒有給出參數,這條命令將會刪除默認表所有非內建的鏈。
命令 -P, --policy
舉例 iptables -P INPUT DROP
說明 爲鏈設置默認的 target(可用的是 DROP 和 ACCEPT,如果還有其它的可用,請告訴我),這個 target 稱作策略。所有不符合規則的包都被強制使用這個策略。只有內建的鏈纔可以使用規則。但內建的鏈和用戶自定義鏈都不能被作爲策略使用,也就是說不能像這樣使用:iptables -P INPUT allowed(或者是內建的鏈)。
命令 -E, --rename-chain
舉例 iptables -E allowed disallowed
說明 對自定義的鏈進行重命名,原來的名字在前,新名字在後。如上,就是把 allowed 改爲 disallowed。這僅僅是改變鏈的名字,對整個表的結構、工作沒有任何影響。

4.選項

選項 -t, --table
可用此選項的命令 all
說明 表操作,默認爲filter
選項 -v, --verbose
可用此選項的命令 -L,-A,-I,-D,-R
說明 這個選項使輸出詳細化,常與-L連用。與-L連用時,輸(說明)出中包括網絡接口的地址、規則的選項、TOS 掩碼、字節和包計數器,其中計數器是以 K、M、G(這裏用的是 10 的冪而不是 2 的冪哦)爲單位的。如果想知道到底有多少個包、多少字節,還要用到選項-x,下面會介紹。如果-v 和-A,-I,-D 或-R 連用,iptables 會輸出詳細的信息告訴你規則是如何被解釋的、是否正確地插入等等。
選項 -x, --exact
可用此選項的命令 -L
說明 使-L輸出中的計數器顯示準確的數值,而不用 K、M、G 等估值。
選項 -n, --numeric
可用此選項的命令 -L
說明 使輸出中的 IP 地址和端口以數值的形式顯示,而不是默認的名字,比如主機名、網絡名、程序名等。
選項 –line-numbers
可用此選項的命令 -L
說明 顯示出每條規則在相應鏈中的序號。
選項 -c, --set-counters
可用此選項的命令 -A,-I,-R
說明 在創建或更改規則時設置計數器,語法如下:–set-counters 20 4000,意思是讓內核把包計數器設爲 20,把字節計數器設爲 4000。

5.匹配

歸爲五類。第一類是 generic matches(通用的匹配) ,適用於所有的規則;第二類是 TCP matches ,顧名思義,這隻能用於 TCP 包;第三類是 UDP matches ,當然它只能用在 UDP 包上了;第四類是 ICMP matches ,針對 ICMP 包的;第五類比較特殊,針對的是狀態(state),所有者(owner)和訪問的頻率限制(limit)等。

5.1 通用匹配

無論我們使用的是何種協議,也不管我們又裝入了匹配的何種擴展,通用匹配都使可用的。也就是說,它們可以直接使用,而不需要什麼前提條件,在後面你會看到,有很多匹配操作是需要其他的匹配作爲前提的。

匹配 -p, --protocol
舉例 iptables -A INPUT -p tcp
說明 匹配指定的協議。指定協議的形式有以下幾種:1、名字,不分大小寫,但必須是在 /etc/protocols 中定義的。2、可以使用它們相應的整數值。例如,ICMP 的值是 1,TCP 是 6,UDP 是 17。3、缺省設置,ALL,相應數值是 0,但要注意這隻代表匹配 TCP、UDP、ICMP,而不是 /etc/protocols 中定義的所有協議。4、可以是協議列表,以英文逗號爲分隔符,如:udp,tcp5、可以在協議前加英文的感嘆號表示取反,注意有空格,如:-p ! tcp 表示非 tcp 協議,也就是 UDP 和 ICMP。可以看出這個取反的範圍只是 TCP、UDP 和 ICMP。
匹配 -s, --src, --source
舉例 iptables -A INPUT -s 192.168.1.1
說明 以 IP 源地址匹配包。地址的形式如下:1、單個地址,如 192.168.1.1 ,也可寫成192.168.1.1/255.255.255.255 或 192.168.1.1/32。2、網絡,如 192.168.0.0/24 ,或 192.168.0.0/255.255.255.0。3、在地址前加英文感嘆號表示取反,注意空格,如–source ! 192.168.0.0/24 表示除此地址外的所有地址。4、缺省是所有地址
匹配 -d, --dst, --destination
舉例 iptables -A INPUT -d 192.168.1.1
說明 以 IP 目的地址匹配包。地址的形式和 – source 完全一樣。
匹配 -i, --in-interface
舉例 iptables -A INPUT -i eth0
說明 以包進入本地所使用的網絡接口來匹配包。要注意這個匹配操作只能用於 INPUT , FORWARD 和 PREROUTING 這三個鏈,用在其他任何地方都會提示錯誤信息。指定接口有一下方法:1、指定接口名稱,如:eth0、ppp0 等。2、使用通配符,即英文加號,它代表字符數字串。若直接用一個加號,即 iptables -A INPUT -i +表示匹配所有的包,而不考慮使用哪個接口。這也是不指定接口的默認行爲。通配符還可以放在某一類接口的後面,如:eth+表示所有 Ethernet 接口,也就是說,匹配所有從 Ethernet 接口進入的包。3、在接口前加英文感嘆號表示取反,注意空格,如:-i ! eth0意思是匹配來自除 eth0 外的所有包。
匹配 -o, --out-interface
舉例 iptables -A FORWARD -o eth0
說明 以包離開本地所使用的網絡接口來匹配包。使用的範圍和指定接口的方法與–in-interface 完全一樣。
匹配 -f, --fragment
舉例 iptables -A INPUT -f
說明 用來匹配一個被分片的包的第二片或及以後的部分。因爲它們不包含源或目的地址,或 ICMP 類型等信息,其他規則無法匹配到它,所以纔有這個匹配操作。要注意碎片攻擊哦。這個操作也可以加英文感嘆號表示取反,但要注意位置,如:! -f 。取反時,表示只能匹配到沒有分片的包或者是被分片的包的第一個碎片,其後的片都不行。現在內核有完善的碎片重組功能,可以防止碎片攻擊,所以不必使用取反的功能來防止碎片通過。如果你使用連接跟蹤,是不會看到任何碎片的,因爲在它們到達任何鏈之前就被處理過了。

5.2 隱含匹配

這種匹配操作是自動地或隱含地裝載入內核的。例如我們使用–protocol tcp時,不需再裝入任何東西就可以匹配只有 IP 包纔有的一些特點。現在有三種隱含的匹配針對三種不同的協議,即 TCP matches , UDP matches 和 ICMP matches 。它們分別包括一套只適用於相應協議的判別標準。

5.2.1 TCP匹配

TCP matches 只能匹配 TCP 包或流的細節,它們必須有–protocol tcp 作爲前提條件。

匹配 –sport, --source-port
舉例 iptables -A INPUT -p tcp --sport 22
說明 基於 TCP 包的源端口來匹配包,端口的指定形式如下:1、不指定此項,則暗示所有端口。2、使用服務名或端口號,但名字必須是在 /etc/services 中定義的,因爲 iptables 從這個文件裏查找相應的端口號。從這可以看出,使用端口號會使規則裝入快一點兒,當然,可讀性就差些了。但是如果你想寫一個包含 200 條或更多規則的規則集,那你還是老老實實地用端口號吧,時間是主要因素(在一臺稍微慢點兒地機子上,這最多會有 10 秒地不同,但要是 1000 條、10000 條呢)。3、可以使用連續的端口,如:–source-port 22:80 這表示從 22到 80 的所有端口,包括 22 和 80。如果兩個號的順序反了也沒關係,如:–source-port 80:22 這和 --source-port 22:80 的效果一樣。4、可以省略第一個號,默認第一個是 0,如:–source-port :80表示從 0 到 80 的所有端口。5、也可以省略第二個號,默認是 65535,如:–source-port 22:表示從 22 到 65535 的所有端口6、在端口號前加英文感嘆號表示取反,注意空格,如:–source-port ! 22 表示除 22 號之外的所有端口;–source-port ! 22:80 表示從 22 到 80(包括 22 和 80)之外的所有端口。注意:這個匹配操作不能識別不連續的端口列表,如:–source-port ! 22, 36, 80 這樣的操作是由後面將要介紹的多端口匹配擴展來完成的。
匹配 –dport, --destination-port
舉例 iptables -A INPUT -p tcp --dport 22
說明 基於 TCP 包的目的端口來匹配包,端口的指定形式和–sport 完全一樣。
匹配 –tcp-flags
舉例 iptables -p tcp --tcp-flags SYN ACK
說明 匹配指定的 TCP 標記。有兩個參數,它們都是列表,列表內部用英文的逗號作分隔符,這兩個列表之間用空格分開。第一個參數指定我們要檢查的標記(作用就象掩碼),第二個參數指定“在第一個列表中出現過的且必須被設爲 1(即狀態是打開的)的”標記(第一個列表中其他的標記必須置 0)。也就是說,第一個參數提供檢查範圍,第二個參數提供被設置的條件(就是哪些位置 1)。這個匹配操作可以識別以下標記: SYN , ACK , FIN , RST , URG , PSH 。另外還有兩個詞也可使用,就是 ALL 和 NONE。顧名思義,ALL 是指選定所有的標記,NONE 是指未選定任何標記。這個匹配也可在參數前加英文的感嘆號表示取反。例如:1、iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 表示匹配那些 SYN 標記被設置而 FIN 和 ACK 標記沒有設置的包,注意各標記之間只有一個逗號而沒有空格。2、–tcp-flags ALL NONE 匹配所有標記都未置 1 的包。3、iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN 表示匹配那些 FIN 和 ACK 標記被設置而 SYN 標記沒有設置的包,注意和例 1比較一下。
匹配 –tcp-option
舉例 iptables -p tcp --tcp-option 16
說明 根據匹配包。TCP 選項是 TCP 頭中的特殊部分,有三個不同的部分。第一個 8 位組表示選項的類型,第二個 8 位組表示選項的長度(這個長度是整個選項的長度,但不包含填充部分所佔的字節,而且要注意不是每個 TCP 選項都有這一部分的),第三部分當然就是選項的內容了。爲了適應標準,我們不必執行所有的選項,但我們可以查看選項的類型,如果不是我們所支持的,那就只是看看長度然後跳過數據部分。這個操作是根據選項的十進制值來匹配的,它也可以用英文感嘆號取反。

5.2.2 UDP匹配

UDP matches 是在指定–protocol UDP 時自動裝入的。UDP 是一種無連接協議,
所以在它打開、關閉連接以及在發送數據時沒有多少標記要設置,它也不需要任
何類型的確認。數據丟失了,就丟失了(不會發送 ICMP 錯誤信息的)。這就說
明 UDP matches 要比 TCP matches 少多了。

匹配 –sport, --source-port
舉例 iptables -A INPUT -p udp --sport 53
說明 基於 UDP 包的源端口來匹配包,端口的指定形式和 TCP matches 中的–sport 完全一樣。
匹配 –dport, --destination-port
舉例 iptables -A INPUT -p udp --dport 53
說明 基於 UDP 包的目的端口來匹配包,端口的指定形式和 TCP matches中的–sport 完全一樣。

5.2.3 ICMP匹配

ICMP 協議也是無連接協議。ICMP 協議不是IP 協議的下屬協議,而是它的輔助者,其主要作用是報告錯誤和連接控制。

匹配 –icmp-type
舉例 iptables -A INPUT -p icmp --icmp-type 8
說明 根據 ICMP 類型匹配包,類型的指定可以使用十進制數值或相應的名字,數值在 RFC792 中有定義,名字可以用 iptables --protocol icmp --help 查看,或者在附錄 ICMP 類型 中查找。這個匹配也可用英文感嘆號取反,如:–icmp-type ! 8 就表示匹配除類型 8 之外的所有 ICMP 包。要注意有些 ICMP 類型已經廢棄不用了,還有一些可能會對無防護的主機帶來“危險”,因爲它們可能把包重定向到錯誤的地方。

5.3 顯式匹配

顯式匹配必須用-m 或–match 裝載,比如要使用狀態匹配就必須使用-m state。
有些匹配還需要指定協議,有些就不需要,比如連接狀態就不要。隱含匹配和顯式匹配最大的區別就是一個是跟隨協議匹配自動裝載的,一個是顯式裝載的。

5.3.1 Limit匹配

這個匹配操作必須由-m limit 明確指定才能使用。有了它的幫助,就可以對指定的規則的日誌數量加以限制,以免你被信息的洪流淹沒哦。比如,你可以事先設定一個限定值,當符合條件的包的數量不超過它時,就記錄;超過了,就不記錄了。我們可以控制某條規則在一段時間內的匹配次數(也就是可以匹配的包的數量),這樣就能夠減少 DoS syn flood 攻擊的影響。這是它的主要作用,當然,還有很多其他作用(譯者注:比如,對於某些不常用的服務可以限制連接數量,以免影響其他服務)。limit match 也可以用英文感嘆號取反,如:-m limit ! --limit 5/s 表示在數量超過限定值後,所有的包都會被匹配。比如,你指定了–limit 3/minute --limit-burst 5 ,意思是開始時有 5 個,用完之後每 20 秒增加一個(這就是從 iptables 的角度看的,要是以用戶的角度看,說法就是每一分鐘增加三個或者每分鐘只能過三個)。你要是想每 20 分鐘過一個,只能寫成–limit 3/hour --limit-burst 5,也就是說你要把時間單位湊成整的。

匹配 –limit
舉例 iptables -A INPUT -m limit --limit 3/hour
說明 設置最大平均匹配速率,也就是單位時間內 limit match 可以匹配幾個包。它的形式是一個數值加一個時間單位,可以是/second /minute /hour /day 。默認值是每小時 3 次(用戶角度),即 3/hour ,也就是每 20 分鐘一次(iptables 角度)。
匹配 –limit-burst
舉例 iptables -A INPUT -m limit --limit-burst 5
說明 這裏定義的是 limit match 的峯值,就是在單位時間(這個時間由上面的–limit 指定)內最多可匹配幾個包(由此可見,–limit-burst 的值要比–limit 的大)。默認值是 5。

5.3.2 MAC匹配

基於包的 MAC 源地址匹配包。

匹配 –mac-source
舉例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
說明 基於包的 MAC 源地址匹配包,地址格式只能是 XX:XX:XX:XX:XX:XX ,當然它也可以用英文感嘆號取反,如–mac- source !00:00:00:00:00:01,意思很簡單了,就是除此之外的地址都可接受嘛。注意,因爲 MAC addresses 只用於 Ethernet 類型的網絡,所以這個 match 只能用於 Ethernet 接口。而且,它還只能在PREROUTING , FORWARD 和 INPUT 鏈裏使用。

5.3.3 Mark匹配

以包被設置的 mark 來匹配包,這個值只能由內核更改。前面曾經提到過,mark
比較特殊,它不是包本身的一部分,而是在包穿越計算機的過程中由內核分配的
和它相關聯的一個字段。它可能被用來改變包的傳輸路徑或過濾。時至今日,在
linux 裏只有一種方法能設置 mark,即 iptables 的 MARK target。mark 字段的值是一個無符號的整數,在 32 位系統上最大可以是 4294967296(就是 2 的 32 次方)。

匹配 –mark
舉例 iptables -t mangle -A INPUT -m mark --mark 1
說明 以包被設置的 mark 值來匹配包,這個值是是由下面將要介紹的MARK target 來設置的,它是一個無符號的整數。所有通過Netfilter 的包都會被分配一個相關聯的 mark field 。但要注意mark 值可不是在任何情況下都能使用的,它只能在分配給它值的那臺機子裏使用,因爲它只是由內核在內存裏分配的和包相關的幾個字節,並不屬於包本身,所以我們不能在本機之外的路由器上使用。mark 的格式是–mark value[/mask],如上面的例子是沒有掩碼的,帶掩碼的例子如–mark 1/1。如果指定了掩碼,就先把 mark值和掩碼取邏輯與,然後再和包的 mark 值比較。

5.3.4 Multiport匹配

多端口匹配擴展使我們能夠在一條規則裏指定不連續的多個端口,如果沒有這個
擴展,我們只能按端口來寫規則了。

匹配 –source-port
舉例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
說明 源端口多端口匹配,最多可以指定 15 個端口,以英文逗號分隔,注意沒有空格。使用時必須有-p tcp 或-p udp 爲前提條件。
匹配 –destination-port
舉例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
說明 目的端口多端口匹配,使用方法和源端口多端口匹配一樣,唯一的區別是它匹配的是目的端口。
匹配 –port
舉例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
說明 同端口多端口匹配,意思就是它匹配的是那種源端口和目的端口是同一個端口的包,比如:端口 80 到端口 80 的包,110 到 110 的包等。使用方法和源端口多端口匹配一樣。

5.3.5 State匹配

匹配 –state
舉例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
說明 指定要匹配包的的狀態,當前有 4 種狀態可用:INVALID,ESTABLISHED,NEW 和 RELATED。 INVALID 意味着這個包沒有已知的流或連接與之關聯,也可能是它包含的數據或包頭有問題。ESTABLISHED 意思是包是完全有效的,而且屬於一個已建立的連接,這個連接的兩端都已經有數據發送。NEW 表示包將要或已經開始建立一個新的連接,或者是這個包和一個還沒有在兩端都有數據發送的連接有關。RELATED 說明包正在建立一個新的連接,這個連接是和一個已建立的連接相關的。比如, FTP data transfer , ICMP error和一個 TCP 或 UDP 連接相關。注意 NEW 狀態並不在試圖建立新連接的 TCP 包裏尋找 SYN 標記,因此它不應該不加修改地用在只有一個防火牆或在不同的防火牆之間沒有啓用負載平衡的地方。

5.3.6 TOS匹配

TOS 是 IP 頭的一部分,其含義是 Type Of Service ,由 8 個二進制位組成,包括一個 3 bit 的優先權子字段(現在已被忽略),4 bit 的 TOS 子字段和 1 bit 未用位(必須置 0)。它一般用來把當前流的優先權和需要的服務(比如,最小延時、最大吞吐量等)通知路由器。但路由器和管理員對這個值的處理相差很大,有的根本就不理會,而有的就會盡量滿足要求。

匹配 –state
舉例 iptables -A INPUT -p tcp -m tos --tos 0x16
說明 根據 TOS 字段匹配包。這個 match 常被用來 mark 包,以便後用,除此之外,它還常和 iproute2 或高級路由功能一起使用。它的參數可以是 16 進制數,也可以是十進制數,還可以是相應的名字(用iptables -m tos -h 能查到)。到寫這篇文章時,有以下參數可用:Minimize-Delay 16 (0x10),要求找一條路徑使延時最小,一些標準服務如 telnet、SSH、FTP-control 就需要這個選項。Maximize-Throughput 8 (0x08),要求找一條路徑能使吞吐量最大,標準服務 FTP-data 能用到這個。Maximize-Reliability 4 (0x04),要求找一條路徑能使可靠性最高,使用它的有 BOOTP 和 TFTP。Minimize-Cost 2 (0x02),要求找一條路徑能使費用最低,一般情況下使用這個選項的是一些視頻音頻流協議,如 RTSP(Real TimeStream Control Protocol)。Normal-Service 0 (0x00),一般服務,沒有什麼特殊要求。

5.3.7 TTL匹配

根據 IP 頭裏的 TTL (Time To Live,即生存期)字段來匹配包一旦經過一個處理它的路由器,它的值就減去 1 它的值。當該字段的值減爲 0 時,報文就被認爲是不可轉發的,數據報就被丟棄,併發送 ICMP 報文通知源主機,不可轉發的報文被丟棄。

匹配 –ttl
舉例 iptables -A OUTPUT -m ttl --ttl 60
說明 根據 TTL 的值來匹配包,參數的形式只有一種,就是十進制數值。它可以被用來調試你的局域網,比如解決 LAN 內的主機到 Internet上的主機的連接問題,或找出 Trojan(Trojan)可能的入口。這個 match 的用處相對有限,但它其實是很有用的,這就看你的想象力如何了。比如可以用它來發現那些 TTL 具有錯誤缺省值的機子(這可能是實現 TCP/IP 棧功能的那個程序本身的錯誤,或者是配置有問題)。

6.目標/跳躍

target/jump 決定符合條件的包到何處去,語法是–jump target 或-j target。它們唯
一的區別是 jump 的目標是一個在同一個表內的鏈,而 target 的目標是具體的操
作。用戶自定義鏈要用到-N 命令。下面我們在 filter 表中建一個名爲tcp_packets 的鏈:

iptables -N tcp_packets

然後再把它作爲 jump 的目標:

iptables -A INPUT -p tcp -j tcp_packets

這樣我們就會從 INPUT 鏈跳入 tcp_packets 鏈,開始在 tcp_packets 中傳輸。如果到達了 tcp_packets 鏈的結尾(也就是未被鏈中的任何規則匹配),則會退到 INPUT 鏈的下一條規則繼續它的旅行。如果在子鏈中被 ACCEPT 了,也就相當於在父鏈中被 ACCEPT 了,那麼它不會再經過父鏈中的其他規則。
target 指定我們要對包做的操作,比如 DROP 和 ACCEPT,還有很多,我們後面會介紹。不同的 target 有不同的結果。一些 target 會使包停止前景,也就是不再繼續比較當前鏈中的其他規則或父鏈中的其他規則,最好的例子就是 DROP 和ACCEPT。而另外一些 target 在對包做完操作之後,包還會繼續和其他的規則比較,如 LOG,ULOG 和 TOS。它們會對包進行記錄、mangle,然後讓包通過,以便匹配這條鏈中的其他規則。有了這樣的 target,我們就可以對同一個包既改變它的 TTL 又改變它的 TOS。

6.1 ACCEPT target

這個 target 沒有任何選項和參數,使用也很簡單,指定-j ACCEPT 即可。一旦包滿足了指定的匹配條件,就會被 ACCEPT,並且不會再去匹配當前鏈中的其他規則或同一個表內的其他規則,但它還要通過其他表中的鏈,而且在那兒可能會被DROP 也說不準哦。

6.2 DNAT target

這個 target 是用來做目的網絡地址轉換的,就是重寫包的目的 IP 地址。如果一
個包被匹配了,那麼和它屬於同一個流的所有的包都會被自動轉換,然後就可以
被路由到正確的主機或網絡。DNAT target 是非常有用的。比如,你的 Web 服務
器在 LAN 內部,而且沒有可在 Internet 上使用的真實 IP 地址,那就可以使用這個 target 讓防火牆把所有到它自己 HTTP 端口的包轉發給 LAN 內部真正的 Web
服務器。目的地址也可以是一個範圍,這樣的話,DNAT 會爲每一個流隨機分配
一個地址。因此,我們可以用這個 target 做某種類型地負載平衡。
注意,DANT target 只能用在 nat 表的 PREROUTING 和 OUTPUT 鏈中,或者是被這兩條鏈調用的鏈裏。但還要注意的是,包含 DANT target 的鏈不能被除此之外的其他鏈調用,如 POSTROUTING。

選項 –to-destination
舉例 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
說明 指定要寫入 IP 頭的地址,這也是包要被轉發到的地方。上面的例子就是把所有發往地址 15.45.23.67 的包都轉發到一段 LAN 使用的私有地址中,即 192.168.1.1 到 192.168.1.10。如前所述,在這種情況下,每個流都會被隨機分配一個要轉發到的地址,但同一個流總是使用同一個地址。我們也可以只指定一個 IP 地址作爲參數,這樣所有的包都被轉發到同一臺機子。我們還可以在地址後指定一個或一個範圍的端口。比如:–to-destination 192.168.1.1:80或 --to-destination 192.168.1.1:80-100。SNAT 的語法和這個target 的一樣,只是目的不同罷了。要注意,只有先用–protocol指定了 TCP 或 UDP 協議,才能使用端口。

6.3 DROP target

如果包符合條件,這個 target 就會把它丟掉,也就是說包的生命到此結束,不會再向前走一步,效果就是包被阻塞了。在某些情況下,這個 target會引起意外的結果,因爲它不會向發送者返回任何信息,也不會向路由器返回信息,這就可能會使連接的另一方的 sockets 因苦等迴音而亡。解決這個問題的較好的辦法是使用 REJECT target,(譯者注:因爲它在丟棄包的同時還會向發送者返回一個錯誤信息,這樣另一方就能正常結束),尤其是在阻止端口掃描工具獲得更多的信息時,可以隱蔽被過濾掉的端口等等(譯者注:因爲掃描工具掃描一個端口時,如果沒有返回信息,一般會認爲端口未打開或被防火牆等設備過濾掉了)。還要注意如果包在子鏈中被 DROP 了,那麼它在主鏈裏也不會再繼續前進,不管是在當前的表還是在其他表裏。

6.4 LOG target

這個 target 是專門用來記錄包地有關信息的。這些信息可能是非法的,那就可以用來除錯。LOG 會返回包的有關細節,如 IP 頭的大部分和其他有趣的信息。這個功能是通過內核的日誌工具完成的,一般是 syslogd。返回的信息可用 dmesg閱讀,或者可以直接查看 syslogd 的日誌文件,也可以用其他的什麼程序來看。LOG 對調試規則有很大的幫助,你可以看到包去了哪裏、經過了什麼規則的處理,什麼樣的規則處理什麼樣的包,等等。當你在生產服務器上調試一個不敢保證100%正常的規則集時,用 LOG 代替 DROP 是比較好的(有詳細的信息可看,錯誤就容易定位、解決了)。

6.5 MARK target

用來設置 mark 值,這個值只能在本地的 mangle 表裏使用,不能用在其他任何地方,就更不用說路由器或另一臺機子了。因爲 mark 比較特殊,它不是包本身的一部分,而是在包穿越計算機的過程中由內核分配的和它相關聯的一個字段。它可以和本地的高級路由功能聯用,以使不同的包能使用不同的隊列要求,等等。如果你想在傳輸過程中也有這種功能,還是用 TOS target 吧。

選項 –set-mark
舉例 iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
說明 設置 mark 值,這個值是一個無符號的整數。比如,我們對一個流或從某臺機子發出的所有的包設置了 mark 值,就可以利用高級路由功能來對它們進行流量控制等操作了。

6.6 MASQUERADE target

這個 target 和 SNAT target 的作用是一樣的,區別就是它不需要指定–to-source 。MASQUERADE 是被專門設計用於那些動態獲取 IP 地址的連接的,比如,撥號上網、DHCP 連接等。如果你有固定的 IP 地址,還是用 SNAT target吧。
僞裝一個連接意味着,我們自動獲取網絡接口的 IP 地址,而不使用–to-source 。當接口停用時,MASQUERADE 不會記住任何連接,這在我們 kill掉接口時是有很大好處的。如果我們使用 SNAT target,連接跟蹤的數據是被保留下來的,而且時間要好幾天哦,這可是要佔用很多連接跟蹤的內存的。一般情況下,這種處理方式對於撥號上網來說是較好的(這有利於已有那連接繼續使用)。如果我們被分配給了一個不同於前一次的 IP,不管怎樣已有的連接都要丟失,但或多或少地還是有一些連接記錄被保留了(真是白癡,是吧)。
即使你有靜態的 IP,也可以使用 MASQUERADE,而不用 SNAT 。不過,這不是被贊成的,因爲它會帶來額外的開銷,而且以後還可能引起矛盾,比如它也許會影響你的腳本,使它們不能用。

選項 –to-ports
舉例 iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
說明 在指定 TCP 或 UDP 的前提下,設置外出包能使用的端口,方式是單個端口,如–to-ports 1025,或者是端口範圍,如–to- ports1024-3000。注意,在指定範圍時要使用連字號。

6.7 REDIRECT target

在防火牆所在的機子內部轉發包或流到另一個端口。比如,我們可以把所有去往
端口 HTTP 的包 REDIRECT 到 HTTP proxy(例如 squid),當然這都發生在我們自
己的主機內部。本地生成的包都會被映射到 127.0.0.1。換句話說,這個 target把要轉發的包的目的地址改寫爲我們自己機子的 IP。我們在做透明代理(LAN內的機子根本不需要知道代理的存在就可以正常上網)時,這個 target 可是起了很大作用的。
注意,它只能用在 nat 表的 PREROUTING、OUTPUT 鏈和被它們調用的自定義鏈裏。

選項 –to-ports
舉例 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
說明 在指定 TCP 或 UDP 協議的前提下,定義目的端口,方式如下:1、不使用這個選項,目的端口不會被改變。2、指定一個端口,如–to-ports 8080。3、指定端口範圍,如–to-ports 8080-8090

6.8 REJECT target

REJECT 和 DROP 基本一樣,區別在於它除了阻塞包之外,還向發送者返回錯誤信
息。現在,此 target 還只能用在 INPUT、FORWARD、OUTPUT 和它們的子鏈裏,而且包含 REJECT 的鏈也只能被它們調用,否則不能發揮作用。它只有一個選項,是用來控制返回的錯誤信息的種類的。

選項 –reject-with
舉例 iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
說明 告訴 REJECT target 應向發送者返回什麼樣的信息。一旦包滿足了設定的條件,就要發送相應的信息,然後再象 DROP 一樣無情地拋棄那些包。可用的信息類型有:1、icmp-net-unreachable 2、icmp-host-unreachable 3、 icmp-port-unreachable 4、icmp-proto-unreachable 5、icmp-net-prohibited 6、icmp-host-prohibited 。其中缺省的是 port-unreachable。

6.9 RETURN target

使包返回上一層,順序是:子鏈——>父鏈——>缺省的策略。具體地說,就是若包在子鏈中遇到了 RETURN,則返回父鏈的下一條規則繼續進行條件的比較,若是在父鏈(或稱主鏈,比如 INPUT)中遇到了 RETURN,就要被缺省的策略(一般是ACCEPT 或 DROP)操作了。

6.10 SNAT target

這個 target 是用來做源網絡地址轉換的,就是重寫包的源 IP 地址。當我們有幾
個機子共享一個 Internet 連接時,就能用到它了。先在內核裏打開 ip 轉發功能,然後再寫一個 SNAT 規則,就可以把所有從本地網絡出去的包的源地址改爲Internet 連接的地址了。SNAT target 的作用就是讓所有從本地網出發的包看起來都是從一臺機子發出的,這臺機子一般就是防火牆。
SNAT 只能用在 nat 表的 POSTROUTING 鏈裏。只要連接的第一個符合條件的包被SNAT 了,那麼這個連接的其他所有的包都會自動地被 SNAT,而且這個規則還會應用於這個連接所在流的所有數據包。

選項 –to-source
舉例 iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
說明 指定源地址和端口,有以下幾種方式:1、單獨的地址。2、一段連續的地址,用連字符分隔,如194.236.50.155-194.236.50.160,這樣可以實現負載平衡。每個流會被隨機分配一個 IP,但對於同一個流使用的是同一個 IP。3、在指定-p tcp 或 -p udp 的前提下,可以指定源端口的範圍,如 194.236.50.155:1024-32000,這樣包的源端口就被限制在1024-32000 了。注意,如果可能,iptables 總是想避免任何的端口變更,換句話說,它總是盡力使用建立連接時所用的端口。但是如果兩臺機子使用相同的源端口,iptables 將會把他們的其中之一映射到另外的一個端口。如果沒有指定端口範圍, 所有的在 512 以內的源端口會被映射到 512 以內的另一個端口,512 和 1023 之間的將會被映射到 1024 內,其他的將會被映射到大於或對於 1024 的端口,也就是說是同範圍映射。還要注意,這種映射和目的端口無關。因此,如果客戶想和防火牆外的 HTTP 服務器聯繫,它是不會被映射到 FTP control 所用的端口的。

6.11 TOS target

TOS 是用來設置 IP 頭中的 Type of Service 字段的。這個字段長一個字節,可以控制包的路由情況。它也是 iproute2 及其子系統可以直接使用的字段之一。值得注意的是,如果你有幾個獨立的防火牆和路由器,而且還想在他們之間利用包的頭部來傳遞路由信息,TOS 是唯一的辦法。前面說過,MARK 是不能用來傳遞這種信息的。如果你需要爲某個包或流傳遞路由信息,就要使用 TOS 字段,它也
正是爲這個而被開發的。

選項 –set-tos
舉例 iptables -t mangle -A PREROUTING -p TCP --dport 22 -j TOS --set-tos 0x10
說明 設置 TOS 的值,值的形式可以是名字或者使相應的數值(十進制或16 進制的)。一般情況下,建議你使用名字而不使用數值形式,因爲以後這些數值可能會有所改變,而名字一般是固定的。TOS 字段有 8 個二進制位,所以可能的值是 0-255(十進制)或 0x00-0xFF(16 進制)。1、Minimize-Delay 16 (0x10),要求找一條路徑使延時最小,一些標準服務如 telnet、SSH、FTP- control 就需要這個選項。2、Maximize-Throughput 8 (0x08),要求找一條路徑能使吞吐量

最大,標準服務 FTP-data 能用到這個。3、Maximize-Reliability 4 (0x04),要求找一條路徑能使可靠性最高,使用它的有 BOOTP 和 TFTP。4、Minimize-Cost 2 (0x02),要求找一條路徑能使費用最低,一般情況下使用這個選項的是一些視頻音頻流協議,如 RTSP(Real Time Stream Control Protocol)。5、Normal-Service 0 (0x00),一般服務,沒有什麼特殊要求。這個值也是大部分包的缺省值。

6.12 TTL target

TTL 可以修改 IP 頭中 Time To Live 字段的值。它有很大的作用,我們可以把所
有外出包的 Time To Live 值都改爲一樣的,比如 64,這是 Linux 的默認值。有
些 ISP 不允許我們共享連接(他們可以通過 TTL 的值來區分是不是有多個機子使
用同一個連接),如果我們把 TTL 都改爲一樣的值,他們就不能再根據 TTL 來判
斷了。

選項 –ttl-set
舉例 iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
說明 設置 TTL 的值。這個值不要太大,也不要太小,大約 64 就很好。值太大會影響網絡,而且有點不道德,爲什麼這樣說呢?如果有些路由器的配置不太正確,包的 TTL 又非常大,那它們就會在這些路由器之間往返很多次,值越大,佔用的帶寬越多。這個 target 就可以被用來限制包能走多遠,一個比較恰當的距離是剛好能到達DNS 服務器。
選項 –ttl-dec
舉例 iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 1
說明 設定 TTL 要被減掉的值,比如–ttl-dec 3。假設一個進來的包的TTL 是 53,那麼當它離開我們這臺機子時,TTL 就變爲 49 了。爲什麼不是 50 呢?因爲經過我們這臺機子,TTL 本身就要減 1,還要被 TTL target 再減 3,當然總共就是減去 4 了。使用這個 target可以限制“使用我們的服務的用戶”離我們有多遠。比如,用戶總是使用比較近的 DNS,那我們就可以對我們的 DNS 服務器發出的包進行幾個–ttl-dec。(譯者注:意思是,我們只想讓距離 DNS 服務器近一些的用戶訪問我們的服務)當然,用–set-ttl 控制更方便些。
選項 –ttl-inc
舉例 iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1
說明 設定 TTL 要被增加的值,比如–ttl-inc 4。假設一個進來的包的TTL 是 53,那麼當它離開我們這臺機子時,TTL 應是多少呢?答案是 56,原因同–ttl-dec。使用這個選項可以使我們的防火牆更加隱蔽,而不被 trace-routes 發現,方法就是設置–ttl-inc 1。原因應該很簡單了,包每經過一個設備,TTL 就要自動減 1,但在我們的防火牆裏這個 1 又被補上了,也就是說,TTL 的值沒變,那麼trace-routes 就會認爲我們的防火牆是不存在的。Trace-routes讓人又愛又恨,愛它是因爲在連接出問題時,它可以給我們提供極有用的信息,告訴我們哪裏有毛病;恨它是由於它也可以被黑客或駭客用來收集目標機器的資料。

溫馨提示:
以上文章描述如有不清晰之處,歡迎在評論區評論,如有時間,會第一時間回覆,謝謝!

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