リモートMysql
サーバーを使用して開発しているため、クエリsqlを簡単にチェックできません。ローカルサーバーを使用している場合、tail - f general_log_file
を使用して、httpインターフェイスを呼び出したときに実行されるsqlを確認できます。そこで、wireshark
をインストールして、ローカルから送信されるこれらのクエリSQLをキャプチャしました。まず、ローカルのmysqlを使用して確認します。
次に、mysqlターミナルで2つのクエリsqlを実行しました
select version();
select now();
しかし、私はこれらの2つのSQLパケットをwiresharkで見つけることができないので非常に残念です これらの4つのパケットのみが見つかりました。
しかし、私は知っている投稿から
Mysqlパケットをフィルターで除外するには、クエリを要求するパケットのみが必要な場合、フィルター ‘mysql‘または ‘mysql.query!=“”‘を使用します。その後、「mysql.query」というフィールド名のカスタム列を追加して、実行されたクエリのリストを取得できます。
そして効果はこのようなものです クエリ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.query
はtshark -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
...
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を追加して、そのポートを宛先とするトラフィックのみに制限しました。 ***フィルターはスクリーンショットに基づいています。現在検証できませんので、動作しない場合はお知らせください。
ここで役立つ回答: 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.=" $_";
}
}'
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 != “”‘
この投稿 から別の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'
空白行以外は何も出力されません。
同様の「問題」があった
あなたのmysql sslをチェックしてみてください
おそらくSSLがオンになっていたため、トラフィックは暗号化されていました
この投稿を参照してsslを確認できます: https://dba.stackexchange.com/questions/36776/how-can-i-verify-im-using-ssl-to-connect-to-mysql