如何使用wireshark清楚地捕获mysql查询sql

时间:2016-07-03 07:13:29

标签: mysql wireshark tshark

因为我们使用远程Mysql服务器开发,所以无法轻松检查查询sql,如果使用本地服务器,您可以tail - f general_log_file查看调用某些http接口时执行的SQL。所以我安装了一个wireshark来从本地捕获这些查询sql发送。起初我使用本地mysql来验证它。

捕获过滤器是 enter image description here

然后我在mysql终端中执行了两个查询sql

select version();
select now();

但非常令人失望我在wireshark中找不到这两个sql包 enter image description here 我只发现了这四个包。

但是从我认识的帖子中

  

要过滤掉mysql数据包,只需使用过滤器'mysql'或'mysql.query!=“”',只需要请求查询的数据包。之后,您可以添加一个字段名称为“mysql.query”的自定义列,以获取执行的查询列表。

效果是这样的 enter image description here 只捕获查询sql很方便,并且非常清楚地显示了这些查询sql。那么我怎么能用wireshark来实现呢?

hi @Jeff S。

我尝试了你的命令,请看下面的

#terminal 1
tshark -i lo0 -Y "mysql.command==3"
Capturing on 'Loopback'

# terminal 2
mysql -h127.0.0.1 -u root -p
select version();
#result: nothing output in terminal 1

tshark -i lo0 -Y "mysql.command==3" -T fields -e mysql.querytshark -i lo -Y "mysql.command==3"相同,也没有任何输出。但是如果我只使用tshark -i lo0,它就有输出

Capturing on 'Loopback'
 1   0.000000    127.0.0.1 -> 127.0.0.1    TCP 68 57881 → 3306 [SYN] Seq=0 Win=65535 Len=0 MSS=16344 WS=32 TSval=1064967501 TSecr=0 SACK_PERM=1
 2   0.000062    127.0.0.1 -> 127.0.0.1    TCP 68 3306 → 57881 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=16344 WS=32 TSval=1064967501 TSecr=1064967501 SACK_PERM=1
 3   0.000072    127.0.0.1 -> 127.0.0.1    TCP 56 57881 → 3306 [ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=1064967501 TSecr=1064967501
 4   0.000080    127.0.0.1 -> 127.0.0.1    TCP 56 [TCP Window Update] 3306 → 57881 [ACK] Seq=1 Ack=1 Win=408288 Len=0 TSval=1064967501 TSecr=1064967501
...

5 个答案:

答案 0 :(得分:7)

您可以使用tshark并保存到pcap或只导出您感兴趣的字段。

要保存到pcap(如果您想使用wireshark稍后查看):

tshark -i lo -Y "mysql.command==3" -w outputfile.pcap
tshark -i lo -R "mysql.command==3" -w outputfile.pcap
-R is deprecated for single pass filters, but it will depend on your version
-i is interface so replace that with whatever interface you are using (e.g -i eth0)

要保存到文本文件:

tshark -i lo -Y "mysql.command==3" -T fields -e mysql.query > output.txt

您还可以将BPF过滤器与tcpdump(和wireshark前置过滤器)一起使用。它们更复杂,但如果您捕获大量流量,则会减少对系统的负担。

sudo tcpdump -i lo "dst port 3306 and  tcp[(((tcp[12:1]&0xf0)>>2)+4):1]=0x03" -w outputfile.pcap

注意:
*这在TCP有效载荷中查找03(类似mysql.command == 3) **由于这是一个相当宽松的过滤器,我还添加了3306以限制只发往该端口的流量。 ***过滤器基于您的屏幕截图。我现在无法验证它,所以让我知道它是否有效。

示例输出:Sample output from two commands

答案 1 :(得分:1)

我尝试了来自this post的另一个tshark命令,它可以捕获从本地到远程mysql服务器的查询sql。

tshark -i en0 -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306'
Capturing on 'Wi-Fi'
select version()


select now()


select rand()

但它也在这些sql之间输出一些空行。我尝试下面的命令想删除空行但是失败

tshark -i en0 -d tcp.port==6006,mysql -Y "frame.len>10" -T fields -e mysql.query 'port 6006'

不幸的是,这个命令不支持将查询sql捕获到本地mysql(5.7.12)。

tshark -i lo -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306'
Capturing on 'Loopback'

除空行外没有其他输出。

答案 2 :(得分:1)

这里有用的答案: https://serverfault.com/questions/358978/how-to-capture-the-queries-run-on-mysql-server

特别是:SoMoSparky的答案:

tshark -T fields -R mysql.query -e mysql.query

和user1038090的答案:

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'

答案 3 :(得分:1)

Wireshark工具支持MySQL协议: https://www.wireshark.org/docs/dfref/m/mysql.html

然后配置wireshark

a.menu Analyze --> Decode as --> add "field=tcp_port value=3306  current=MySQL"
b.filter ‘mysql‘ or ‘mysql.query != “”‘ 

答案 4 :(得分:0)

我有类似的“问题”

尝试检查您的mysql ssl

可能是ssl已打开,因此流量已加密

您可以参考这篇文章来检查ssl:https://dba.stackexchange.com/questions/36776/how-can-i-verify-im-using-ssl-to-connect-to-mysql