ipfw
、との組み合わせを使用して、FreeBSDで動作するネイティブBPFバイトコードパケットフィルタを取得しようとしています。ng_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
破棄されることです。
これ意図アイデアはMTAG_IPFW
、クッキーと必須タグでマークされたBPFプログラムと一致するインバウンドパケット、電子的にのみ表示された一致しないパケット、モジュールから返されたパケットが単一の指示プログラム()を介してモジュールng_tag
に上流に転送されるようにすることです。ng_ipfw
ret 8192
code=6, k=8192
誰でも問題が何であるかを理解できますか?それとも、この方法でパケットを正しく表示する方法の完全なオンライン例を教えてください。
ベストアンサー1
一つを見つけた後表示されていない例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__