我正在尝试使用,和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
都会被丢弃。
这意图是让与 BPF 程序匹配的入站数据包使用MTAG_IPFW
cookie 和所需标签进行标记,不匹配的数据包仅使用前者进行标记,并且从模块返回的数据包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__