web-dev-qa-db-ja.com

Wiresharkを使用してMySQLクエリSQLを明確にキャプチャする方法

リモートMysqlサーバーを使用して開発しているため、クエリsqlを簡単にチェックできません。ローカルサーバーを使用している場合、tail - f general_log_fileを使用して、httpインターフェイスを呼び出したときに実行されるsqlを確認できます。そこで、wiresharkをインストールして、ローカルから送信されるこれらのクエリSQLをキャプチャしました。まず、ローカルのmysqlを使用して確認します。

キャプチャフィルターは enter image description here

次に、mysqlターミナルで2つのクエリsqlを実行しました

select version();
select now();

しかし、私はこれらの2つのSQLパケットをwiresharkで見つけることができないので非常に残念です enter image description here これらの4つのパケットのみが見つかりました。

しかし、私は知っている投稿から

Mysqlパケットをフィルターで除外するには、クエリを要求するパケットのみが必要な場合、フィルター ‘mysql‘または ‘mysql.query!=“”‘を使用します。その後、「mysql.query」というフィールド名のカスタム列を追加して、実行されたクエリのリストを取得できます。

そして効果はこのようなものです enter image description here クエリSQLのみをキャプチャして、これらのクエリSQLを非常に明確に表示すると便利です。では、どのようにwiresharkを使用してこれを実装できますか?


こんにちは@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
...
9
zhuguowei

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

TcpdumpでBPFフィルターを使用することもできます(および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

7
Jeff S.

ここで役立つ回答: 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.=" $_";
  }
}'
1
pdwalker

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 != “”‘ 
1
yuanyou2012

この投稿 から別の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'

残念ながら、このコマンドはローカルmysql(5.7.12)へのクエリSQLのキャプチャをサポートできません。

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

空白行以外は何も出力されません。

1
zhuguowei

同様の「問題」があった

あなたのmysql sslをチェックしてみてください

おそらくSSLがオンになっていたため、トラフィックは暗号化されていました

この投稿を参照してsslを確認できます: https://dba.stackexchange.com/questions/36776/how-can-i-verify-im-using-ssl-to-connect-to-mysql

0
ivantedja