Networking
FreeBSD 上 ipfw 和 ng_bpf 的工作網路圖配置
我正在嘗試使用
ipfw
withng_ipfw
和.ng_bpf``ng_tag
但是,我能找到的文件或展示文稿都沒有包含任何完整的工作範例。
ng_tag
手冊頁只顯示了將不匹配的數據包傳回的bpf_prog
程式碼,ng_bpf
但沒有顯示如何為整個網路圖生成正確的鉤子。#!/bin/sh cookie=41 tag=412 mtag_ipfw=1148380143 # IPFW-tagged cookie from <netinet/ip_var.h> prog=$(./bpfgen | ./bytecode_to_ngbpf) # generate BPF code here ngctl shutdown ipfw:$cookie ngctl -f- <<-__END__ mkpeer ipfw: bpf $cookie filter name ipfw:$cookie CLASSIFIER msg CLASSIFIER: setprogram { thisHook="filter" ifMatch="match" ifNotMatch="notmatch" $prog } mkpeer CLASSIFIER: tag match tag_bad name CLASSIFIER:match TAGGER connect CLASSIFIER: TAGGER: notmatch tag_good msg CLASSIFIER: setprogram { thisHook="match" ifMatch="ipfw" bpf_prog_len=1 bpf_prog=[ { code=6 k=8192 } ] } msg CLASSIFIER: setprogram { thisHook="notmatch" ifMatch="ipfw" bpf_prog_len=1 bpf_prog=[ { code=6 k=8192 } ] } msg TAGGER: sethookin { thisHook="tag_bad" ifNotMatch="tag_bad" } msg TAGGER: sethookout { thisHook="tag_bad" tag_cookie=$mtag_ipfw tag_id=$tag } msg TAGGER: sethookin { thisHook="tag_good" ifNotMatch="tag_good" } msg TAGGER: sethookout { thisHook="tag_good" tag_cookie=$mtag_ipfw } __END__ ipfw add 2000 netgraph $cookie udp from any to any ipfw add 2010 allow log udp from any to any tagged $tag sysctl net.inet.ip.fw.one_pass=0
這是我最好的猜測,但所發生的一切是任何與
ipfw
將內容放入其中的規則匹配的數據包netgraph
都會被丟棄。目的是讓與BPF程序匹配的入站數據包使用
MTAG_IPFW
cookie 和所需標籤進行標記,不匹配的數據包僅使用前者進行標記,並且從ng_tag
模組返回的數據包都被轉發ng_ipfw
通過單指令程序ret 8192
(code=6, k=8192
)返回上游模組。誰能發現問題所在,或者指出一個完整的線上範例,說明如何以這種方式正確標記數據包?
在找到一個非標記範例(俄語!)之後,我已經設法自己解決了這個問題,使用
ngctl
我問題中命令的簡化版本,它只是將不匹配的數據包直接返回到ipfw
:ngctl -f- <<-__END__ mkpeer ipfw: bpf $cookie filter name ipfw:$cookie CLASSIFIER mkpeer CLASSIFIER: tag matched tag_bad name CLASSIFIER:matched TAGGER msg CLASSIFIER: setprogram { thisHook="filter" ifNotMatch="filter" ifMatch="matched" $prog } msg TAGGER: sethookin { thisHook="tag_bad" ifNotMatch="tag_bad" } msg TAGGER: sethookout { thisHook="tag_bad" tag_cookie=$mtag_ipfw tag_id=$tag } msg CLASSIFIER: setprogram { thisHook="matched" ifMatch="filter" ifNotMatch="filter" bpf_prog_len=1 bpf_prog=[ { code=6 k=65535 } ] } __END__