tcpdump和tshark是网络抓包的工具,解包可以使用wireshark来查看抓包结果,以下命令需要管理员权限。
tcpdump 命令使用举例
以下命令中部分参数说明:
-D: 显示网络接口列表。-i: 设置抓包的网络接口,不设置则默认为第一个非自环接口。-w: 写入文件,再使用wireshark打开文件,进行解包分析。-r: 读取之前的使用-w写入的文件。-c: 抓取的 packet 数,在处理一定数量的 packet 后,停止抓取并退出程序。-n: 禁止所有地址名字解析。-s: 设置每个抓包的大小,默认为 65535,多于这个大小的数据将不会被程序记入内存、写入文件。-nn: 第 1 个n表示以 IP 地址的方式显示主机名,第 2 个n是以端口数字的形式代替服务名。-XX: 使用HEX和ASCII显示封包的内容。-vv: 比较详细的输出封包信息。
tcpdump -D tcpdump -nS tcpdump -nnvvS tcpdump -nnvvXS tcpdump host 1.2.3.4 tcpdump src 2.3.4.5 tcpdump dst 3.4.5.6 tcpdump net 1.2.3.0/24 tcpdump port 3306 tcpdump src port 1025 tcpdump dst port 389 tcpdump src port 1025 and tcp tcpdump udp and src port 53 tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16 tcpdump -nvvXSs 1514 dst 192.168.31.231 and src net and not icmp tcpdump -i eth0 dst 192.168.31.231 and port 80 tcpdump -XX -i eth0 tcpdump -nn -vv -i eth0 tcp src or dst 192.168.31.231 and port 80 tcpdump -nn -i eth0 tcp and host 192.168.1.163 and port 80 tcpdump -nn -vv -i eth0 src and dst 192.168.31.231 and port 80 tcpdump -s 1514 port 80 -w file.pcap tcpdump -nn -i eth0 -w ~/packets.dump tcp and dst 192.168.31.231 and port 22 tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)' |
2019 年更新示例
tcpdump -n -i eth0 host www.ffe5.cn and port 80 |
tcpdump mysql query
Linux 下使用tcpdump监控MySQL的网络请求:
tcpdump -i eth0 -s 0 -l -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.=" $_"; }}' |
tcpflow 监控 MySQL 的网络请求
brew install tcpflow tcpflow -c -p -i lo0 dst port 3306 | grep -i -E "select|insert|update|delete|replace"# below command is not work on Mac OS tcpflow -c -p -i any dst port 3306 | grep -i -E "select|insert|update|delete|replace" | sed 's/\(.*\)\([.]\{4\}\)\(.*\)/\3/' |
tshark 命令使用举例
tshark的参数很多与tcpdump一样,其他部分参数说明:
-f: 设定抓包过滤表达式capture filter expression。-T: fields|pdml|ps|psml|text,设置解码结果输出的格式,默认为 text,设置为 fields 时,必须使用-e field指定输出字段,如-e frame.number -e ip.addr -e udp。-Y: 设置显示的过滤表达式,这里注意Capture filter is not a display filter。-F: 设置输出 raw 数据的格式,默认为 libpcap。-x: 设置在解码输出结果中,每个 packet 后面以 HEX dump 的方式显示具体数据。
tshark -v tshark -D tshark -i eth0 -d tcp.port==3306,mysql -Y 'mysql.query' -T fields -e mysql.query tshark -i eth0 -n -d tcp.port==3306,mysql -Y 'mysql.query' -T fields -e mysql.query 'port 3306' tshark -r tcpdump.out -d tcp.port==3306,mysql -T fields -e mysql.query > query_log.out tshark -r login.tcpdump -T fields -e frame.number -e frame.time_relative -e ip.src -e ip.dst -e frame.protocols -e frame.len -E header=y -E quote=n -E occurrence=f tshark -r ~/net.pcap -T fields -e ip.src | sort | sed '/^\s*$/d' | uniq -c | sort -rn | awk {'print $2 " " $1'} | head tshark -nr ~/var/http.pcap -qz "io,phs" tshark -s 512 -i eth0 -n -f 'tcp dst port 80' -R 'http.host and http.request.uri' -T fields -e http.host -e http.request.uri -l | tr -d '\t' tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -R 'http.request.method == "GET" || http.request.method == "HEAD"' tshark -i eth0 -aduration:60 -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306' tshark -i wlan0 -w capture-output.pcap tshark -r capture-output.pcap tshark -i wlan0 -Y http.request -T fields -e http.host -e http.user_agent tshark -i wlan0 -f "src port 53" -n -T fields -e dns.qry.name -e dns.resp.addr tshark -i wlan0 -f "src port 53" -n -T fields -e frame.time -e ip.src -e ip.dst -e dns.qry.name -e dns.resp.addr tshark -i wlan0 -Y 'http.request.method == POST and tcp contains "password"' | grep password |
2019 年更新示例
tshark -i eth0 -n -f 'tcp port 80 and host www.ffe5.cn' |
tshark dump mysql query
监控本地MySQL服务器的网络请求中的 SQL,客户端mysql命令需要指定--host=127.0.0.1或者-h 127.0.0.1,而不能指定-h localhost,使用localhost时,mysql客户端会使用UNIX socket连接本地的服务器,而没有通过网络设备lo0,因此不能监控到网络数据包,更详细的信息可查看官方文档。
启动tshark监听3306端口:
sudo tshark -s 512 -i lo0 -n -f 'tcp dst port 3306' -Y 'mysql.query' -T fields -e mysql.query |
在另外一个命令行中运行以下命令:
mysql -uroot -p test -h 127.0.0.1 |
在命令行中执行 SQL 语句如下:
select * from user;select * from user where id = 1; |
前面开启tshark监控的窗口中输出如下:
Capturing on 'Loopback'
show databases
show tables
select @@version_comment limit 1
select * from user
select * from user where id = 1