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.