使用 nsenter 配合 wireshark 来抓取容器数据包

最近在开发 Bitshares 内盘交易机器人,使用的 pybitshares 库,文档写的很基础,真是苦了我了。

这不就遇到了下单时,给我说 UnhandledRPCError,然后就没有然后了。

WTF!这特么让我怎么调试?你代码不知道怎么处理,你倒是把错误信息打出来啊。

我尝试过了 pdb 工具,逐步调试,也没有拿到信息,主要是不熟悉调试工具。最后打算直接上 wireshark 抓包了。

不过由于公开节点都是 http 的,用 wireshark 抓包也没法看,都是加密的。

于是我只能把我远端的节点服务器上的 8090 端口映射到我本地,这样我就可以直接使用 http 协议了。

但是还有个问题,就是我的开发环境在 Docker 容器里,而 8090 是映射在宿主机上,
wireshark 抓包没有抓到(后来想了下,应该要监听错了网卡,应该监听 Docker 的那块虚拟网卡才对)。

抓不到包咋办?

搜索了下,发现 Linux 大多数发行版会带着一个叫做 nsenter 的工具。

这个工具可以以其他程序的名字空间运行某个程序。而 Docker 容器在宿主机上其实就是一个进程,
那么我们就可以用这个工具把容器的名字空间搞出来,再运行 wireshark,那就相当于是在容器里
直接运行 wireshark

所以,我们需要先看下当前开发用的 Docker 容器的进程ID

1
docker ps

找到进程ID是 4030,再执行下面的命令完成映射,

1
# nsenter -n -t 4030

这时候,再执行

1
# wireshark

这时就能在 wireshark 里看到跟宿主机不一样的网卡列表,这就成功了。

启动抓包,重新执行我的程序,终于拿到了错误信息!!