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種方法的某種:
[[email protected] root]# vi /proc/sys/net/ipv4/ip_forward
[[email protected] root]# echo "1" > /proc/sys/net/ipv4/ip_forward
[[email protected] root]# vi /etc/sysconfig/network
[[email protected] 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等指令一樣,重新開機之後就會恢複,是以:
[[email protected] root]# service iptables save
将目前規則儲存到 /etc/sysconfig/iptables: [ 确定 ]
令一種方法是 /etc/rc.d/init.d/iptables 是IPTABLES的啟動腳本,是以:
[[email protected] 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.
----------------------------------------------------------
執行個體:
鍊基本操作:
[[email protected] root]# iptables -L -n
(列出表/鍊中的所有規則,包過濾防火牆預設使用的是filter表,是以使用此指令将列出filter表中所有内容,-n參數可加快顯示速度,也可不加-n參數。)
[[email protected] root]# iptables -F
(清除預設表filter中所有規則鍊中的規則)
[[email protected] root]# iptables -X
(清除預設表filter中使用者自定義鍊中的規則)
[[email protected] root]# iptables -Z
(将指定鍊規則中的所有包位元組計數器清零)
------------------------------------------------------------
設定鍊的預設政策,預設允許所有,或者丢棄所有:
[[email protected] root]# iptables -P INPUT ACCEPT
[[email protected] root]# iptables -P OUTPUT ACCEPT
[[email protected] root]# iptables -P FORWARD ACCEPT
(以上我們在不同方向設定預設允許政策,若丢棄則應是DROP,嚴格意義上防火牆應該是DROP然後再允許特定)
---------------------------------------------------------------
向鍊中添加規則,下面的例子是開放指定網絡接口(信任接口時比較實用):
[[email protected] root]# iptables -A INPUT -i eth1 -j ACCEPT
[[email protected] root]# iptables -A OUTPUT -o eth1 -j ACCEPT
[[email protected] root]# iptables -A FORWARD -i eth1 -j ACCEPT
[[email protected] root]# iptables -A FORWARD -o eth1 -j ACCEPT
--------------------------------------------------------------
使用使用者自定義鍊:
[[email protected] root]# iptables -N brus
(建立一個使用者自定義名叫brus的鍊)
[[email protected] root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此鍊中設定了一條規則)
[[email protected] 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碎片的處理:
[[email protected] root]# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[[email protected] root]# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[[email protected] 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速率比對擴充:
[[email protected] root]# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小時允許通過300個資料包)
[[email protected] root]# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定觸發時間的值(預設為5),用來比對瞬間大量資料包的數量。)
(上面的例子用來比對一次同時湧入的資料包是否超過十個,超過此上限的包将直接被丢棄)
[[email protected] 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。
例如:
[[email protected] root]# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(比對已經建立的連接配接或由已經建立的連接配接所建立的新連接配接。即比對所有的TCP回應包)
[[email protected] root]# iptables -A INPUT -m state --state NEW -i ! eth0
(比對所有從非eth0接口來的連接配接請求包)
下面是一個被動(Passive)FTP連接配接模式的典型連接配接跟蹤
[[email protected] root]# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
[[email protected] root]# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一個主動(Active)FTP連接配接模式的典型連接配接跟蹤
[[email protected] root]# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
[[email protected] root]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
--------------------------------------------------------------------------------------
日志記錄:
格式為: -j LOG --log-level 7 --log-prefix "......"
[[email protected] root]# iptables -A FORWARD -m tcp -p tcp -j LOG
[[email protected] root]# iptables -A FORWARD -m icmp -p icmp -f -j LOG
[[email protected] root]# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
[[email protected] root]# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
[[email protected] root]# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"
--------------------------------------------------------------------------------------
如果你的IPTABLES基礎知識還不了解,建議先去看看。
我們來配置一個filter表的防火牆
1、檢視本機關于IPTABLES的設定情況
[[email protected] ~]# 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時沒有選擇啟動防火牆,是這樣的
[[email protected] ~]# 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的所有規則.
[[email protected] ~]# iptables -F 清除預設表filter中的所有規則鍊的規則
[[email protected] ~]# iptables -X 清除預設表filter中使用者自定鍊中的規則
我們在來看一下
[[email protected] ~]# 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一樣,重起就會失去作用),怎麼儲存.
[[email protected] ~]# /etc/rc.d/init.d/iptables save
這樣就可以寫到/etc/sysconfig/iptables檔案裡了.寫入後記得把防火牆重起一下,才能起作用.
[[email protected] ~]# service iptables restart
現在IPTABLES配置表裡什麼配置都沒有了,那我們開始我們的配置吧。
3、設定預設規則
[[email protected] ~]# iptables -p INPUT DROP
[[email protected] ~]# iptables -p OUTPUT ACCEPT
[[email protected] ~]# 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端口.
[[email protected] ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[[email protected] ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT (注:這個規則,如果你把OUTPUT 設定成DROP的就要寫上這一部,好多人都是望了寫這一部規則導緻,始終無法SSH.在遠端一下,是不是好了.
其他的端口也一樣,如果開啟了web伺服器,OUTPUT設定成DROP的話,同樣也要添加一條鍊:
[[email protected] ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其他同理.)
如果做了WEB伺服器,開啟80端口.
[[email protected] ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
如果做了郵件伺服器,開啟25,110端口.
[[email protected] ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[[email protected] ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
如果做了FTP伺服器,開啟21端口
[[email protected] ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[[email protected] ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
如果做了DNS伺服器,開啟53端口
[[email protected] ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
如果你還做了其他的伺服器,需要開啟哪個端口,照寫就行了.
上面主要寫的都是INPUT鍊,凡是不在上面的規則裡的,都DROP
允許icmp包通過,也就是允許ping,
[[email protected] ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT設定成DROP的話)
[[email protected] ~]# 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(放棄)的鍊.
減少不安全的端口連接配接
[[email protected] ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[[email protected] ~]# 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連接配接
[[email protected] ~]# 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 因為它表示所有位址都可以登陸.
或采用指令方式:
[[email protected] ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
然後儲存,我再說一邊,反是采用指令的方式,隻在當時生效,如果想要重起後也起作用,那就要儲存.寫入到/etc/sysconfig/iptables檔案裡.
[[email protected] ~]# /etc/rc.d/init.d/iptables save
這樣寫 !192.168.0.3 表示除了192.168.0.3的ip位址
其他的規則連接配接也一樣這麼設定.
在下面就是FORWARD鍊,FORWARD鍊的預設規則是DROP,是以我們就寫需要ACCETP(通過)的鍊,對正在轉發鍊的監控.
開啟轉發功能,(在做NAT時,FORWARD預設規則是DROP時,必須做)
[[email protected] ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[[email protected] ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢棄壞的TCP包
[[email protected] ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數量,防止攻擊,允許每秒100個
[[email protected] ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
設定ICMP包過濾,允許每秒1個包,限制觸發條件是10個包.
[[email protected] ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面隻是以允許ICMP包通過,就是因為我在這裡有限制。
配置一個NAT表放火牆
1、檢視本機關于NAT的設定情況
[[email protected] 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在預設情況下是什麼都沒有的
如果你想清除,指令是
[[email protected] ~]# iptables -F -t nat
[[email protected] ~]# iptables -X -t nat
[[email protected] ~]# iptables -Z -t nat
2、添加規則
添加基本的NAT位址轉換,(關于如何配置NAT可以看我的另一篇文章),
添加規則,我們隻添加DROP鍊.因為預設鍊全是ACCEPT.
防止外網用内網IP欺騙
[[email protected] sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[[email protected] sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[[email protected] sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
如果我們想,比如阻止MSN,QQ,BT等的話,需要找到它們所用的端口或者IP,(個人認為沒有太大必要)
例:
禁止與211.101.46.253的所有連接配接
[[email protected] ~]# iptables -t nat -A PREROUTING -d 211.101.46.253 -j DROP
禁用FTP(21)端口
[[email protected] ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
這樣寫範圍太大了,我們可以更精确的定義.
[[email protected] ~]# 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非法連接配接
[[email protected] ~]# iptables -A INPUT -m state --state INVALID -j DROP
[[email protected] ~]# iptables -A OUTPUT -m state --state INVALID -j DROP
[[email protected] ~]# iptables-A FORWARD -m state --state INVALID -j DROP
允許所有已經建立的和相關的連接配接
[[email protected] ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[[email protected] ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[[email protected] ~]# /etc/rc.d/init.d/iptables save
這樣就可以寫到/etc/sysconfig/iptables檔案裡了.寫入後記得把防火牆重起一下,才能起作用.
[[email protected] ~]# 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就不支援哈~