Troubleshooting是我平时工作中的重要内容,我几乎每天都会花一些时间在定位客户环境的问题上,有很多的问题都需要通过抓包来协助分析,比如定位SSL handshake失败,SNMP请求没响应的问题等。Linux平台一般使用tcpdump抓包,由于我们只能通过远程脚本调用的方式执行,所以对windows我没法使用wireshark之类的GUI工具,所以一般用netsh( 参考资料3)进行抓包。但是,linux上有时候并没有安装tcpdump或者登录的用户没有权限执行tcpdump,而且windows上使用netsh抓包很麻烦,而且过滤方式很弱,所以,我们就想着能不能有其他的抓包方式。
Pcap4j刚好满足我们的要求,下面接单介绍下使用pcap4j如何实现抓包。
创建项目
创建一个maven项目,设置完项目后,将pcap4j的依赖加到pom.xml中:
org.pcap4j
pcap4j-core
1.7.3
org.pcap4j
pcap4j-packetfactory-static
1.7.3
打开网卡抓第一个包
Pcap4j提供了一个很好的工具类org.pcap4j.core.Pcaps,可以方便的根据名字获得一个网卡。拿到网卡后,打开一个PcapHandle,并获取第一个包并打印包信息。
// 根据网卡名获取网卡
PcapNetworkInterface nif = Pcaps.getDevByName(name);
int snapLen = 65536;
PromiscuousMode mode = PromiscuousMode.PROMIS