【问题标题】:Docker Ubuntu 16.04 LTS - use tcpdump to capture GRE packetsDocker Ubuntu 16.04 LTS - 使用 tcpdump 捕获 GRE 数据包
【发布时间】:2017-05-09 02:58:39
【问题描述】:

我创建了一个派生自 ubuntu:16.04 docker image 的 docker 映像,并基于该映像启动了一个容器。在这个容器中,我尝试使用tcpdump 捕获 GRE 数据包。但是,当我在容器中运行 tcpdump -i <interface> proto gre 时,出现以下错误:

tcpdump: unknown ip proto 'gre'

知道如何解决这个问题吗?

注意:容器使用主机网络栈(即容器以--net="host"启动)

提前致谢。

【问题讨论】:

  • 显示 Dockerfile

标签: ubuntu docker tcpdump


【解决方案1】:

根据pcap-filter man page,只能指定以下protos:ether、fddi、tr、wlan、ip、ip6、arp、rarp、decnet 、tcp 和 udp。

但是,您可以像这样使用 slicing 运算符:"ip[9:1]=47"

如果你参考RFC791 Section 3.1,你会看到IP头的Protocol字段是头的第10个字节,或者位于偏移量9的1个字节的字段,这是什么ip[9:1] 隔离。此外,正如RFC2784, Section 4 中指定的(以及使用IANA 注册为协议号47),GRE 是协议47。

注意事项:

  • 虽然 pcap-filter 和 tcpdump 手册页不使用术语 slicing 来描述 [] 运算符,但 Wireshark 确实在 wireshark-filter 手册页中使用了这个术语,因此我在这里也使用它。
  • tcpdump 示例在他们的示例中使用单等号 =,而 Wireshark 在他们的示例中使用双等号 ==。在实践中,这两种方法都有效,因此请随意使用其中一种。
  • 由于您只对单个字节感兴趣,因此您实际上不需要在 slice 运算符中指定长度值,"ip[9]==47" 也可以正常工作。

【讨论】:

  • 感谢 Christopher 对此进行调查。有几点:(i)我可以在主机(docker容器在其上运行)上使用proto gre过滤器运行tcpdump(ii)用proto 47替换它在docker中可以正常工作
  • 我尝试了“ip proto 47”,但在我的测试中失败了。我可能正在运行旧版本的 tcpdump/libpcap(目前无法检查);您在主机和 docker 中运行的是什么版本的 tcpdump/libpcap?
  • 另外,如果“ip proto gre”有效,那么 pcap-filter 文档似乎需要更新。
【解决方案2】:

试试这个:

tcpdump -i any proto 47

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多