FreeBSDでipfwとng_bpfの作業ネットワーク図を設定する

FreeBSDでipfwとng_bpfの作業ネットワーク図を設定する

ipfw、との組み合わせを使用して、FreeBSDで動作するネイティブBPFバイトコードパケットフィルタを取得しようとしています。ng_ipfwng_bpfng_tag

しかし、私が見つけた文書やプレゼンテーションには完全な作業例は含まれていませんでした。マニュアルページには、一致しないパケットを転送するためのコードのみがng_tag表示され、ネットワークグラフ全体の正しいフックを生成する方法は表示されません。bpf_progng_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_ipfwret 8192code=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__

おすすめ記事