【Kubernetes】ksniffでパケットキャプチャ

2023.11.12
2024.03.24
Kubernetes
ksniffkubectlWireshark

はじめに

Kubernetes で ksniff を使ってパケットキャプチャをする方法を紹介します。

ksniff

ksniff は、tcpdump と Wireshark でのパケットキャプチャができる kubectl プラグインです。

tcpdump のバイナリをコンテナに追加、もしくは別の Pod から tcpdump でパケットキャプチャし、その結果をローカルの Wireshark に送ってくれます。

GitHub - eldadru/ksniff: Kubectl plugin to ease sniffing on kubernetes pods using tcpdump and wireshark

GitHub - eldadru/ksniff: Kubectl plugin to ease sniffing on kubernetes pods using tcpdump and wireshark

Kubectl plugin to ease sniffing on kubernetes pods using tcpdump and wireshark - eldadru/ksniff

ksniff はまだ production ready ではないので、本番環境での動作はおすすめしないみたいです。なので、開発用の環境やローカルで検証する時に使うツールとして考えるのが良さそうです。

インストール

krewを使って、インストールできます。

1kubectl krew install sniff

krewについては、下記を参考にしてください。

【Kubernetes】Krewでkubectlのプラグインを管理する

【Kubernetes】Krewでkubectlのプラグインを管理する

はじめに kubectlのプラグインを管理できるKrewについて紹介していきます。 Krewと

使い方

基本的な使い方は下記の通りです。

1kubectl sniff <POD_NAME> [-n <NAMESPACE_NAME>] [-c <CONTAINER_NAME>] [-i <INTERFACE_NAME>] [-f <CAPTURE_FILTER>] [-o OUTPUT_FILE] [-l LOCAL_TCPDUMP_FILE] [-r REMOTE_TCPDUMP_FILE]

non-privileged ユーザーで実行している Pod は、-pをつけると、別の Pod を作成し、そこから特権モードでキャプチャしてくれます。

試してみる

試しに下記のサンプルアプリでパケットキャプチャしてみます。

Bookinfo Application

Bookinfo Application

Deploys a sample application composed of four separate microservices used to demonstrate various Istio features.

1❯ kubectl get pod
2NAME                             READY   STATUS    RESTARTS   AGE
3details-v1-698d88b-wl7jh         2/2     Running   0          7m7s
4productpage-v1-675fc69cf-nrmth   2/2     Running   0          7m6s
5ratings-v1-6484c4d9bb-db29m      2/2     Running   0          7m7s
6reviews-v1-5b5d6494f4-6rr5c      2/2     Running   0          7m6s
7reviews-v2-5b667bcbf8-22hn6      2/2     Running   0          7m6s
8reviews-v3-5b9bd44f4-m5qsh       2/2     Running   0          7m6s

ksniff を実行します。

1❯ kubectl sniff productpage-v1-675fc69cf-nrmth -n default -c productpage -p
2INFO[0000] sniffing method: privileged pod
3INFO[0000] sniffing on pod: 'productpage-v1-675fc69cf-nrmth' [namespace: 'default', container: 'productpage', filter: '', interface: 'any']
4INFO[0000] creating privileged pod on node: 'docker-desktop'
5INFO[0000] pod: 'ksniff-nmsc7' created successfully in namespace: 'default'
6INFO[0000] waiting for pod successful startup
7INFO[0003] pod: 'ksniff-nmsc7' created successfully on node: 'docker-desktop'
8INFO[0003] spawning wireshark!
9
10...

実行すると、Wireshark が起動して、パケットの確認ができます。

Pod も確認してみると、ksniff の Pod が起動していることが確認できます。

1❯ kubectl get pod
2NAME                             READY   STATUS    RESTARTS   AGE
3details-v1-698d88b-wl7jh         2/2     Running   0          12m
4ksniff-nmsc7                     2/2     Running   0          2m26s
5productpage-v1-675fc69cf-nrmth   2/2     Running   0          12m
6ratings-v1-6484c4d9bb-db29m      2/2     Running   0          12m
7reviews-v1-5b5d6494f4-6rr5c      2/2     Running   0          12m
8reviews-v2-5b667bcbf8-22hn6      2/2     Running   0          12m
9reviews-v3-5b9bd44f4-m5qsh       2/2     Running   0          12m

エラー

使っている時にいくつかエラーに遭遇したので、解決策とともに紹介します。

Error: exec: "wireshark": executable file not found in $PATH

まずは、下記のエラーです。

1...
2
3Error: exec: "wireshark": executable file not found in $PATH

こちらは、下記の Issue で解決されていました。

Error: exec: "wireshark": executable file not found in $PATH · Issue #88 · eldadru/ksniff

Error: exec: "wireshark": executable file not found in $PATH · Issue #88 · eldadru/ksniff

Hi, I am using macos and i have installed wireshark I tried sniffing one of my pods using the command kubectl sniff pod-name -n namespace and below is where its erroring out Error: exec: "wireshark...

解決方法としては、/usr/local/binwiresharkのスクリプトを作成する必要があります。

まずは、/usr/local/binwiresharkを作成します。

1cd /usr/local/bin/
2sudo vim wireshark

wiresharkの内容は下記の通りです。

1#!/usr/bin/env bash
2WIRESHARK="/Applications/Wireshark.app/Contents/MacOS/Wireshark"
3${WIRESHARK} "$@"
4exit $?

作成したら、実行権限をつけて完了です。

1cd /usr/local/bin/
2chmod a+x wireshark

failed to start remote sniffing, stopping wireshark error="executing sniffer failed, exit code: '1'"

次は、下記のエラーです。

1...
2
3
4INFO[0000] start sniffing on remote container
5INFO[0000] executing command: '[/tmp/static-tcpdump -i any -U -w - ]' on container: 'productpage', pod: 'productpage-v1-6c4f8467b9-5bb9p', namespace: 'default'
6INFO[0000] command: '[/tmp/static-tcpdump -i any -U -w - ]' executing successfully exitCode: '1', stdErr :'static-tcpdump: any: You don't have permission to capture on that device
7(socket: Operation not permitted)
8'
9ERRO[0000] failed to start remote sniffing, stopping wireshark  error="executing sniffer failed, exit code: '1'"
10INFO[0000] starting sniffer cleanup
11INFO[0000] sniffer cleanup completed successfully
12Error: signal: killed

こちらは、下記の Issue でも質問されていますが、私の場合は-pオプションをつけることで解決できました。

command: '[/tmp/static-tcpdump -i any -U -w - ]' executing successfully exitCode: '126' · Issue #72 · eldadru/ksniff

command: '[/tmp/static-tcpdump -i any -U -w - ]' executing successfully exitCode: '126' · Issue #72 · eldadru/ksniff

After running kubectl sniff <POD> -n <NAMESPACE> I get the following output with error: INFO[0000] sniffing method: upload static tcpdump INFO[0000] using tcpdump path at: '/Users/jason/.krew/store...

1kubectl sniff -p <POD_NAME>

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee