- 論壇徽章:
- 0
|
IPFW(8) -- IP防火墻和流量整形的控制程序
名稱:
ipfw – IP防火墻和流量整形的控制程序
ipfw語法:
ipfw [-cq] add rule
ipfw [-acdefnNStT] [set N] {list | show} [rule | first-last ...]
ipfw [-f | -q] [set N] flush
ipfw [-q] [set N] {delete | zero | resetlog} [number ...]
ipfw enable
{firewall | altq | one_pass | debug | verbose | dyn_keepalive}
ipfw disable
{firewall | altq | one_pass | debug | verbose | dyn_keepalive}
ipfw set [disable number ...] [enable number ...]
ipfw set move [rule] number to number
ipfw set swap number number
ipfw set show
ipfw table number add addr[/masklen] [value]
ipfw table number delete addr[/masklen]
ipfw table number flush
ipfw table number list
ipfw {pipe | queue} number config config-options
ipfw [-s [field]] {pipe | queue} {delete | list | show} [number ...]
ipfw nat number config config-options
ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathname
描述:
ipfw是FreeBSD下的一個(gè)用戶界面,它用來控制ipfw防火墻和流量整形。
ipfw的配置,也叫做規(guī)則集,它是由一系列的規(guī)則組成的,這些規(guī)則的編號是從1到65535。通過ipfw的數(shù)據(jù)包可以來自協(xié)議棧的許多各個(gè)的地方
(這主要依賴于數(shù)據(jù)包的來源和目的,某些數(shù)據(jù)包很可多次經(jīng)過防火墻)。數(shù)據(jù)包在通過防火墻的時(shí)候,要和防火墻規(guī)則集逐條對比。如果發(fā)現(xiàn)匹配的規(guī)則,則執(zhí)行
相應(yīng)規(guī)則的動作。
在特定的規(guī)則動作和系統(tǒng)設(shè)置下,數(shù)據(jù)包在匹配完一個(gè)規(guī)則后,可能在某些規(guī)則之后重新進(jìn)入防火墻。
一個(gè)ipfw規(guī)則集總是包含一個(gè)默認(rèn)的規(guī)則(編號為65535),這個(gè)默認(rèn)規(guī)則匹配所有的數(shù)據(jù)包,不能修改或刪除。根據(jù)內(nèi)核配置的不同,這個(gè)默認(rèn)規(guī)則或者是拒絕所以數(shù)據(jù)包通過,或者是允許所有數(shù)據(jù)包通過。
如果規(guī)則集中存在一個(gè)或多個(gè)包含有keep-state(狀態(tài)保持)或limit(限制)的規(guī)則,那么ipfw就表現(xiàn)為狀態(tài)保持。例如:當(dāng)這種
規(guī)則匹配了一個(gè)數(shù)據(jù)包時(shí),ipfw將創(chuàng)建一個(gè)動態(tài)規(guī)則,讓后來的,同這個(gè)數(shù)據(jù)包的地址和端口參數(shù)嚴(yán)格一致的數(shù)據(jù)包,與這個(gè)動態(tài)規(guī)則相匹配。
這些動態(tài)規(guī)則,都有一個(gè)有限的生存期。生存期在第一次遇到check-state、keep-state或者是limit規(guī)則時(shí)被檢查。這些動
態(tài)規(guī)則的典型應(yīng)用,是用來保證合法的數(shù)據(jù)包在通過時(shí)開啟防火墻。查看下面的“狀態(tài)防火墻”和“示例”章節(jié),獲取更多關(guān)于狀態(tài)保持的信息。
包括動態(tài)規(guī)則在內(nèi)的所有規(guī)則,都有幾個(gè)相關(guān)的計(jì)數(shù)器:一個(gè)包計(jì)數(shù)器,一個(gè)字節(jié)計(jì)數(shù)器,一個(gè)記錄計(jì)數(shù)器和一個(gè)用來提示最后匹配時(shí)間的時(shí)間戳。這些計(jì)數(shù)器都可以被ipfw命令顯示和清零。
可以用add命令來添加規(guī)則;可以用delete命令來刪除單個(gè)或一組規(guī)則;可以用flush命令來刪除所有的規(guī)則(set 31除外);可以用show和list命令來顯示包括計(jì)數(shù)器在內(nèi)的信息。最后,計(jì)數(shù)器可以被zero和resetlog命令清零。
并且,每個(gè)規(guī)則隸屬于32個(gè)不同的規(guī)則集中的一個(gè)。有一些ipfw的命令可以獨(dú)立地操作這些規(guī)則集,例如:啟動、禁止、交換規(guī)則集;把一個(gè)規(guī)則
集中的所有規(guī)則移動到另一個(gè)規(guī)則集;刪除一個(gè)規(guī)則集中的所有規(guī)則。這對于安裝臨時(shí)配置,或者是測試配置是非常有用的。查看“規(guī)則的規(guī)則集”一節(jié),獲取更多
關(guān)于 set的信息。
以下是ipfw命令可以利用的選項(xiàng):
-a 使用 list 時(shí),列出數(shù)據(jù)包的計(jì)數(shù)器,show命令包含這個(gè)選項(xiàng)。
-b 只顯示動作和注釋,不顯示規(guī)則體。包含-c選項(xiàng)。
-c 進(jìn)入或顯示規(guī)則時(shí),用緊湊格式輸出。例如:在沒有任何附加意義的情況下,不顯示“ip from any to any”字符串。
-d 在list時(shí),在顯示靜態(tài)規(guī)則的同時(shí),顯示動態(tài)規(guī)則。
-e 在list時(shí),如果指定了-d選項(xiàng),則顯示過期的動態(tài)規(guī)則。
-f 對于有些會導(dǎo)致問題的命令,不要提出確認(rèn)的詢問。例如:flush命令。哪果一個(gè)進(jìn)程沒有相關(guān)的tty,這個(gè)是默認(rèn)被包含的選項(xiàng)。(譯注:沒看懂這句話的意思,好像是如果不是在tty中輸入的命令,比如在scripts中,默認(rèn)是有-f的。)
-n 只檢查命令的語法,不真正執(zhí)行命令。
-q 當(dāng)新增
(add)、歸零(zero)、重置日志(resetlog)或清除(flush)
時(shí),不要顯示任何回應(yīng)信息(就像使用-f選項(xiàng)一樣)。這對于在腳本里利用ipfw命令來調(diào)整防火墻規(guī)則(例如執(zhí)行“sh
/etc/rc.firewall”腳本)、或者是處理與一個(gè)遠(yuǎn)程登錄相關(guān)的有多條ipfw命令的,是非常有用的。同時(shí),它防止無意間,在規(guī)則中加入或刪
除一個(gè)列表而導(dǎo)致的錯(cuò)誤。(譯注:沒看懂,好像下面是一個(gè)例子。)在正常的模式,默認(rèn)內(nèi)核配置下,一個(gè)flush命令會輸出一個(gè)信息。因?yàn)樗械囊?guī)則都被
清除掉,這個(gè)消息又不能傳送到登錄的進(jìn)程中,腳本后面的規(guī)則將無法執(zhí)行,所以將導(dǎo)致遠(yuǎn)程連接中斷。這時(shí),只好回到計(jì)算機(jī)前去工作了。
-S 當(dāng)列出一個(gè)規(guī)則的時(shí)候,顯示每條規(guī)則的規(guī)則集號。如果沒有指定這個(gè)標(biāo)識,則被禁止的規(guī)則不再顯示。
當(dāng)顯示pipe時(shí),按照四個(gè)計(jì)數(shù)器之一排序顯示。(對于所有的數(shù)據(jù)包、當(dāng)前數(shù)據(jù)包或者是字節(jié)數(shù))
-t 當(dāng)列出時(shí),顯示最后匹配的時(shí)間戳。(顯示用ctime()轉(zhuǎn)化后的時(shí)間)
-T 當(dāng)列出時(shí),顯示最后匹配的時(shí)間戳。(從新紀(jì)元到現(xiàn)在的秒數(shù))。這個(gè)格式更容易被腳本處理。
為了使配置更容易,規(guī)則可以寫到一個(gè)文件里供ipfw處理,語法規(guī)則參照大綱欄最后一行(譯注:指本文最前面的語法部分最后一行,即:“ipfw
[-cfnNqS] [-p preproc [preproc-flags]]
pathname”)。注意必須是絕對路徑。這個(gè)文件會被逐行讀取并且將作為ipfw工具的參數(shù)處理。
作為選擇,你還可以使用-p
preproc參數(shù)來使用預(yù)處理程序,其中路徑是用管道來傳入的。可以使用的預(yù)處理程序包括cpp和m4。如果preproc不是以”/“開頭,那么將搜
索PATH里的路徑。在使用它的時(shí)候,要謹(jǐn)慎,因?yàn)樵诤芏鄷r(shí)候,ipfw啟動時(shí),系統(tǒng)文件可能沒有掛接(比如:文件系統(tǒng)是通過NFS掛接的)。一旦使用了
-p參數(shù),所有其它的參數(shù),都被傳送到預(yù)處理程序去等待處理。
ipfw的pipe和queue命令用來配置流量整形,你可以下面的“TRAFFIC SHAPER (DUMMYNET) CONFIGURATION”節(jié)看到看到相關(guān)內(nèi)容。
如果系統(tǒng)的world和內(nèi)核不能保持一致,ipfw的ABI將失效,以防你加入任何規(guī)則。這樣能保證你的順利地完成啟動過程。你可以利用ipfw臨時(shí)禁止的機(jī)會登錄你的網(wǎng)絡(luò),來修復(fù)你的問題。
PACKET FLOW(數(shù)據(jù)包流程)
一個(gè)數(shù)據(jù)包在幾個(gè)內(nèi)核變量的控制下,在協(xié)議棧的多個(gè)地方被防火墻檢查。這些地方和變量如下圖所示,要在頭腦中保持下圖,它對于規(guī)劃一下正確的規(guī)則集是非常重要的。
^ 到上層 V
| |
+----------->-----------+
^ V
[ip(6)_input] [ip(6)_output] net.inet(6).ip(6).fw.enable=1
| |
^ V
[ether_demux] [ether_output_frame] net.link.ether.ipfw=1
| |
+-->--[bdg_forward]-->--+ net.link.bridge.ipfw=1
^ V
| 到設(shè)備 |
如圖所示,根據(jù)數(shù)據(jù)包的源和目的,以及系統(tǒng)配置的不同,同一個(gè)數(shù)據(jù)包穿過防火墻的次數(shù)在0和4之間變化。
需要注意的是,在包通過不同棧的時(shí)候,頭會被加上或剝離,可能會導(dǎo)致這些包被檢查不到。例如:當(dāng)ipfw被ether_demux()調(diào)用的時(shí)
候,進(jìn)入的包將包括MAC頭;而當(dāng)ipfw被ip_input()或者ip6_input()調(diào)用的時(shí)候,同一個(gè)數(shù)據(jù)包的MAC頭將被剝離。
還需要注意的是:不論檢查發(fā)生在什么地方,也不論數(shù)據(jù)包源自哪里,每個(gè)數(shù)據(jù)包也整個(gè)規(guī)則進(jìn)行對照。(譯注:是整個(gè)規(guī)則集嗎?有時(shí)候只對照一部分
的時(shí)候就中止檢查)。如果一個(gè)規(guī)則包含的一些匹配模型或動作不符合某處的要求(比如:在ip_input或ip6_input處匹配MAC頭),那么匹配
模型將不會被匹配。然而,帶有not前綴操作符的匹配模型,總是可以和這些數(shù)據(jù)包相匹配。所以,如果有必要,在有很多地方可以選擇的時(shí)候,有能力的程序員
可以為寫出的規(guī)則集選擇一個(gè)合適的位置。skipto規(guī)則在這兒是非常有用的。例如:
# packets from ether_demux or bdg_forward
ipfw add 10 skipto 1000 all from any to any layer2 in
# packets from ip_input
ipfw add 10 skipto 2000 all from any to any not layer2 in
# packets from ip_output
ipfw add 10 skipto 3000 all from any to any not layer2 out
# packets from ether_output_frame
ipfw add 10 skipto 4000 all from any to any layer2 out
。▽,在這兒,沒有辦法區(qū)別ether_demux和bdg_forward)
SYNTAX(語法規(guī)則)
通常,每個(gè)關(guān)鍵字或者參數(shù)都是作為獨(dú)立的命令行參數(shù)來提供的,前后都不能有空格。關(guān)鍵字是區(qū)分大小寫的,而參數(shù)按照它們本身的含義,可以是,也可以不是區(qū)分大小寫的。(例如,udi要區(qū)分大小寫,而hostname沒有必要區(qū)分大小寫)
在ipfw2中,為了提高可讀性,可以在逗號后面加上一個(gè)空格。當(dāng)然,你也可以把整個(gè)命令(包括參數(shù))當(dāng)作一個(gè)參數(shù)來處理(譯注:就是加上雙引號,作為一個(gè)字符串放到某個(gè)命令中)。例如,以下幾種格式效果相同:
ipfw -q add deny src-ip 10.0.0.0/24,127.0.0.1/8
ipfw -q add deny src-ip 10.0.0.0/24, 127.0.0.1/8 (譯注:127前面有個(gè)空格)
RULE FORMAT(規(guī)則格式)
ipfw的規(guī)則格式如下:
[rule_number] [set set_number] [prob match_probability] action
[log [logamount number]] [altq queue] [{tag | untag} number] body
規(guī)則的 body 部分用來設(shè)定包過濾的信息,具體細(xì)節(jié)如下:
Layer-2 header fields 第二層頭段,什么時(shí)候可用
IPv4 and IPv6 Protocol TCP, UDP, ICMP, 協(xié)議等
Source and dest. addresses and ports 源和目的。地址和端口
Direction 數(shù)據(jù)包的流向,見“流量整形”一節(jié)
Transmit and receive interface 傳輸和接收界面,用名字或地址表示
Misc. IP header fields 組合IP頭字段,包括版本、服務(wù)類型、報(bào)文長度、唯一標(biāo)識、分段標(biāo)志、生存期
IP options IP選項(xiàng)字段
IPv6 Extension headers IPv6擴(kuò)展頭,包括分片報(bào)頭、中繼選項(xiàng)報(bào)頭、路由報(bào)頭、路路由選擇報(bào)頭、IP層安全服務(wù)選項(xiàng)、Source routing rthdr0, Mobile IPv6 rthdr2(譯注:最后兩項(xiàng)不知道怎么翻譯)
IPv6 Flow-ID IPv6的流量標(biāo)識
Misc. TCP header fields 組合tcp頭字段,有TCP標(biāo)志(syn,fin,ack,rst等)、序列號、回復(fù)號,窗口等。
TCP options TCP的選項(xiàng)
ICMP types ICMP包
ICMP6 types ICMP6包
User/group ID 本地棧所歸屬的用戶和組
Divert status 是不是源自一個(gè)divert接口(例如:natd(8))
需要注意,上面的很多信息中,比如源MAC和IP地址、TCP/UDP端口等,是比較容易偽造的,所以只對這些信息進(jìn)行過濾不能保證達(dá)到預(yù)期的效果。
rule_number
每個(gè)規(guī)則都有規(guī)則號,規(guī)則號從1-65535。65535是保留的默認(rèn)規(guī)則。ipfw將按規(guī)則號的順序依次檢查這些規(guī)則?梢杂卸鄠(gè)規(guī)則用同一
個(gè)規(guī)則號,在這種情況下,將按照它們的添加順序依次檢查或列出。如果一個(gè)規(guī)則沒有指定規(guī)則號,內(nèi)核將自動賦于一個(gè)規(guī)則號,使它成為默認(rèn)規(guī)則前的最后一個(gè)規(guī)
則(即小于65535)。自動添加的規(guī)則號有個(gè)步進(jìn)值,在不大于65535的情況下,每次添加規(guī)則時(shí),都自動加上這一步進(jìn)值。它默認(rèn)是100,對應(yīng)于
net.inet.ip.fw.autoinc_step這個(gè)內(nèi)核變量。
set set_number
每個(gè)規(guī)則都對應(yīng)于一個(gè)規(guī)則集編號,規(guī)則集編號取值為:0-31。規(guī)則集可以單獨(dú)地被禁止或啟用,所以,它對于規(guī)則集的原子操作是
至關(guān)重要的。它還可以輕松地刪除掉一組規(guī)則。如果一個(gè)規(guī)則沒有指定規(guī)則集編號,它默認(rèn)的規(guī)則集編號就是0。規(guī)則集編號31是個(gè)特殊的規(guī)則集,它不能被禁
止,也不能用ipfw的flush命令刪除,它是默認(rèn)規(guī)則的規(guī)則集。規(guī)則集編號31可以用ipfw delete set
31命令刪除。(譯注:這在遠(yuǎn)程調(diào)試排斥式防火墻時(shí)特別有用,防止把自己鎖在外面。)
prob match_probability
這個(gè)語句只用來指定可能性(從0到1之間浮點(diǎn)值)。這在很多隨機(jī)丟包的應(yīng)用中,或者(在同dummynet聯(lián)用的情況下)模擬多路徑條件下無序包傳遞的效果中,是非常有用的。
注意:在檢查時(shí),這個(gè)條件比其它所有條件都先被檢查,包括會有副作用的keep-state或者check-state。
log [logamount number]
當(dāng)一個(gè)包匹配到一個(gè)有l(wèi)og關(guān)鍵字的規(guī)則時(shí),一條消息會被syslogd記錄到一個(gè)LOG_SECURITY設(shè)備中。記錄動作只會在同時(shí)滿足下
面兩個(gè)條件時(shí)才發(fā)生:1、內(nèi)核選項(xiàng)net.inet.ip.fw.verbose等于1(當(dāng)編譯內(nèi)核時(shí)帶著IPFIREWALL_VERBOSE參數(shù)時(shí),
這是默認(rèn)值);2、所記錄的包數(shù)量還達(dá)不到logamount
number所指定的數(shù)量。如果沒有指定logamuont,則記錄的包的上限受內(nèi)核變量net.inet.ip.fw.verbose_limit的限
制。在這兩種情況中,logamount取值為零時(shí),則取消記錄數(shù)量的限制。
當(dāng)記錄數(shù)量達(dá)到上限時(shí),可以通過重置記錄計(jì)數(shù)器或包計(jì)數(shù)器的方式再重新開始記錄。詳細(xì)情況請查看resetlog命令。
注意:記錄的時(shí)間是在所有的包檢測條件都完成之后,并且在采取相應(yīng)的動作(接受、拒絕等)之前。
tag number
當(dāng)一個(gè)包和一個(gè)帶有tag關(guān)鍵字的規(guī)則相匹配時(shí),一個(gè)指定的數(shù)字標(biāo)簽就被附加到這個(gè)包上,數(shù)字標(biāo)簽的范圍是1-65534。這個(gè)標(biāo)簽作為一個(gè)內(nèi)
部的記號(它不會從線路上發(fā)送出去),以便后來可以區(qū)分這些數(shù)據(jù)包。這有時(shí)候非常有用,比如:提供接口之間相互信任和開啟一個(gè)基于安全的過濾。一個(gè)包可以
同時(shí)有多個(gè)標(biāo)簽。標(biāo)簽是“頑固的”,意思就是只要標(biāo)簽被應(yīng)用到某個(gè)數(shù)據(jù)包上,那么它就一直存在,直到被明確地解除為止。這個(gè)標(biāo)簽在內(nèi)核中一直存在,但是一
旦數(shù)據(jù)包離開內(nèi)核,標(biāo)簽就會消失。例如:在當(dāng)把數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)或者發(fā)送到divert棧時(shí),標(biāo)簽就會消失。
要檢查已經(jīng)存在的標(biāo)簽,可以用tagged規(guī)則選項(xiàng),要?jiǎng)h除存在的標(biāo)簽,用untag關(guān)鍵字。
注意:既然標(biāo)簽是在內(nèi)核空間內(nèi)一直存在的,所以它們就可以被內(nèi)核的網(wǎng)絡(luò)子系統(tǒng)(使用mbuf_tags設(shè)備)設(shè)置或者是取消,而不僅僅依靠
ipfw的 tag和untag關(guān)鍵字。例如:可以存在一個(gè)netgraph(4)節(jié)點(diǎn)做流量分析,并且給數(shù)據(jù)包打上標(biāo)簽,以供后面的防火墻進(jìn)行檢查。
untag number
當(dāng)一個(gè)數(shù)據(jù)包匹配一個(gè)帶有untag關(guān)鍵字的規(guī)則時(shí),將在這個(gè)數(shù)據(jù)包所附加的標(biāo)簽中查找untag number所指定的標(biāo)簽號,如果找到,則將其刪除。對于數(shù)據(jù)包上的其它標(biāo)簽號,則原封不動。
altq queue(譯注:交錯(cuò)隊(duì)列, Alternate Queuing,參見PF文檔)
當(dāng)一個(gè)數(shù)據(jù)包匹配了一個(gè)帶有altq關(guān)鍵字的規(guī)則時(shí),將被附加上一個(gè)指定隊(duì)列(見altq(4))的ALTQ標(biāo)識符。注意,ALTQ標(biāo)簽只適用
于從
ipfw“向外出”的數(shù)據(jù)包,而不是被防火墻拒絕或者準(zhǔn)備到divert界面的數(shù)據(jù)包。還要注意的是,當(dāng)處理數(shù)據(jù)包的時(shí)候,如果沒有足夠內(nèi)存,那么數(shù)據(jù)包
將不會被打上標(biāo)簽,所以,一個(gè)明智的做法,是使你的“默認(rèn)”ALTQ隊(duì)列規(guī)則記錄下這種情況。如果有多個(gè)altq規(guī)則匹配于同一個(gè)數(shù)據(jù)包,那么只加上第一
條規(guī)則的ALTQ類別標(biāo)簽。那樣做的效果是:在規(guī)則集中靠前的altq隊(duì)列規(guī)則能起到流量整形的作用,而靠后的規(guī)則只達(dá)到過濾的效果。例如:把還有
ALTQ標(biāo)簽的、check-state和keep-state規(guī)則放到規(guī)則集的后部,有提供真正的包過濾的作用。
在IPFW使用altq的名字來檢查隊(duì)列之前,你必須用pfctl(8)工具來設(shè)置隊(duì)列。一旦重置ALTQ命令,那么包含隊(duì)列標(biāo)識符的規(guī)則將過期,需要被重新讀取才能生效。過期的隊(duì)列標(biāo)識符將會產(chǎn)生錯(cuò)誤的分類。
所有的ALTQ系統(tǒng)進(jìn)程都可以被ipfw的enable altq和disable altq命令啟用或關(guān)閉。ALTQ流量整形有真實(shí)規(guī)則動作,永遠(yuǎn)附加在ALTQ標(biāo)簽之后,和net.inet.ip.fw.one_pass毫無關(guān)系。
RULE ACTIONS(規(guī)則動作)
一個(gè)規(guī)則可以和下面動作中的一個(gè)或多個(gè)相關(guān)聯(lián),如果數(shù)據(jù)包匹配了規(guī)則體,那么這些動作將被執(zhí)行。
allow | accept | pass | permit 允許匹配規(guī)則的數(shù)據(jù)包通過,規(guī)則搜索中止。
check-state
將數(shù)據(jù)包和動態(tài)規(guī)則集里的規(guī)則進(jìn)行對照。如果找到,則執(zhí)行產(chǎn)生這條動態(tài)規(guī)則的那個(gè)規(guī)則相關(guān)聯(lián)的動作,如果沒找到,則進(jìn)行下一條規(guī)則。
check-
state沒有規(guī)則體。如果在規(guī)則集里沒有找到check-state,則在第一次出現(xiàn)keep-state或者limit規(guī)則時(shí),檢查動態(tài)規(guī)則集。
count 更新和本條規(guī)則相匹配的所有數(shù)據(jù)包的計(jì)數(shù)器。繼續(xù)進(jìn)行下一條搜索。
deny | drop 拋棄和本條規(guī)則相匹配的數(shù)據(jù)包。搜索中止。
divert port 把和本條規(guī)則相匹配的數(shù)據(jù)包轉(zhuǎn)向到divert(4)棧所綁定的端口。搜索中止。
fwd | forward ipaddr | tablearg[,port]
修改匹配數(shù)據(jù)包的下一跳地址,有可能是一個(gè)IP地址,也有可能是一個(gè)主機(jī)名。當(dāng)使用tablearg關(guān)鍵字時(shí),下一跳地址可以不是一個(gè)明確的地址,它可以從最后的數(shù)據(jù)包檢查表中獲取。如果匹配本規(guī)則,搜索中止。
(譯注:tablearg是FreeBSD7.0的ipfw新增功能,它可以使查表的結(jié)果作為規(guī)則的一部分來使用,可以用來優(yōu)化一些規(guī)則集,或?qū)崿F(xiàn)基于策略的路由,在使用時(shí),要配合table命令使用。)
如果指定的ipaddr是一個(gè)本地地址,所匹配數(shù)據(jù)包將被傳遞到本地機(jī)器的相應(yīng)端口(如果在規(guī)則中沒有指定端口,則是數(shù)據(jù)包中的端口號)。如果ipaddr不是一個(gè)本地地址,那么端口號(如果指定的話)將被忽略,數(shù)據(jù)包將會根據(jù)本機(jī)的路由表被轉(zhuǎn)發(fā)到遠(yuǎn)程地址。
一個(gè)fwd規(guī)則不會和一個(gè)二層的數(shù)據(jù)包(用ether_input,ether_output或者bridged接受)相匹配。fwd不會修改
數(shù)據(jù)包中的任何數(shù)據(jù),特別是目的地址。所以,除非在目的系統(tǒng)中有相應(yīng)的規(guī)則接受這些數(shù)據(jù)包,否則,被轉(zhuǎn)發(fā)到目的系統(tǒng)的數(shù)據(jù)包將被拒絕。對于被轉(zhuǎn)發(fā)到本地的
數(shù)據(jù)包,將把本地地址作為它的原始目的地址。這將使netstat(1)看起來有些古怪,但是,對于透明代理服務(wù)器來說,卻是有用的。
要使用fwd,必須在內(nèi)核中使用IPFIREWALL_FORWARD選項(xiàng),并重新編譯內(nèi)核。
nat nat_nr
Pass packet to a nat instance (for network address translation,
address redirect, etc.): see the NETWORK ADDRESS TRANSLATION
(NAT) Section for further information.
將數(shù)據(jù)包傳送到一個(gè)nat界面(用來做地址轉(zhuǎn)換或地址重定向等):詳細(xì)信息,請查看NETWORK ADDRESS TRANSLATION (NAT)一節(jié)。
pipe pipe_nr
將數(shù)據(jù)包傳送到一個(gè)dummynet(4)的“管道”(用來實(shí)現(xiàn)流量整形,延遲等)。詳細(xì)信息請查看TRAFFIC SHAPER
(DUMMYNET)
CONFIGURATION一節(jié)。如果匹配,則搜索中止。但是,在離開管道的時(shí)候,并且內(nèi)核變量net.inet.ip.fw.one_pass沒有設(shè)
置,數(shù)據(jù)包將被送回到防火墻的下一條規(guī)則。
queue queue_nr
將數(shù)據(jù)包傳送到一個(gè)dummynet(4)的“隊(duì)列”(用WF2Q+實(shí)現(xiàn)流量整形)
reject (Deprecated).
不可到達(dá)的同義詞。
reset
丟掉和本規(guī)則相匹配的數(shù)據(jù)包,如果是一個(gè)TCP數(shù)據(jù)包,則發(fā)送一個(gè)重置(RST)消息。搜索中止。
reset6
丟掉和本規(guī)則相匹配的數(shù)據(jù)包,如果是一個(gè)TCP數(shù)據(jù)包,則發(fā)送一個(gè)重置(RST)消息。搜索中止。
skipto number
跳到指定的規(guī)則,忽略掉比指定規(guī)則號小的規(guī)則。搜索從指定的規(guī)則號繼續(xù)。
tee port
將相匹配的數(shù)據(jù)包復(fù)制一份到divert(4)所綁定的端口。搜索繼續(xù)。
unreach code
丟棄和本規(guī)則相匹配的包,并且嘗試發(fā)送一條編號為指定編號的不可到達(dá)的ICMP消息。編號范圍是0-255,或者使用下列別名之一:net,
host, protocol, port, needfrag, srcfail, net-unknown,host-unknown,
isolated,net-prohib, host-prohib, tosnet, toshost,
filter-prohib,host-precedence or precedence-cutoff。搜索中止。
unreach6 code
丟棄和本規(guī)則相匹配的包,并且嘗試發(fā)送一條編號為指定編號的不可到達(dá)的ICMPv6消息。編號為0,1,3,4或者是下列別名之一:no-route, admin-prohib, address or port。搜索中止。
netgraph cookie
使用指定的cookie把數(shù)據(jù)包轉(zhuǎn)向到netgraph。搜索中止。如果稍后數(shù)據(jù)包眾netgraph返回,則受內(nèi)核變量net.inet.ip.fw.one_pass的影響,或者被接受,或者從下一條規(guī)則繼續(xù)。
ngtee cookie
將數(shù)據(jù)包復(fù)制一份,轉(zhuǎn)發(fā)到netgraph,原始的數(shù)據(jù)包則受net.inet.ip.fw.one_pass的影響,或者被接受,或者從下一條規(guī)則繼續(xù)。查看ng_ipfw(4)可以獲取更多關(guān)于netgraph和ngtee動作的信息。
RULE BODY(規(guī)則體)
規(guī)則體包括零個(gè)或多個(gè)匹配模式(比如指定源和目的的地址或端口,協(xié)議選項(xiàng),進(jìn)入和流出的界面等。),這些匹配模式必須按順序?qū)?shù)據(jù)包進(jìn)行識別。
通常,匹配模式之間用一個(gè)隱含的“和”操作連接,比如:所有規(guī)則中的模型都必須去和數(shù)據(jù)包進(jìn)行匹配。單個(gè)的模型可以使用“not”操作符作為前綴,用來表
示相反的匹配結(jié)果,就象在下例中:
ipfw add 100 allow ip from not 1.2.3.4 to any
特別的,當(dāng)用來表示二選一的“或”模型時(shí),可以使用一對小括號“()”或一對大括號“{}”括起來的“or”操作符,比如:
ipfw add 100 allow ip from { x or not y or z } to any
只允許有一級小括號。特別提示:大多數(shù)shell中,小括號和大括號都有特殊的意義,所以,為了防止被shell誤解,強(qiáng)烈建議在小括號和大括號前加上反斜杠“\”。
規(guī)則體中,至少要包含一個(gè)源地址和目的地址的語句!盿ny”關(guān)鍵字可以用在多種地方,用來表明源或目標(biāo)可以是任意的。
規(guī)則體的格式如下:
[proto from src to dst] [options]
第一個(gè)部分(proto from src to dst)用來和早期版本的FreeBSD相兼容。在新的FreeBSD版本中,所有的匹配模型(包括MAC頭,IP協(xié)議,地址和端口)都可以在options里指定。
各規(guī)則字段的含義如下:
proto: protocol | { protocol or ... }
protocol:[not] protocol-name | protocol-number
一個(gè)IP協(xié)議可以用序號或名稱(在/etc/protocols里可以查看完整的名稱列表),或者是下面的關(guān)鍵字之一:
ip4 | ipv4 和IPv4數(shù)據(jù)包相匹配
ip6 | ipv6 和IPv6數(shù)據(jù)包相匹配
ip | all 和所有數(shù)據(jù)包相匹配
ipv6在proto選項(xiàng)中,將被作為內(nèi)部協(xié)議。并且,ipv4在prto選項(xiàng)中是不適用的。
{ protocol or … } 格式的“或”的功能只是方便使用,不提倡這種做法。
src and dst: {addr | {addr or ... }} [[not] ports]
一個(gè)地址(或者一個(gè)列表,見后),可以使用ports修飾符。
第二種格式(用or連接起來的多個(gè)地址)只是方便使用,卻不提倡這種做法。
addr: [not] {any | me | me6 | table(number[,value]) | addr-list | addr-set}
any 匹配任意地址
me 匹配系統(tǒng)中所有設(shè)置的IP地址。
me6 匹配系統(tǒng)中所有設(shè)置的IPv6地址。地址列表是在分析數(shù)據(jù)包的時(shí)候才被列出的。
table(number[,value])
如果一個(gè)數(shù)據(jù)包在表序號為number的表中存在相應(yīng)的條目,則匹配。如果指定了一個(gè)可選的32位無符號數(shù)value,則條目序號為value的數(shù)據(jù)包才被匹配。查看LOOKUP TABLES一節(jié),可以獲取更多信息。
addr-list: ip-addr[,addr-list]
ip-addr: 一個(gè)主機(jī)或者一段地址,可以采用下列格式:
numeric-ip | hostname
匹配單個(gè)IPv4地址,可以采用點(diǎn)分四組格式或主機(jī)名。當(dāng)采用主機(jī)的時(shí)候,在添加規(guī)則的時(shí)候?qū)⒈唤馕鰹橄鄳?yīng)的IP。
addr/masklen
匹配于指定的基地址addr(可以是單個(gè)IP地址、網(wǎng)絡(luò)地址或者是主機(jī)名)和掩碼位masklen。例如:1.2.3.4/25或1.2.3.0/25 匹配于從1.2.3.0到1.2.3.127的IP地址。
addr:mask
匹配于指定的基地址addr(可以是單個(gè)地址、網(wǎng)絡(luò)地址或主機(jī)名)和指定的子網(wǎng)掩碼mask,用點(diǎn)分四組表示法。例如:1.2.3.4: 255.0.255.0或者1.0.3.0:255.0.255.0匹配于1.*.3.*。只建議在非連續(xù)的子網(wǎng)掩碼中使用這種格式,對于連續(xù)的子網(wǎng)掩碼,請使用addr/masklen格式,它的格式更緊湊,也不容易出錯(cuò)。
。ㄗg注:這個(gè)和反掩碼有此類似)
addr-set: addr[/masklen]{list}
list:{num | num-num}[,list]
匹配于基地址是addr(可以是IP地址、網(wǎng)絡(luò)地址或主機(jī)名),并且最后一個(gè)數(shù)字在{。斜碇械牡刂贰U堊⒁庠诖罄ㄌ柡蛿(shù)字之間不能有空格(在逗號之后可以有空格)。大括號中的每個(gè)元素可以是單個(gè)的條目,也可以是一個(gè)范圍。masklen字段通常用來限制某一段地址的長度,取值范圍為24到32,默認(rèn)取24。
這個(gè)對處理在某一個(gè)地址段內(nèi)多個(gè)分散的IP地址最有效,因?yàn)槭怯醚诖a位來匹配,所以節(jié)省了時(shí)間,也顯著地降低了規(guī)則的復(fù)雜程序。
一個(gè)例子:1.2.3.4/24{128,35-55,89}或者1.2.3.0/24{128,35-55,89}表示下列的IP地址:
1.2.3.128, 1.2.3.35到1.2.3.55,1.2.3.89
。ㄗg注:由于很多shell中大括號有特殊意義,所以通常情況下,要在大括號前加上反斜杠“\”,表示轉(zhuǎn)義)
addr6-list: ip6-addr[,addr6-list]
ip6-addr: 一個(gè)主機(jī)或者一段地址,可以采用下列格式:
numeric-ip | hostname
同單一的inet_pton(3)所允許的IP地址或主機(jī)名相匹配。主機(jī)名在添加規(guī)則時(shí)被解析為相應(yīng)的IP。
addr/masklen
匹配所有基地址是addr(可以是inet_pton允許的地址或主機(jī)名),并且掩碼位數(shù)是masklen的地址。
沒有提供批量的IPv6地址,因?yàn)镮Pv6地址在前綴之后,是隨機(jī)的。(譯注:不是很懂)
ports: {port | port-port}[,ports]
對于支持端口的協(xié)議,可以指定一個(gè)可選的單個(gè)端口、多個(gè)端口、或者是一段端口,這些端口用逗號分開,并且不能有空格。還可以使用可選的not操作符!-”用來表示包括邊界在內(nèi)的一段范圍。
可以使用服務(wù)名(見/etc/services)來代替端口號。端口號或端口范圍列表最大數(shù)目是30,如果想指定更多的端口,可以在options中使用or符號。
如果服務(wù)名中存在減號“-”,可以在前面加上反斜杠來轉(zhuǎn)義。(在shell中,如果要使用反斜杠,則要用兩次,否則,shell將會把它作為轉(zhuǎn)義字符處理。),例如:
ipfw add count tcp from any ftp\\-date-ftp to any
非零偏移量的分段的數(shù)據(jù)包(比如不是第一個(gè)段),不會匹配于任何帶端口號的規(guī)則。參見frag一節(jié)。
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u3/94986/showart_1925151.html |
|