Docker 如何将现场pcap记录从Kubernetes吊舱传输到本地运行的Wireshark?

Docker 如何将现场pcap记录从Kubernetes吊舱传输到本地运行的Wireshark?,docker,networking,kubernetes,pcap,tcpdump,Docker,Networking,Kubernetes,Pcap,Tcpdump,我试图在Wireshark中查看我的Kubernetes吊舱中的实时网络流量。在plain old Docker中,我能够运行以下命令: docker run--rm--net=container:app_service_1 crccheck/tcpdump-i any--immediate mode-w-| wireshark-k-i- 这将启动一个简单的容器,该容器运行带有所示参数的tcpdump,并将以pcap格式捕获的数据包通过管道传输到stdout(参数-w-)。然后,该输出通过管道传

我试图在Wireshark中查看我的Kubernetes吊舱中的实时网络流量。在plain old Docker中,我能够运行以下命令:

docker run--rm--net=container:app_service_1 crccheck/tcpdump-i any--immediate mode-w-| wireshark-k-i-

这将启动一个简单的容器,该容器运行带有所示参数的
tcpdump
,并将以pcap格式捕获的数据包通过管道传输到stdout(参数
-w-
)。然后,该输出通过管道传输到主机上运行的Wireshark,主机在数据包到达时显示数据包

我如何在库伯内特斯做类似的事情?

我已尝试按如下方式应用修补程序:

  template:
    spec:
      containers:
        - name: tcpdumper
          image: crccheck/tcpdump
          args: ["-i", "any", "--immediate-mode", "-w", "-"]
          tty: true
          stdin: true
我通过运行
k attach-it app-service-7bdb7798c5-2lr6q|wireshark-k-I-

但这似乎不起作用;Wireshark启动,但立即显示错误:


写入管道的数据既不是受支持的pcap格式,也不是pcapng格式

我没有经常使用k8s,但docker运行得到了完整的干净标准输出,而我得到的印象是k attach没有

我不认为kubectl有docker run的等价物,它可以为您提供干净的标准输出,但是您可以使用kubectl exec做一些事情


一个可能的测试是将输出重定向到一个文件,并查看它是否是您正在运行的命令的有效输出,并且没有任何意外情况。

我强烈建议您阅读

这篇文章解释了为什么你不能直接从吊舱中读取交通数据,并提供了一种使用侧车的替代方法

简而言之,容器最有可能运行在您的计算机无法直接访问的内部容器平台网络上

sidecar容器是在与实际服务/应用程序相同的pod中运行的容器,能够为服务/应用程序提供附加功能

在Kubernetes中,TCPdump的有效性有点棘手,需要您为pod创建一个侧车。你所面对的实际上是预期的行为

运行像TCPdump或ngrep这样的好的旧东西不会产生太大的收益 有趣的信息,因为您直接链接到桥 默认场景中的网络或覆盖

好消息是,您可以将TCPdump容器链接到主机 网络,甚至更好,到容器网络堆栈。 资料来源:

问题是您有两个入口点,一个是nodeIP:NodePort,第二个是ClusterIP:Port。两者都指向kubernetes iptables上设置的端点的同一组随机化规则

一旦这种情况发生在任何节点上,就很难将tcpdump配置为只在一个节点上捕获所有感兴趣的流量

我所知道的用于此类分析的最佳工具是Istio,但它主要适用于HTTP流量

考虑到这一点,最好的解决方案是为服务后面的每个吊舱使用tcpdumper侧车

让我们通过一个例子来说明如何实现这一点

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web-app
        image: nginx
        imagePullPolicy: Always        
        ports:
        - containerPort: 80
          protocol: TCP
      - name: tcpdumper
        image: docker.io/dockersec/tcpdump
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: web-svc
  namespace: default
spec:
  ports:
  - nodePort: 30002
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  type: NodePort
在这份清单上,我们可以注意到一些重要的事情。我们有一个nginx容器和一个tcpdumper容器作为侧车,我们有一个定义为NodePort的服务

要访问我们的侧车,您必须运行以下命令:

$ kubectl attach -it web-app-db7f7c59-d4xm6 -c tcpdumper
例如:

$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        13d
web-svc      NodePort    10.108.142.180   <none>        80:30002/TCP   9d

你也可以看看这个工具,它是一个kubectl插件,利用tcpdump和Wireshark在你的Kubernetes集群中的任何一个pod上启动远程捕获。

我相信我的问题是我正在将
附加到pod的单个Kubernetes日志上(或
日志-f
),它包含的不仅仅是pcap数据。这很有用。我通过管道将tcpdump的输出传输到pod上的一个文件,scp将其传输到我的主机,Wireshark能够解析它。但是,如果我尝试使用tail将文件直接流式传输到本地计算机并将其传输到Wireshark,则数据包含无关的'\n'。这是我的问题:如何在没有行提要的情况下对其进行流式处理。
$ curl localhost:30002
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
$ kubectl attach -it web-app-db7f7c59-d4xm6 -c tcpdumper
Unable to use a TTY - container tcpdumper did not allocate one
If you don't see a command prompt, try pressing enter.
> web-app-db7f7c59-d4xm6.80: Flags [P.], seq 1:78, ack 1, win 222, options [nop,nop,TS val 300957902 ecr 300958061], length 77: HTTP: GET / HTTP/1.1
12:03:16.884512 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.1336: Flags [.], ack 78, win 217, options [nop,nop,TS val 300958061 ecr 300957902], length 0
12:03:16.884651 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.1336: Flags [P.], seq 1:240, ack 78, win 217, options [nop,nop,TS val 300958061 ecr 300957902], length 239: HTTP: HTTP/1.1 200 OK
12:03:16.884705 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.1336: Flags [P.], seq 240:852, ack 78, win 217, options [nop,nop,TS val 300958061 ecr 300957902], length 612: HTTP
12:03:16.884743 IP 192.168.250.64.1336 > web-app-db7f7c59-d4xm6.80: Flags [.], ack 240, win 231, options [nop,nop,TS val 300957902 ecr 300958061], length 0
12:03:16.884785 IP 192.168.250.64.1336 > web-app-db7f7c59-d4xm6.80: Flags [.], ack 852, win 240, options [nop,nop,TS val 300957902 ecr 300958061], length 0
12:03:16.889312 IP 192.168.250.64.1336 > web-app-db7f7c59-d4xm6.80: Flags [F.], seq 78, ack 852, win 240, options [nop,nop,TS val 300957903 ecr 300958061], length 0
12:03:16.889351 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.1336: Flags [F.], seq 852, ack 79, win 217, options [nop,nop,TS val 300958062 ecr 300957903], length 0
12:03:16.889535 IP 192.168.250.64.1336 > web-app-db7f7c59-d4xm6.80: Flags [.], ack 853, win 240, options [nop,nop,TS val 300957903 ecr 300958062], length 0
12:08:10.336319 IP6 fe80::ecee:eeff:feee:eeee > ff02::2: ICMP6, router solicitation, length 16
12:15:47.717966 IP 192.168.250.64.2856 > web-app-db7f7c59-d4xm6.80: Flags [S], seq 3314747302, win 28400, options [mss 1420,sackOK,TS val 301145611 ecr 0,nop,wscale 7], length 0
12:15:47.717993 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.2856: Flags [S.], seq 2539474977, ack 3314747303, win 27760, options [mss 1400,sackOK,TS val 301145769 ecr 301145611,nop,wscale 7], length 0
12:15:47.718162 IP 192.168.250.64.2856 > web-app-db7f7c59-d4xm6.80: Flags [.], ack 1, win 222, options [nop,nop,TS val 301145611 ecr 301145769], length 0
12:15:47.718164 IP 192.168.250.64.2856 > web-app-db7f7c59-d4xm6.80: Flags [P.], seq 1:78, ack 1, win 222, options [nop,nop,TS val 301145611 ecr 301145769], length 77: HTTP: GET / HTTP/1.1
12:15:47.718191 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.2856: Flags [.], ack 78, win 217, options [nop,nop,TS val 301145769 ecr 301145611], length 0
12:15:47.718339 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.2856: Flags [P.], seq 1:240, ack 78, win 217, options [nop,nop,TS val 301145769 ecr 301145611], length 239: HTTP: HTTP/1.1 200 OK
12:15:47.718403 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.2856: Flags [P.], seq 240:852, ack 78, win 217, options [nop,nop,TS val 301145769 ecr 301145611], length 612: HTTP
12:15:47.718451 IP 192.168.250.64.2856 > web-app-db7f7c59-d4xm6.80: Flags [.], ack 240, win 231, options [nop,nop,TS val 301145611 ecr 301145769], length 0
12:15:47.718489 IP 192.168.250.64.2856 > web-app-db7f7c59-d4xm6.80: Flags [.], ack 852, win 240, options [nop,nop,TS val 301145611 ecr 301145769], length 0
12:15:47.723049 IP 192.168.250.64.2856 > web-app-db7f7c59-d4xm6.80: Flags [F.], seq 78, ack 852, win 240, options [nop,nop,TS val 301145612 ecr 301145769], length 0
12:15:47.723093 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.2856: Flags [F.], seq 852, ack 79, win 217, options [nop,nop,TS val 301145770 ecr 301145612], length 0
12:15:47.723243 IP 192.168.250.64.2856 > web-app-db7f7c59-d4xm6.80: Flags [.], ack 853, win 240, options [nop,nop,TS val 301145612 ecr 301145770], length 0
12:15:50.493995 IP 192.168.250.64.31340 > web-app-db7f7c59-d4xm6.80: Flags [S], seq 124258064, win 28400, options [mss 1420,sackOK,TS val 301146305 ecr 0,nop,wscale 7], length 0
12:15:50.494022 IP web-app-db7f7c59-d4xm6.80 > 192.168.250.64.31340: Flags [S.], seq 3544403648, ack 124258065, win 27760, options [mss 1400,sackOK,TS val 301146463 ecr 301146305,nop,wscale 7], length 0
12:15:50.494189 IP 192.168.250.64.31340 > web-app-db7f7c59-d4xm6.80: Flags [.], ack 1, win 222, options