を、IPアドレスのセットをフィルタリングするための唯一の方法は、それらをすべてリストすることです:
IPのセットのため
[10.0.0.1, 10.0.0.2, 10.0.0.3]
に対処し、
bpf_filter = "ip and ("
for addr in addresses[:-1]:
bpf_filter = "%shost %s or " % (bpf_filter, addr)
bpf_filter = "%shost %s)" % (bpf_filter, addresses[-1])
、戻ります:
ip and (host 10.0.0.1 or host 10.0.0.2 or host 10.0.0.3)
注:上記の動作には、少なくとも1つのIPアドレスが必要です。
これはなぜcBPFの制限ですか?
Scapyに指定したフィルタ式は、BPF bytecodeにコンパイルされます。 BPFバイトコードは後方ジャンプ(したがってループ)を許さない。この制限は、カーネルで実行されたときにフィルタが最終的に停止することを確実にする簡単な方法です。
逆方向ジャンプが許可されている場合は、IPアドレスのセットを使ってよりスマートな検索を行うことができます。たとえば、それらをハッシュテーブルに格納し、O(1)のハッシュテーブルに対してパケットをチェックすることができます。これは実際にはeBPFで可能ですが、私が知る限り、Scapyはまだサポートしていません。