<p>我知道你想给你的原始套接字附加一个过滤器,这是我最近的工作。多亏了几个星期的努力工作,我找到了一个简单的方法把过滤器连接到一个原始插座上。我想与您分享:)<br/>
首先确保您已经安装了<code>tcpdump</code>(这是一个Linux系统管理器工具),如果您的平台是Linux中的发行版之一,让我们进入下一步。<br/>
其次,您需要拥有<code>sudo or root</code>权限才能执行该工具。<br/>
第三步,以演示为例,更改它以适合您的情况。在</p>
<pre><code>$ sudo tcpdump -i enp4s0 -dd 'tcp and (port 9000 or port 80 or port 22)'
</code></pre>
<p>让我先解释一下参数。<br/>
<code>tcpdump</code>>;在网络上转储流量<br/>
<code>-i</code>>;指定接口<br/>
<code>enp4s0</code>>;网络接口<br/>
<code>-dd</code>>;将包匹配代码作为C程序片段转储。<br/>
<code>tcp and (port 9000 or port 80 or port 22)</code>>;伯克利包过滤器(BPF)语法</p>
<p>执行此命令后,您应该生成如下所示的代码:</p>
^{pr2}$
<p>看起来一团糟,但别担心,让我们继续勇敢吧。在</p>
<p>先让我弄清楚它是什么,这是一个包过滤代码,如果你以前已经学过汇编语言,你会觉得很熟悉的。在</p>
<p>第二,因为它是C风格的代码,它不适合我们的python用法,所以我们需要对数据进行润色,使用follow python代码</p>
<pre class="lang-py prettyprint-override"><code>import subprocess
cmd = "sudo tcpdump -i enp4s0 -dd 'tcp and (port 9000 or port 80 or port 22)'"
tcpdumpBinary = subprocess.check_output(cmd, shell=True)
macroString = '( ' + tcpdumpBinary.decode('utf-8').replace(
'\n', '').replace('{', '[').replace('}', ']') + ')'
macroString = eval(macroString)
</code></pre>
<p>第三,现在您可以使用<code>macroString</code>与<code>filters_list</code>相同。在</p>
<p>这个方法帮助我摆脱了过滤代码的困境,希望对您有所帮助。在</p>