2017-08-12 21 views
4

Pythonで(Scapyを使用して)特定のWebサイトのパケットをフィルタリングしようとしています。私は、ウェブサイトの可能なIP(負荷分散に使用される)のリストを持っています。私はこれらすべてのIPのパケットをフィルタリングしたい。どうやってやるの?単一IP用Scapyを使用してIPのリストのパケットをフィルタする方法

、私は次のコードを使用しています:あなたはcBPF(古典的なBPF)を使用しているので

bpf_filter = "ip and host " + addr 
sniff(timeout=10, prn=pkt_callback, store=0) 

答えて

2

を、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はまだサポートしていません。

関連する問題