陈耀良 發表於 2021-9-27 17:37:00

MySQL、Redis、MongoDB网络抓包工具

<h2>简介</h2>
<p>&nbsp; &nbsp; &nbsp;<span style="font-size: 15px">go-sniffer&nbsp;可以抓包截取项目(MySQL、Redis、MongoDB)中的请求并解析成相应的语句,并格式化输出。类似于在之前的文章&nbsp;MySQL抓包工具:MySQL Sniffer【转】中介绍的mysql-sniffer。而&nbsp;go-sniffer&nbsp;可以对更多数据库进行抓包分析,现在来介绍在什么情况下会使用该工具的。</span></p>
<h2>使用</h2>
<p><span style="font-size: 15px"><strong>下载:</strong></span></p>
<p><span style="font-size: 15px"><span style="font-size: 14px">github 地址:https://github.com/40t/go-sniffer</span></span><br></p>
<p><span style="font-size: 15px"><strong>安装:</strong></span></p>
<p><span style="font-size: 15px"><strong>1)安装依赖包:</strong></span></p>
<p><span style="font-size: 14px">Centos<strong>:</strong></span></p>
<div class="cnblogs_code">
<pre>yum -y install libpcap-devel</pre>
</div>
<p><span style="font-size: 14px">Ubuntu:</span></p>
<div class="cnblogs_code">
<pre>apt-get install libpcap-dev</pre>
</div>
<p><span style="font-size: 14px">另外还需要安装golang,并且版本需要在1.10.3以上。</span></p>
<div class="cnblogs_code">
<pre>wget https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">golang.org/dl/go1.10.3.linux-amd64.tar.gz</span></pre>
</div>
<p><span style="font-size: 14px">设置好相关的环境变量。如果不想要go环境 ,则可以直接在其他地方安装好go-sniffer之后,复制到目标服务器上直接使用。</span>&nbsp;</p>
<p><span style="font-size: 15px"><strong>2)下载安装</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)"> 安装好go环境的服务器上:</span>
<span style="color: rgba(0, 0, 255, 1)">go</span> get <span style="color: rgba(128, 128, 128, 1)">-</span>v <span style="color: rgba(128, 128, 128, 1)">-</span>u github.com<span style="color: rgba(128, 128, 128, 1)">/</span>40t<span style="color: rgba(128, 128, 128, 1)">/</span><span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span><span style="color: rgba(0, 0, 0, 1)">sniffer
cp </span><span style="color: rgba(128, 128, 128, 1)">-</span>rf $(<span style="color: rgba(0, 0, 255, 1)">go</span> env GOPATH)<span style="color: rgba(128, 128, 128, 1)">/</span>bin<span style="color: rgba(128, 128, 128, 1)">/</span><span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer <span style="color: rgba(128, 128, 128, 1)">/</span>usr<span style="color: rgba(128, 128, 128, 1)">/</span>local<span style="color: rgba(128, 128, 128, 1)">/</span>bin   <span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">安装到设置好的go环境变量的目录里</span>
<span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer</pre>
</div>
<p><strong><span style="font-size: 15px">参数说明: </span></strong><span style="font-size: 15px">go-sniffer --help</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 128, 128, 1)">=======================================================================</span>
<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">使用说明</span><span style="color: rgba(255, 0, 0, 1)">]</span>

    <span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer <span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">设备名</span><span style="color: rgba(255, 0, 0, 1)">]</span> <span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">插件名</span><span style="color: rgba(255, 0, 0, 1)">]</span> <span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">插件参数(可选)</span><span style="color: rgba(255, 0, 0, 1)">]</span>

    <span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">例子</span><span style="color: rgba(255, 0, 0, 1)">]</span>
          <span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span><span style="color: rgba(0, 0, 0, 1)">sniffer en0 redis          抓取redis数据包
          </span><span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer en0 mysql <span style="color: rgba(128, 128, 128, 1)">-</span>p <span style="color: rgba(128, 0, 0, 1); font-weight: bold">3306</span><span style="color: rgba(0, 0, 0, 1)">抓取mysql数据包,端口3306

    </span><span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer <span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">[命令]</span>
               <span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">help 帮助信息</span>
               <span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">env环境变量</span>
               <span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">list 插件列表</span>
               <span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">ver版本信息</span>
               <span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">dev设备列表</span>
    <span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">例子</span><span style="color: rgba(255, 0, 0, 1)">]</span>
          <span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer <span style="color: rgba(0, 128, 128, 1)">--</span><span style="color: rgba(0, 128, 128, 1)">list 查看可抓取的协议</span>

<span style="color: rgba(128, 128, 128, 1)">=======================================================================</span>
<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">设备名</span><span style="color: rgba(255, 0, 0, 1)">]</span> : lo0 :   <span style="color: rgba(128, 0, 0, 1); font-weight: bold">127.0</span>.<span style="color: rgba(128, 0, 0, 1); font-weight: bold">0.1</span>
<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">设备名</span><span style="color: rgba(255, 0, 0, 1)">]</span> : en0 : x:x:x:x:x5:x<span style="color: rgba(128, 0, 0, 1); font-weight: bold">192.168</span>.<span style="color: rgba(128, 0, 0, 1); font-weight: bold">1.3</span>
<span style="color: rgba(255, 0, 0, 1)">[</span><span style="color: rgba(255, 0, 0, 1)">设备名</span><span style="color: rgba(255, 0, 0, 1)">]</span> : utun2 :   <span style="color: rgba(128, 0, 0, 1); font-weight: bold">1.1</span>.<span style="color: rgba(128, 0, 0, 1); font-weight: bold">11.1</span>
<span style="color: rgba(128, 128, 128, 1)">=======================================================================</span></pre>
</div>
<p><strong><span style="font-size: 15px">语法:</span></strong></p>
<div class="cnblogs_code">
<pre>$ <span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span><span style="color: rgba(0, 0, 0, 1)">sniffer lo0 mysql
$ </span><span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span><span style="color: rgba(0, 0, 0, 1)">sniffer en0 redis
$ </span><span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer eth0 http <span style="color: rgba(128, 128, 128, 1)">-</span>p <span style="color: rgba(128, 0, 0, 1); font-weight: bold">8080</span><span style="color: rgba(0, 0, 0, 1)">
$ </span><span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer eth1 mongodb</pre>
</div>
<h2><strong>使用场景</strong></h2>
<p><strong style="font-size: 15px">一 Redis :</strong><span style="font-size: 15px">审计、</span><span style="font-size: 15px">发现热点key</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="font-size: 14px">关于Redis的知识点就不说了,主要来说明如何使用go-sniffer来抓包分析。如果想发现哪个key的操作比较多或则是否存在热点key,在Redis4.0之前没有什么好办法(4.0之后的LFU可以查看hotkey),只有通过统计各个客户端发来的命令进行统计。虽然monitor可以看到某一刻的key操作,但是该命令消耗巨大,可能会造成客户端缓冲区溢出。并且也没有合适的插件来进行实现。即使有的话,对Redis的性能肯定有一定的损耗,所以只有监控其网络来分析操作是对Redis服务的影响最小的。如对一个实例进行监控:<br></span></p>
<div class="cnblogs_code">
<pre><strong><span style="color: rgba(0, 0, 255, 1)">go</span><span style="color: rgba(128, 128, 128, 1)">-</span>sniffer eth0 redis <span style="color: rgba(128, 128, 128, 1)">-</span>p <span style="color: rgba(128, 0, 0, 1)">6379</span></strong> <span style="color: rgba(128, 128, 128, 1)">&gt;&gt;</span> out.<span style="color: rgba(255, 0, 255, 1)">log</span></pre>
</div>
<p><span style="font-size: 14px">对通过eth0网卡的客户端访问端口为6379的Redis服务进行抓包,并把信息写到文件中。该文件的日志格式:</span></p>
<div class="cnblogs_code">
<pre>tcp <span style="color: rgba(128, 128, 128, 1)">and</span> port <span style="color: rgba(128, 0, 0, 1); font-weight: bold">6379</span><span style="color: rgba(0, 0, 0, 1)"> get abc</span><span style="color: rgba(0, 0, 0, 1)">
get abc
get abc</span><span style="color: rgba(0, 0, 0, 1)">
get abc
get opq
get opq
get opq
get opq
get xyz
get xyz
get xyz</span></pre>
</div>
<p><span style="font-size: 14px">可以看到,该文件的信息就是操作日志,最后可以通过使用awk来分析,也可以把该日志文件写入到数据库的表里进行统计分析:</span></p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">grep</span> -avEi <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">^#|^$|^tcp|^ INFO|^ AUTH|^ REPLCONF ACK|^ CONFIG GET</span><span style="color: rgba(128, 0, 0, 1)">"</span> out.txt |<span style="color: rgba(0, 0, 255, 1)">awk</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{print $1,$2}</span><span style="color: rgba(128, 0, 0, 1)">'</span>|<span style="color: rgba(0, 0, 255, 1)">sort</span>| <span style="color: rgba(0, 0, 255, 1)">uniq</span> -c | <span style="color: rgba(0, 0, 255, 1)">sort</span> -nr |<span style="color: rgba(0, 0, 255, 1)">head</span> -n <span style="color: rgba(128, 0, 128, 1)">10</span>
      <span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)"> get abc
      </span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)"> get opq
      </span><span style="color: rgba(128, 0, 128, 1)">3</span> get xyz</pre>
</div>
<p><span style="font-size: 14px"><strong>注意:go-sniffer</strong>也需要消耗一定的资源,大致的消耗可以看以下表格:</span></p>
<table border="1" align="left">
<tbody>
<tr>
<td>OPS</td>
<td>Redis CPU</td>
<td>sniffer CPU</td>
</tr>
<tr>
<td>1.2W</td>
<td>20%</td>
<td>30%</td>
</tr>
<tr>
<td>5.5W</td>
<td>80%</td>
<td>140%</td>
</tr>
<tr>
<td>7.5W</td>
<td>98%</td>
<td>180%</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 15px">从上面看到,<strong>go-sniffer</strong>所需要的CPU资源是Redis的2倍左右。所以,在使用该工具之前,先判断本身服务器的资源是否够用。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 15px"><strong>二 MySQL:</strong>审计</span></p>
<div class="cnblogs_code">
<pre>go-sniffer eth0 mysql -p <span style="color: rgba(128, 0, 128, 1)">3306</span> &gt;&gt; out.log</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 15px"><strong>三 MongoDB:</strong>审计</span></p>
<div class="cnblogs_code">
<pre>go-sniffer eth0 mongodb -p <span style="color: rgba(128, 0, 128, 1)">27017</span> &gt;&gt; out.log</pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    ~~~~~~~~~~~~~~~
万物之中,希望至美
~~~~~~~~~~~~~~~<br><br>
来源:https://www.cnblogs.com/zhoujinyi/p/15343188.html
頁: [1]
查看完整版本: MySQL、Redis、MongoDB网络抓包工具