TCPdump eines einzelnen Kubernetes Pods / Docker Containers erstellen

Manchmal ist es nötig die Netzwerkverbindung von nur genau einem Pod oder Container zu beobachten und zu analysieren. In der Regel laufen aber auf dem Host des Containers eine Vielzahl von Containern. Wie bekommt man nun den einzelnen Container seinem virtuellem Interface auf dem Host zugeordnet. Hier nur eine kleine Anleitung wie dies in den meisten Fällen möglich sein sollte. Gezeigt wird das ganze an Kubernetes.

Zuerst muss geprüft werden, mit welchem ifindex des Hosts, der Container, bzw. dessen zu prüfenden Interfaces verbunden sind. Konkret sieht das wie folgt aus. Wir lassen uns alle Interfaces des Containers anzeigen:

tecbauer@XELO:~$ kubectl exec -i pod-52ds-lfbxv -- ifconfig -a
eth0      Link encap:Ethernet  HWaddr B2:F2:50:32:70:1B  
          inet addr:100.96.5.50  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:518 errors:0 dropped:0 overruns:0 frame:0
          TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:765979 (748.0 KiB)  TX bytes:7462 (7.2 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:156923 errors:0 dropped:0 overruns:0 frame:0
          TX packets:156923 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:71332776 (68.0 MiB)  TX bytes:71332776 (68.0 MiB)

bzw. mit:

tecbauer@XELO:~$ kubectl exec -i pod-52ds-lfbxv -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if53: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 9001 qdisc noqueue state UP 
    link/ether b2:f2:50:32:70:1b brd ff:ff:ff:ff:ff:ff
    inet 100.96.5.50/24 scope global eth0
       valid_lft forever preferred_lft forever

Nun suchen wir das zu Überwachende Interface, in userem fall eth0. Hier fällt uns folgendes auf, das Interface heißt eth0@if53. Dieses if53 bedeutet, das Interface eth0 ist mit dem Hostinterface mit dem ifindex 53 verbunden. Wenn wir nur ifconfig zur Verfügung haben können wir das wie folgt herausfinden:

tecbauer@XELO:~$ kubectl exec -i pod-52ds-lfbxv -- cat /sys/class/net/eth0/iflink
53

Nun wissen wir, mit welchem Interface (kann auch virtuell) des Hosts der Container verbunden ist. Um herauszufinden wie dieses Interface heißt müssen wir uns per SSH mit dem entsprechendem Host des Containers verbinden. Hier führen wir dann folgende Kommando aus:

root@host:/home/admin# grep -r "53" /sys/class/net/*/ifindex
/sys/class/net/veth740b54a8/ifindex:53

Wir sehen nun, dass das Interface mit dem Index 53 veth740b54a8 heißt. Nun sind wir in der Lage mit tcpdump mitzuschneiden:

root@host: tcpdump -i veth740b54a8 -w record.pcap

Die entstandene Datei record.pcap können wir nun mit Wireshark analysieren.

Schreibe eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Bitte akzeptieren sie die Datenschutzbestimmungen.