(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】特定のPodに対してパケットキャプチャーをしかける

スポンサーリンク

やりたいこと

WorkerNode上で動作する特定のPod(例IngressController等)を宛先とする通信のパケットを取得する。

環境情報
  • Kubernetes v1.23

やり方

tcpdumpが含まれたコンテナイメージを用意した上でIngress ControllerのPodが動くWorkerNodeを以下のYAMLのnodeSelectorに記載。

apiVersion: v1
kind: Pod
metadata:
  name: test
  namespace: default
spec:
  containers:
  - args: ["-c", "sleep 1d"]
    command: ["/bin/sh"]
    image: testimage:latest
    imagePullPolicy: IfNotPresent
    name: test
    resources: {}
    securityContext:
      privileged: true
      runAsUser: 0
  dnsPolicy: ClusterFirst
  hostNetwork: true
  hostPID: true
  nodeSelector:
    kubernetes.io/hostname: XX
  restartPolicy: Never
  securityContext: {}

同Podの中にshで入った上でIngress ControllerのPodのIP及びネットワークインターフェースを指定すると

/ # tcpdump -i eth0 host X.X.X.X -w test.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C19 packets captured
19 packets received by filter
0 packets dropped by kerne
...

パケットが取得できる。

以下、補足です。

補足

WorkerNode上でパケットを取得するため特権レベルでコンテナを動作させています。

尚、tcpdumpコマンドは以下を利用していますが

 # tcpdump --version
tcpdump version 4.9.3
libpcap version 1.9.1 (with TPACKET_V3)
OpenSSL 1.1.1g  21 Apr 2020

コンテナイメージに採用したOSイメージによってはファイル書き出しのオプションをつけると以下のエラーになる場合がありました。

/ # tcpdump -i eth0 host X.X.X.X -w test.pcap
tcpdump: Couldn't change ownership of savefile

その場合でもコンテナイメージを変更すると同じバージョンのtcpdumpコマンドが動作したことを合わせて記しておきます。

以上。