iptables配置詳解

iptables配置指令詳解

用iptables -ADC 來指定鏈的規則,-A添加 -D刪除 -C 修改
iptables - [RI] chain rule num rule-specification[option]
用iptables - RI 通過規則的順序指定

iptables -D chain rule num[option]
刪除指定規則
iptables -[LFZ] [chain][option]
用iptables -LFZ 鏈名 [選項]

iptables -[NX] chain
用 -NX 指定鏈

iptables -P chain target[options]
指定鏈的默認目標

iptables -E old-chain-name new-chain-name
-E 舊的鏈名 新的鏈名
用新的鏈名取代舊的鏈名
說明
Iptalbes 是用來設置、維護和檢查Linux內核的IP包過濾規則的。
可以定義不同的表,每個表都包含幾個內部的鏈,也能包含用戶定義的鏈。每個鏈都是一個規則列表,對對應的包進行匹配:每條規則指定應當如何處理與之相匹配的包。這被稱作'target'(目標),也可以跳向同一個表內的用戶定義的鏈。

TARGETS
防火牆的規則指定所檢查包的特徵,和目標。如果包不匹配,將送往該鏈中下一條規則檢查;如果匹配,那麼下一條規則由目標值確定.該目標值可以是用戶定義的鏈名,或是某個專用值,如ACCEPT[通過], DROP[刪除], QUEUE[排隊], 或者 RETURN[返回]。
ACCEPT 表示讓這個包通過。DROP表示將這個包丟棄。QUEUE表示把這個包傳遞到用戶空間。RETURN表示停止這條鏈的匹配,到前一個鏈的規則重新開始。如果到達了一個內建的鏈(的末端),或者遇到內建鏈的規則是RETURN,包的命運將由鏈準則指定的目標決定。

TABLES
當前有三個表(哪個表是當前表取決於內核配置選項和當前模塊)。
-t table
這個選項指定命令要操作的匹配包的表。如果內核被配置爲自動加載模塊,這時若模塊沒有加載,(系統)將嘗試(爲該表)加載適合的模塊。這些表如下:filter,這是默認的表,包含了內建的鏈INPUT(處理進入的包)、FORWORD(處理通過的包)和OUTPUT(處理本地生成的包)。nat,這個表被查詢時表示遇到了產生新的連接的包,由三個內建的鏈構成:PREROUTING (修改到來的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改準備出去的包)。mangle 這個表用來對指定的包進行修改。它有兩個內建規則:PREROUTING(修改路由之前進入的包)和OUTPUT(修改路由之前本地的包)。
OPTIONS
這些可被iptables識別的選項可以區分不同的種類。

COMMANDS
這些選項指定執行明確的動作:若指令行下沒有其他規定,該行只能指定一個選項.對於長格式的命令和選項名,所用字母長度只要保證iptables能從其他選項中區分出該指令就行了。
-A -append
在所選擇的鏈末添加一條或更多規則。當源(地址)或者/與 目的(地址)轉換爲多個地址時,這條規則會加到所有可能的地址(組合)後面。

-D -delete
從所選鏈中刪除一條或更多規則。這條命令可以有兩種方法:可以把被刪除規則指定爲鏈中的序號(第一條序號爲1),或者指定爲要匹配的規則。

-R -replace
從選中的鏈中取代一條規則。如果源(地址)或者/與 目的(地址)被轉換爲多地址,該命令會失敗。規則序號從1開始。

-I -insert
根據給出的規則序號向所選鏈中插入一條或更多規則。所以,如果規則序號爲1,規則會被插入鏈的頭部。這也是不指定規則序號時的默認方式。

-L -list
顯示所選鏈的所有規則。如果沒有選擇鏈,所有鏈將被顯示。也可以和z選項一起使用,這時鏈會被自動列出和歸零。精確輸出受其它所給參數影響。

-F -flush
清空所選鏈。這等於把所有規則一個個的刪除。

--Z -zero
把所有鏈的包及字節的計數器清空。它可以和 -L配合使用,在清空前察看計數器,請參見前文。

-N -new-chain
根據給出的名稱建立一個新的用戶定義鏈。這必須保證沒有同名的鏈存在。

-X -delete-chain
刪除指定的用戶自定義鏈。這個鏈必須沒有被引用,如果被引用,在刪除之前你必須刪除或者替換與之有關的規則。如果沒有給出參數,這條命令將試着刪除每個非內建的鏈。


-P -policy
設置鏈的目標規則。

-E -rename-chain
根據用戶給出的名字對指定鏈進行重命名,這僅僅是修飾,對整個表的結構沒有影響。TARGETS參數給出一個合法的目標。只有非用戶自定義鏈可以使用規則,而且內建鏈和用戶自定義鏈都不能是規則的目標。

-h Help.
幫助。給出當前命令語法非常簡短的說明。

PARAMETERS
參數
以下參數構成規則詳述,如用於add、delete、replace、append 和 check命令。

-p -protocal [!]protocol
規則或者包檢查(待檢查包)的協議。指定協議可以是tcp、udp、icmp中的一個或者全部,也可以是數值,代表這些協議中的某一個。當然也可以使用在/etc/protocols中定義的協議名。在協議名前加上"!"表示相反的規則。數字0相當於所有all。Protocol all會匹配所有協議,而且這是缺省時的選項。在和check命令結合時,all可以不被使用。
-s -source [!] address[/mask]
指定源地址,可以是主機名、網絡名和清楚的IP地址。mask說明可以是網絡掩碼或清楚的數字,在網絡掩碼的左邊指定網絡掩碼左邊"1"的個數,因此,mask值爲24等於255.255.255.0。在指定地址前加上"!"說明指定了相反的地址段。標誌 --src 是這個選項的簡寫。

-d --destination [!] address[/mask]
指定目標地址,要獲取詳細說明請參見 -s標誌的說明。標誌 --dst 是這個選項的簡寫。

-j --jump target
-j 目標跳轉
指定規則的目標;也就是說,如果包匹配應當做什麼。目標可以是用戶自定義鏈(不是這條規則所在的),某個會立即決定包的命運的專用內建目標,或者一個擴展(參見下面的EXTENSIONS)。如果規則的這個選項被忽略,那麼匹配的過程不會對包產生影響,不過規則的計數器會增加。

-i -in-interface [!] [name]
i -進入的(網絡)接口 [!][名稱]
這是包經由該接口接收的可選的入口名稱,包通過該接口接收(在鏈INPUT、FORWORD和PREROUTING中進入的包)。當在接口名前使用"!"說明後,指的是相反的名稱。如果接口名後面加上"+",則所有以此接口名開頭的接口都會被匹配。如果這個選項被忽略,會假設爲"+",那麼將匹配任意接口。

-o --out-interface [!][name]
-o --輸出接口[名稱]
這是包經由該接口送出的可選的出口名稱,包通過該口輸出(在鏈FORWARD、OUTPUT和POSTROUTING中送出的包)。當在接口名前使用"!"說明後,指的是相反的名稱。如果接口名後面加上"+",則所有以此接口名開頭的接口都會被匹配。如果這個選項被忽略,會假設爲"+",那麼將匹配所有任意接口。

[!] -f, --fragment
[!] -f --分片
這意味着在分片的包中,規則只詢問第二及以後的片。自那以後由於無法判斷這種把包的源端口或目標端口(或者是ICMP類型的),這類包將不能匹配任何指定對他們進行匹配的規則。如果"!"說明用在了"-f"標誌之前,表示相反的意思。

OTHER OPTIONS
其他選項
還可以指定下列附加選項:

-v --verbose
-v --詳細
詳細輸出。這個選項讓list命令顯示接口地址、規則選項(如果有)和TOS(Type of Service)掩碼。包和字節計數器也將被顯示,分別用K、M、G(前綴)表示1000、1,000,000和1,000,000,000倍(不過請參看-x標誌改變它),對於添加,插入,刪除和替換命令,這會使一個或多個規則的相關詳細信息被打印。

-n --numeric
-n --數字
數字輸出。IP地址和端口會以數字的形式打印。默認情況下,程序試顯示主機名、網絡名或者服務(只要可用)。

-x -exact
-x -精確
擴展數字。顯示包和字節計數器的精確值,代替用K,M,G表示的約數。這個選項僅能用於 -L 命令。

--line-numbers
當列表顯示規則時,在每個規則的前面加上行號,與該規則在鏈中的位置相對應。

MATCH EXTENSIONS
對應的擴展
iptables能夠使用一些與模塊匹配的擴展包。以下就是含於基本包內的擴展包,而且他們大多數都可以通過在前面加上!來表示相反的意思。

tcp
當 --protocol tcp 被指定,且其他匹配的擴展未被指定時,這些擴展被裝載。它提供以下選項:

--source-port [!] [port[:port]]
源端口或端口範圍指定。這可以是服務名或端口號。使用格式端口:端口也可以指定包含的(端口)範圍。如果首端口號被忽略,默認是"0",如果末端口號被忽略,默認是"65535",如果第二個端口號大於第一個,那麼它們會被交換。這個選項可以使用 --sport的別名。

--destionation-port [!] [port:[port]]
目標端口或端口範圍指定。這個選項可以使用 --dport別名來代替。

--tcp-flags [!] mask comp
匹配指定的TCP標記。第一個參數是我們要檢查的標記,一個用逗號分開的列表,第二個參數是用逗號分開的標記表,是必須被設置的。標記如下:SYN ACK FIN RST URG PSH ALL NONE。因此這條命令:iptables -A FORWARD -p tcp --tcp-flags SYN, ACK, FIN, RST SYN只匹配那些SYN標記被設置而ACK、FIN和RST標記沒有設置的包。

[!] --syn
只匹配那些設置了SYN位而清除了ACK和FIN位的TCP包。這些包用於TCP連接初始化時發出請求;例如,大量的這種包進入一個接口發生堵塞時會阻止進入的TCP連接,而出去的TCP連接不會受到影響。這等於 --tcp-flags SYN, RST, ACK SYN。如果"--syn"前面有"!"標記,表示相反的意思。

--tcp-option [!] number
匹配設置了TCP選項的。

udp
當protocol udp 被指定,且其他匹配的擴展未被指定時,這些擴展被裝載,它提供以下選項:

--source-port [!] [port:[port]]
源端口或端口範圍指定。詳見 TCP擴展的--source-port選項說明。

--destination-port [!] [port:[port]]
目標端口或端口範圍指定。詳見 TCP擴展的--destination-port選項說明。

icmp
當protocol icmp被指定,且其他匹配的擴展未被指定時,該擴展被裝載。它提供以下選項:
--icmp-type [!] typename
這個選項允許指定ICMP類型,可以是一個數值型的ICMP類型,或者是某個由命令iptables -p icmp -h所顯示的ICMP類型名。

mac
--mac-source [!] address
匹配物理地址。必須是XX:XX:XX:XX:XX這樣的格式。注意它只對來自以太設備並進入PREROUTING、FORWORD和INPUT鏈的包有效。

limit
這個模塊匹配標誌用一個標記桶過濾器一一定速度進行匹配,它和LOG目標結合使用來給出有限的登陸數.當達到這個極限值時,使用這個擴展包的規則將進行匹配.(除非使用了"!"標記)

--limit rate
最大平均匹配速率:可賦的值有'/second', '/minute', '/hour', or '/day'這樣的單位,默認是3/hour。

--limit-burst number
待匹配包初始個數的最大值:若前面指定的極限還沒達到這個數值,則概數字加1.默認值爲5

multiport
這個模塊匹配一組源端口或目標端口,最多可以指定15個端口。只能和-p tcp 或者 -p udp 連着使用。

--source-port [port[, port]]
如果源端口是其中一個給定端口則匹配

--destination-port [port[, port]]
如果目標端口是其中一個給定端口則匹配

--port [port[, port]]
若源端口和目的端口相等並與某個給定端口相等,則匹配。
mark
這個模塊和與netfilter過濾器標記字段匹配(就可以在下面設置爲使用MARK標記)。

--mark value [/mask]
匹配那些無符號標記值的包(如果指定mask,在比較之前會給掩碼加上邏輯的標記)。

owner
此模塊試爲本地生成包匹配包創建者的不同特徵。只能用於OUTPUT鏈,而且即使這樣一些包(如ICMP ping應答)還可能沒有所有者,因此永遠不會匹配。

--uid-owner userid
如果給出有效的user id,那麼匹配它的進程產生的包。

--gid-owner groupid
如果給出有效的group id,那麼匹配它的進程產生的包。

--sid-owner seessionid
根據給出的會話組匹配該進程產生的包。

state
此模塊,當與連接跟蹤結合使用時,允許訪問包的連接跟蹤狀態。

--state state
這裏state是一個逗號分割的匹配連接狀態列表。可能的狀態是:INVALID表示包是未知連接,ESTABLISHED表示是雙向傳送的連接,NEW表示包爲新的連接,否則是非雙向傳送的,而RELATED表示包由新連接開始,但是和一個已存在的連接在一起,如FTP數據傳送,或者一個ICMP錯誤。

unclean
此模塊沒有可選項,不過它試着匹配那些奇怪的、不常見的包。處在實驗中。

tos
此模塊匹配IP包首部的8位tos(服務類型)字段(也就是說,包含在優先位中)。

--tos tos
這個參數可以是一個標準名稱,(用iptables -m tos -h 察看該列表),或者數值。

TARGET EXTENSIONS
iptables可以使用擴展目標模塊:以下都包含在標準版中。

LOG
爲匹配的包開啓內核記錄。當在規則中設置了這一選項後,linux內核會通過printk()打印一些關於全部匹配包的信息(諸如IP包頭字段等)。
--log-level level
記錄級別(數字或參看 syslog.conf(5))。
--log-prefix prefix
在紀錄信息前加上特定的前綴:最多14個字母長,用來和記錄中其他信息區別。

--log-tcp-sequence
記錄TCP序列號。如果記錄能被用戶讀取那麼這將存在安全隱患。

--log-tcp-options
記錄來自TCP包頭部的選項。
--log-ip-options
記錄來自IP包頭部的選項。

MARK
用來設置包的netfilter標記值。只適用於mangle表。

--set-mark mark

REJECT
作爲對匹配的包的響應,返回一個錯誤的包:其他情況下和DROP相同。

此目標只適用於INPUT、FORWARD和OUTPUT鏈,和調用這些鏈的用戶自定義鏈。這幾個選項控制返回的錯誤包的特性:

--reject-with type
Type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-nreachable、icmp-proto-unreachable、 icmp-net-prohibited 或者 icmp-host-prohibited,該類型會返回相應的ICMP錯誤信息(默認是port-unreachable)。選項 echo-reply也是允許的;它只能用於指定ICMP ping包的規則中,生成ping的迴應。最後,選項tcp-reset可以用於在INPUT鏈中,或自INPUT鏈調用的規則,只匹配TCP協議:將回應一個TCP RST包。
TOS
用來設置IP包的首部八位tos。只能用於mangle表。

--set-tos tos
你可以使用一個數值型的TOS 值,或者用iptables -j TOS -h 來查看有效TOS名列表。
MIRROR
這是一個試驗示範目標,可用於轉換IP首部字段中的源地址和目標地址,再傳送該包,並只適用於INPUT、FORWARD和OUTPUT鏈,以及只調用它們的用戶自定義鏈。

SNAT
這個目標只適用於nat表的POSTROUTING鏈。它規定修改包的源地址(此連接以後所有的包都會被影響),停止對規則的檢查,它包含選項:

--to-source <ipaddr>[-<ipaddr>][:port-port]
可以指定一個單一的新的IP地址,一個IP地址範圍,也可以附加一個端口範圍(只能在指定-p tcp 或者-p udp的規則裏)。如果未指定端口範圍,源端口中512以下的(端口)會被安置爲其他的512以下的端口;512到1024之間的端口會被安置爲1024以下的,其他端口會被安置爲1024或以上。如果可能,端口不會被修改。

--to-destiontion <ipaddr>[-<ipaddr>][:port-port]
可以指定一個單一的新的IP地址,一個IP地址範圍,也可以附加一個端口範圍(只能在指定-p tcp 或者-p udp的規則裏)。如果未指定端口範圍,目標端口不會被修改。

MASQUERADE
只用於nat表的POSTROUTING鏈。只能用於動態獲取IP(撥號)連接:如果你擁有靜態IP地址,你要用SNAT。僞裝相當於給包發出時所經過接口的IP地址設置一個映像,當接口關閉連接會終止。這是因爲當下一次撥號時未必是相同的接口地址(以後所有建立的連接都將關閉)。它有一個選項:

--to-ports <port>[-port>]
指定使用的源端口範圍,覆蓋默認的SNAT源地址選擇(見上面)。這個選項只適用於指定了-p tcp或者-p udp的規則。

REDIRECT
只適用於nat表的PREROUTING和OUTPUT鏈,和只調用它們的用戶自定義鏈。它修改包的目標IP地址來發送包到機器自身(本地生成的包被安置爲地址127.0.0.1)。它包含一個選項:

--to-ports <port>[<port>]
指定使用的目的端口或端口範圍:不指定的話,目標端口不會被修改。只能用於指定了-p tcp 或 -p udp的規則。

DIAGNOSTICS
診斷
不同的錯誤信息會打印成標準錯誤:退出代碼0表示正確。類似於不對的或者濫用的命令行參數錯誤會返回錯誤代碼2,其他錯誤返回代碼爲1。

BUGS
臭蟲
Check is not implemented (yet).
檢查還未完成。

COMPATIBILITY WITH IPCHAINS
與ipchains的兼容性
iptables和Rusty Russell的ipchains非常相似。主要區別是INPUT 鏈只用於進入本地主機的包,而OUTPUT只用於自本地主機生成的包。因此每個包只經過三個鏈的一個;以前轉發的包會經過所有三個鏈。其他主要區別是 -i 引用進入接口;-o引用輸出接口,兩者都適用於進入FORWARD鏈的包。當和可選擴展模塊一起使用默認過濾器表時,iptables是一個純粹的包過濾器。這能大大減少以前對IP僞裝和包過濾結合使用的混淆,所以以下選項作了不同的處理:
-j MASQ
-M -S
-M -L
在iptables中有幾個不同的鏈。

---------------------------
iptables 是建立在 netfilter 架構基礎上的一個包過濾管理工具,最主要的作用是用來做防火牆或透明代理。Iptables 從 ipchains 發展而來,它的功能更爲強大。Iptables 提供以下三種功能:包過濾、NAT(網絡地址轉換)和通用的 pre-route packet mangling。包過濾:用來過濾包,但是不修改包的內容。Iptables 在包過濾方面相對於 ipchians 的主要優點是速度更快,使用更方便。NAT:NAT 可以分爲源地址 NAT 和目的地址 NAT。

Iptables 可以追加、插入或刪除包過濾規則。實際上真正執行這些過慮規則的是 netfilter 及其相關模塊(如 iptables 模塊和 nat 模塊)。Netfilter 是 Linux 核心中一個通用架構,它提供了一系列的 “表”(tables),每個表由若干 “鏈”(chains)組成,而每條鏈中可以有一條或數條 “規則”(rule)組成。

系統缺省的表爲 “filter”,該表中包含了 INPUT、FORWARD 和 OUTPUT 3 個鏈。

每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的:如果數據包頭符合這樣的條件,就這樣處理這個數據包。當一個數據包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件: 如果滿足,系統將根據該條規則所定義的方法處理該數據包;如果不滿足則繼續檢查下一條規則。最後,如果該數據包不符合該鏈中任一條規則的話,系統就會根據該鏈預先定義的策略來處理該數據包。

? table,chain,rule

iptables 可以操縱3 個表:filter 表,nat 表,mangle 表。

NAT 和一般的 mangle 用 -t 參數指定要操作哪個表。filter 是默認的表,如果沒有 -t 參數,就默認對 filter 表操作。

Rule 規則:過濾規則,端口轉發規則等,例如:禁止任何機器 ping 我們的服務器,可以在服務器上設置一條規則:

iptables -A INPUT -s ! 127.0.0.1 -p icmp -j DROP

從 –s 開始即是一條規則,-j 前面是規則的條件,-j 開始是規則的行爲(目的)。整條命令解釋爲,在filter 表中的 INPUT 規則鏈中插入一條規則,所有源地址不爲 127.0.0.1 的 icmp 包都被拋棄。

Chain 規則鏈:由一系列規則組成,每個包順序經過 chain 中的每一條規則。chain 又分爲系統 chain和用戶創建的 chain。下面先敘述系統 chain。

filter 表的系統 chain: INPUT,FORWAD,OUTPUT

nat 表的系統 chain: PREROUTING,POSTROUTING,OUTPUT

mangle 表的系統 chain: PREROUTING,OUTPUT

每條系統 chain 在確定的位置被檢查。比如在包過濾中,所有的目的地址爲本地的包,則會進入INPUT 規則鏈,而從本地出去的包會進入 OUTPUT 規則鏈。

所有的 table 和 chain 開機時都爲空,設置 iptables 的方法就是在合適的 table 和系統 chain 中添相應的規則。

--------------------------------------------------------------

IPTABLES 語法:

表: iptables從其使用的三個表(filter、nat、mangle)而得名, 對包過濾只使用 filter 表, filter還是默認表,無需顯示說明.

操作命令: 即添加、刪除、更新等。

鏈:對於包過濾可以針對filter表中的INPUT、OUTPUT、FORWARD鏈,也可以操作用戶自定義的鏈。

規則匹配器:可以指定各種規則匹配,如IP地址、端口、包類型等。

目標動作:當規則匹配一個包時,真正要執行的任務,常用的有:

ACCEPT 允許包通過

DROP 丟棄包

一些擴展的目標還有:

REJECT 拒絕包,丟棄包同時給發送者發送沒有接受的通知

LOG 包有關信息記錄到日誌

TOS 改寫包的TOS值



爲使FORWARD規則能夠生效,可使用下面2種方法的某種:

[root@rhlinux root]# vi /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# echo "1" > /proc/sys/net/ipv4/ip_forward

[root@rhlinux root]# vi /etc/sysconfig/network
[root@rhlinux root]# echo "FORWARD_IPV4=true" > /etc/sysconfig/network

--------------------------------------------------------

iptables語法可以簡化爲下面的形式:

iptables [-t table] CMD [chain] [rule-matcher] [-j target]

--------------------------------------------------------

常用操作命令:

-A 或 -append 在所選鏈尾加入一條或多條規則

-D 或 -delete 在所選鏈尾部刪除一條或者多條規則

-R 或 -replace 在所選鏈中替換一條匹配規則

-I 或 -insert 以給出的規則號在所選鏈中插入一條或者多條規則. 如果規則號爲1,即在鏈頭部.

-L 或 -list 列出指定鏈中的所有規則,如果沒有指定鏈,將列出鏈中的所有規則.

-F 或 -flush 清除指定鏈和表中的所由規則, 假如不指定鏈,那麼所有鏈都將被清空.

-N 或 -new-chain 以指定名創建一條新的用戶自定義鏈,不能與已有鏈名相同.

-X 或 -delete-chain 刪除指定的用戶定義簾,必需保證鏈中的規則都不在使用時才能刪除,若沒有指定鏈,則刪除所有用戶鏈.

-P 或 -policy 爲永久簾指定默認規則(內置鏈策略),用戶定義簾沒有缺省規則,缺省規則也使規則鏈中的最後一條規則,用-L顯示時它在第一行顯示.

-C 或 -check 檢查給定的包是否與指定鏈的規則相匹配.

-Z 或 -zero 將指定簾中所由的規則包字節(BYTE)計數器清零.

-h 顯示幫助信息.

-------------------------------------------------------------

常用匹配規則器:

-p , [!] protocol 指出要匹配的協議,可以是tcp, udp, icmp, all, 前綴!爲邏輯非,表示除該協議外的所有協議.

-s [!] address[/mask] 指定源地址或者地址範圍.

-sport [!] port[:port] 指定源端口號或範圍,可以用端口號也可以用/ETC/SERVICES文件中的名子.

-d [!] address[/mask] 指定目的地址或者地址範圍.

-dport [!] port[:port] 指定目的端口號或範圍,可以用端口號也可以用/ETC/SERVICES文件中的名子.

-icmp-type [!] typename 指定匹配規則的ICMP信息類型(可以使用 iptables -p icmp -h 查看有效的ICMP類型名)

-i [!] interface name[+] 匹配單獨或某種類型的接口,此參數忽略時,默認符合所有接口,接口可以使用"!"來匹配捕食指定接口來的包.參數interface是接口名,如 eth0, eht1, ppp0等,指定一個目前不存在的接口是完全合法的,規則直到接口工作時才起作用,折中指定對於PPP等類似連接是非常有用的."+"表示匹配所有此類型接口.該選項只針對於INPUT,FORWARD和PREROUTING鏈是合法的.

-o [!] interface name[+] 匹配規則的對外網絡接口,該選項只針對於OUTPUT,FORWARD,POSTROUTING鏈是合法的.

[!] --syn 僅僅匹配設置了SYN位, 清除了ACK, FIN位的TCP包. 這些包表示請求初始化的TCP連接.阻止從接口來的這樣的包將會阻止外來的TCP連接請求.但輸出的TCP連接請求將不受影響.這個參數僅僅當協議類型設置爲了TCP才能使用. 此參數可以使用"!"標誌匹配已存在的返回包,一般用於限制網絡流量,即只允許已有的,向外發送的連接所返回的包.

----------------------------------------------------------

如何制定永久規則集:

/etc/sysconfig/iptables 文件是 iptables 守護進程調用的默認規則集文件.

可以使用以下命令保存執行過的IPTABLES命令:

/sbin/iptables-save > /etc/sysconfig/iptables

要恢復原來的規則庫,可以使用:

/sbin/iptables-restore < /etc/sysconfig/iptables

iptables命令和route等命令一樣,重啓之後就會恢復,所以:

[root@rhlinux root]# service iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]

令一種方法是 /etc/rc.d/init.d/iptables 是IPTABLES的啓動腳本,所以:

[root@rhlinux root]# /etc/rc.d/init.d/iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]

以上幾種方法只使用某種即可.



若要自定義腳本,可直接使用iptables命令編寫一個規則腳本,並在啓動時執行:

例如若規則使用腳本文件名/etc/fw/rule, 則可以在/etc/rc.d/rc.local中加入以下代碼:

if [-x /etc/fw/rule]; then /etc/fw/sule; fi;

這樣每次啓動都執行該規則腳本,如果用這種方法,建議NTSYSV中停止IPTABLES.

----------------------------------------------------------

實例:

鏈基本操作:

[root@rh34 root]# iptables -L -n
(列出表/鏈中的所有規則,包過濾防火牆默認使用的是filter表,因此使用此命令將列出filter表中所有內容,-n參數可加快顯示速度,也可不加-n參數。)

[root@rh34 root]# iptables -F
(清除預設表filter中所有規則鏈中的規則)

[root@rh34 root]# iptables -X
(清除預設表filter中使用者自定義鏈中的規則)

[root@rh34 root]# iptables -Z
(將指定鏈規則中的所有包字節計數器清零)

------------------------------------------------------------

設置鏈的默認策略,默認允許所有,或者丟棄所有:

[root@rh34 root]# iptables -P INPUT ACCEPT
[root@rh34 root]# iptables -P OUTPUT ACCEPT
[root@rh34 root]# iptables -P FORWARD ACCEPT
(以上我們在不同方向設置默認允許策略,若丟棄則應是DROP,嚴格意義上防火牆應該是DROP然後再允許特定)

---------------------------------------------------------------

向鏈中添加規則,下面的例子是開放指定網絡接口(信任接口時比較實用):

[root@rh34 root]# iptables -A INPUT -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A OUTPUT -o eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -o eth1 -j ACCEPT

--------------------------------------------------------------

使用用戶自定義鏈:

[root@rh34 root]# iptables -N brus
(創建一個用戶自定義名叫brus的鏈)

[root@rh34 root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此鏈中設置了一條規則)

[root@rh34 root]# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向默認的INPUT鏈添加一條規則,使所有包都由brus自定義鏈處理)

----------------------------------------------------------------

基本匹配規則實例:


匹配協議:

iptables -A INPUT -p tcp
(指定匹配協議爲TCP)

iptables -A INPUT -p ! tcp
(指定匹配TCP以外的協議)


匹配地址:

iptables -A INPUT -s 192.168.1.1
(匹配主機)

iptables -A INPUT -s 192.168.1.0/24
(匹配網絡)

iptables -A FORWARD -s ! 192.168.1.1
(匹配以外的主機)

iptables -A FORWARD -s ! 192.168.1.0/24
(匹配以外的網絡)


匹配接口:

iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(匹配某個指定的接口)

iptables -A FORWARD -o ppp+
(匹配所有類型爲ppp的接口)


匹配端口:

iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(匹配單一指定源端口)

iptables -A INPUT -p ucp --dport 53
(匹配單一指定目的端口)

iptables -A INPUT -p ucp --dport ! 53
(指定端口以外)

iptables -A INPUT -p tcp --dport 22:80
(指定端口範圍,這裏我們實現的是22到80端口)

---------------------------------------------------------------------------------

指定IP碎片的處理:

[root@rh34 root]# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT

[root@rh34 root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

----------------------------------------------------------------------------------

設置擴展的規測匹配:

(希望獲得匹配的簡要說明,可使用: iptables -m name_of_match --help)


多端口匹配擴展:

iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(匹配多個源端口)

iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(匹配多個目的端口)

iptables -A INPUT -p tcp -m multiport --port 22,53,80
(匹配多個端口,無論是源還是目的端口)

-----------------------------------------------------------------------------

TCP匹配擴展:

iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的標誌都要被檢查,但是隻有設置了SYN的才匹配)

iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的標誌都被檢查,但是隻有設置了SYN和ACK的才匹配)

iptables -p tcp --syn
(選項--syn是以上的一種特殊情況,相當於“--tcp-flags SYN,RST,ACK SYN”的簡寫)

--------------------------------------------------------------------------------

limit速率匹配擴展:

[root@redhatlinux9 root]# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小時允許通過300個數據包)

[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定觸發時間的值(默認爲5),用來比對瞬間大量數據包的數量。)
(上面的例子用來比對一次同時涌入的數據包是否超過十個,超過此上限的包將直接被丟棄)

[root@redhatlinux9 root]# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假設均勻通過,平均每分鐘3個,那麼觸發值burst保持爲3。如果每分鐘通過的包的數目小於3,那麼觸發值busrt將在每個週期(若每分鐘允許通過3個,則週期數爲20秒)後加1,但最大值爲3。每分鐘要通過的包數量如果超過3,那麼觸發值busrt將減掉超出的數值,例如第二分鐘有4個包,那麼觸發值變爲2,同時4個包都可以通過,第三分鐘有6個包,則只能通過5個,觸發值busrt變爲0。之後,每分鐘如果包數量小於等於3個,則觸發值busrt將加1,如果每分鐘包數大於3,觸發值busrt將逐漸減少,最終維持爲0)
(即每分鐘允許的最大包數量等於限制速率(本例中爲3)加上當前的觸發值busrt數。任何情況下,都可以保證3個包通過,觸發值busrt相當於是允許額外的包數量)

---------------------------------------------------------------------------------

基於狀態的匹配擴展(連接跟蹤):

每個網絡連接包括以下信息:源和目的地址、源和目的端口號,稱爲套接字對(cocket pairs);協議類型、連接狀態(TCP協議)和超時時間等。防火牆把這些叫做狀態(stateful)。能夠監測每個連接狀態的防火牆叫做狀態寶過濾防火牆,除了能完成普通包過濾防火牆的功能外,還在自己的內存中維護一個跟蹤連接狀態的表,所以擁有更大的安全性。

其命令格式如下:

iptables -m state --state [!] state [,state,state,state]

state表示一個用逗號隔開的的列表,用來指定的連接狀態可以有以下4種:

NEW:該包想要開始一個連接(重新連接或將連接重定向)。

RELATED:該包屬於某個已經建立的連接所建立的新連接。例如FTP的數據傳輸連接和控制連接之間就是RELATED關係。

ESTABLISHED:該包屬於某個已經建立的連接。

INVALID:該包不匹配於任何連接,通常這些包會被DROP。


例如:

[root@redhatlinux9 root]# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(匹配已經建立的連接或由已經建立的連接所建立的新連接。即匹配所有的TCP迴應包)

[root@redhatlinux9 root]# iptables -A INPUT -m state --state NEW -i ! eth0
(匹配所有從非eth0接口來的連接請求包)


下面是一個被動(Passive)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
[root@redhatlinux9 root]# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT

下面是一個主動(Active)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT

--------------------------------------------------------------------------------------

日誌記錄:

格式爲: -j LOG --log-level 7 --log-prefix "......"

[root@redhatlinux9 root]# iptables -A FORWARD -m tcp -p tcp -j LOG

[root@redhatlinux9 root]# iptables -A FORWARD -m icmp -p icmp -f -j LOG

[root@redhatlinux9 root]# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG

[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"

[root@redhatlinux9 root]# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"

--------------------------------------------------------------------------------------
如果你的IPTABLES基礎知識還不瞭解,建議先去看看。

我們來配置一個filter表的防火牆

1、查看本機關於IPTABLES的設置情況

[root@tp ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

Chain RH-Firewall-1-INPUT (0 references)

target prot opt source destination

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255

ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0

ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0

ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353

ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631

ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22

ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80

ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25

REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

可以看出我在安裝linux時,選擇了有防火牆,並且開放了22,80,25端口.

如果你在安裝linux時沒有選擇啓動防火牆,是這樣的

[root@tp ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

什麼規則都沒有.

2、清除原有規則.

不管你在安裝linux時是否啓動了防火牆,如果你想配置屬於自己的防火牆,那就清除現在filter的所有規則.

[root@tp ~]# iptables -F 清除預設表filter中的所有規則鏈的規則

[root@tp ~]# iptables -X 清除預設表filter中使用者自定鏈中的規則

我們在來看一下

[root@tp ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

什麼都沒有了吧,和我們在安裝linux時沒有啓動防火牆是一樣的.(提前說一句,這些配置就像用命令配置IP一樣,重起就會失去作用),怎麼保存.

[root@tp ~]# /etc/rc.d/init.d/iptables save


這樣就可以寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起作用.

[root@tp ~]# service iptables restart


現在IPTABLES配置表裏什麼配置都沒有了,那我們開始我們的配置吧。


3、設定預設規則

[root@tp ~]# iptables -p INPUT DROP

[root@tp ~]# iptables -p OUTPUT ACCEPT

[root@tp ~]# iptables -p FORWARD DROP

上面的意思是,當超出了IPTABLES裏filter表裏的兩個鏈規則(INPUT,FORWARD)時,不在這兩個規則裏的數據包怎麼處理呢,那就是DROP(放棄).應該說這樣配置是很安全的.我們要控制流入數據包

而對於OUTPUT鏈,也就是流出的包我們不用做太多限制,而是採取ACCEPT,也就是說,不在着個規則裏的包怎麼辦呢,那就是通過.

可以看出INPUT,FORWARD兩個鏈採用的是允許什麼包通過,而OUTPUT鏈採用的是不允許什麼包通過.

這樣設置還是挺合理的,當然你也可以三個鏈都DROP,但這樣做我認爲是沒有必要的,而且要寫的規則就會增加.但如果你只想要有限的幾個規則是,如只做WEB服務器.還是推薦三個鏈都是DROP.

注:如果你是遠程SSH登陸的話,當你輸入第一個命令回車的時候就應該掉了.因爲你沒有設置任何規則.

怎麼辦,去本機操作唄!

4、添加規則.

首先添加INPUT鏈,INPUT鏈的默認規則是DROP,所以我們就寫需要ACCETP(通過)的鏈

爲了能採用遠程SSH登陸,我們要開啓22端口.

[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:這個規則,如果你把OUTPUT 設置成DROP的就要寫上這一部,好多人都是望了寫這一部規則導致,始終無法SSH.在遠程一下,是不是好了.

其他的端口也一樣,如果開啓了web服務器,OUTPUT設置成DROP的話,同樣也要添加一條鏈:

[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)

如果做了WEB服務器,開啓80端口.

[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

如果做了郵件服務器,開啓25,110端口.

[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT

[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT

如果做了FTP服務器,開啓21端口

[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT

[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT

如果做了DNS服務器,開啓53端口

[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT

如果你還做了其他的服務器,需要開啓哪個端口,照寫就行了.

上面主要寫的都是INPUT鏈,凡是不在上面的規則裏的,都DROP

允許icmp包通過,也就是允許ping,

[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT設置成DROP的話)

[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT設置成DROP的話)


允許loopback!(不然會導致DNS無法正常關閉等問題)

IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)

IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)


下面寫OUTPUT鏈,OUTPUT鏈默認規則是ACCEPT,所以我們就寫需要DROP(放棄)的鏈.

減少不安全的端口連接

[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP

[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP

有些些特洛伊木馬會掃描端口31337到31340(即黑客語言中的 elite 端口)上的服務。既然合法服務都不使用這些非標準端口來通信,阻塞這些端口能夠有效地減少你的網絡上可能被感染的機器和它們的遠程主服務器進行獨立通信的機會

還有其他端口也一樣,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也應被禁止,我在這寫的也不全,有興趣的朋友應該去查一下相關資料.


當然出入更安全的考慮你也可以包OUTPUT鏈設置成DROP,那你添加的規則就多一些,就像上邊添加

允許SSH登陸一樣.照着寫就行了.


下面寫一下更加細緻的規則,就是限制到某臺機器

如:我們只允許192.168.0.3的機器進行SSH連接

[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT

如果要允許,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.

24表示子網掩碼數.但要記得把 /etc/sysconfig/iptables 裏的這一行刪了.

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因爲它表示所有地址都可以登陸.

或採用命令方式:

[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT

然後保存,我再說一邊,反是採用命令的方式,只在當時生效,如果想要重起後也起作用,那就要保存.寫入到/etc/sysconfig/iptables文件裏.

[root@tp ~]# /etc/rc.d/init.d/iptables save

這樣寫 !192.168.0.3 表示除了192.168.0.3的ip地址

其他的規則連接也一樣這麼設置.


在下面就是FORWARD鏈,FORWARD鏈的默認規則是DROP,所以我們就寫需要ACCETP(通過)的鏈,對正在轉發鏈的監控.

開啓轉發功能,(在做NAT時,FORWARD默認規則是DROP時,必須做)

[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丟棄壞的TCP包

[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

處理IP碎片數量,防止攻擊,允許每秒100個

[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

設置ICMP包過濾,允許每秒1個包,限制觸發條件是10個包.

[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

我在前面只所以允許ICMP包通過,就是因爲我在這裏有限制。

配置一個NAT表放火牆

1、查看本機關於NAT的設置情況

[root@tp rc.d]# iptables -t nat -L

Chain PREROUTING (policy ACCEPT)

target prot opt source destination

Chain POSTROUTING (policy ACCEPT)

target prot opt source destination

SNAT all -- 192.168.0.0/24 anywhere to:211.101.46.235

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

我的NAT已經配置好了的(只是提供最簡單的代理上網功能,還沒有添加防火牆規則).關於怎麼配置NAT,參考我的另一篇文章

當然你如果還沒有配置NAT的話,你也不用清除規則,因爲NAT在默認情況下是什麼都沒有的

如果你想清除,命令是

[root@tp ~]# iptables -F -t nat

[root@tp ~]# iptables -X -t nat

[root@tp ~]# iptables -Z -t nat


2、添加規則


添加基本的NAT地址轉換,(關於如何配置NAT可以看我的另一篇文章),

添加規則,我們只添加DROP鏈.因爲默認鏈全是ACCEPT.

防止外網用內網IP欺騙

[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP

[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP

[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP


如果我們想,比如阻止MSN,QQ,BT等的話,需要找到它們所用的端口或者IP,(個人認爲沒有太大必要)

例:

禁止與211.101.46.253的所有連接

[root@tp ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP

禁用FTP(21)端口

[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP

這樣寫範圍太大了,我們可以更精確的定義.

[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 211.101.46.253 -j DROP

這樣只禁用211.101.46.253地址的FTP連接,其他連接還可以.如web(80端口)連接.

按照我寫的,你只要找到QQ,MSN等其他軟件的IP地址,和端口,以及基於什麼協議,只要照着寫就行了.


最後:

drop非法連接

[root@tp ~]# iptables -A INPUT -m state --state INVALID -j DROP

[root@tp ~]# iptables -A OUTPUT -m state --state INVALID -j DROP

[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP

允許所有已經建立的和相關的連接

[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


[root@tp ~]# /etc/rc.d/init.d/iptables save


這樣就可以寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起作用.


[root@tp ~]# service iptables restart


別忘了保存,不行就寫一部保存一次。你可以一邊保存,一邊做實驗,看看是否達到你的要求,

----------------------------------------------

tcp_wrapper的原理

Telnet、SSH、FTP、POP和SMTP等很多網絡服務都會用到TCP Wrapper,它被設計爲一個介於外來服務請求和系統服務迴應的中間處理軟件。

基本處理過程

當系統接收到一個外來服務請求的時候 ,先由TCP Wrapper處理這個請求

TCP Wrapper根據這個請求所請求的服務和針對這個服務所定製的存取控制規則來判斷對方是否有使用這個服務的權限,如果有,TCP Wrapper 將該請求按照配置文件定義的規則轉交給相應的守護進程去處理同時記錄這個請求動作,然後自己就等待下一個請求的處理。

如果外部還有防火牆,當然要先通過防火牆

tcp_wrapper是基於主機與服務的

使用簡單的配置文件來設置訪問限制 /etc/hosts.allow /etc/hosts.deny

配置一旦被改變,立刻生效

tcp_wrapper的配置

訪問控制判斷順序: 訪問是否被明確許可 否則,訪問是否被明確禁止 如果都沒有,默認許可

通常tcp_wrapper沒有配置,就是第三條,如果都沒有,默認許可的

配置文件 許可用:/etc/hosts.allow 禁止用:/etc/hosts.deny

基本語法 後臺進程列表:客戶端列表      [:參數(allow,deny)]

/etc/hosts.allow
vsftpd:192.168.0.
/etc/hosts.deny
vsftpd:ALL

格式是 後臺進程:  client描述

這裏的後臺進程需要解釋下

後臺進程列表應該是: 服務的可執行工具名( in.telnetd  NO telnetd) 允許指定多項服務 允許使用ALL來匹配所有服務 允許可執行工具名後添加IP或主機名,如果本機有多個網絡界面

客戶端描述可以包含:
IP 地址(192.168.0.254 )  域名或主機名(.example.com, www.wenhua.org  )  子網掩碼(192.168.0.0/255.255.255.0 或192.168.0. )  網絡名(@mydomain )

client描述的高級語法

客戶端描述通配符
ALL:所有
LOCAL:所有主機名中不包含.的主機
UNKNOWN:無法被解析的主機
KNOWN:可以雙向解析的主機
PARANOID:正向解析成功但無法反向解析的主機

EXCEPT 可用於服務列表與客戶端列表, 可以層層套用

/etc/hosts.deny 
ALL:ALL EXCEPT 192.168.0.0/255.255.255.0 EXCEPT server1.example.com

現在我們測試下:

現在可以訪問 vim /etc/hosts.deny

現在他要求我輸入ID驗證,但是我的匿名可以訪問的,我正確輸入ID以後,還是不可以訪問

在允許裏面明確允許
vim /etc/hosts.allow


又可以訪問了


tcp_wrapper很簡單,要服務的模塊支持tcp_wrapper ,纔可以使用tcp_wrapper
大家看吧,vsftpd的配置文件最後,明確配置tcp_wrappers=yes
vim /etc/vsftpd/vsftpd.conf
查看一個服務是否支持tcp_wrapper可以用一下命令
看某個服務的執行文件是否調用tcp——wrapper
ldd `which vsftpd` | grep wrap

如果這個命令有結果,也表明支持tcp_wrapper
strings `which vsftpd` | grep host

基於xinetd的服務都支持tcp_wrapper

如下sendmail就支持tcp_wrapper而postfix就不支持哈~
發佈了67 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章