FreeBSD 上 ipfw 和 ng_bpf 的工作网络图配置

FreeBSD 上 ipfw 和 ng_bpf 的工作网络图配置

我正在尝试使用,和ipfw的组合来获得在 FreeBSD 上工作的原始 BPF 字节码数据包过滤器。ng_ipfwng_bpfng_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_IPFWcookie 和所需标签进行标记,不匹配的数据包仅使用前者进行标记,并且从模块返回的数据包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__

相关内容