Cara menggunakan tcpdump di dalam OpenShift 4 Pod
Di suatu kasus kita terkadang ingin melihat network traffic activity di dalam sebuah pod tertentu, untuk melihat apakah ada activity yang bermasalah. Di sini penulis ingin berbagi cara bagaimana kita melakukan sniffing dan melihat network activity di dalam sebuah pod menggunakan tcpdump.
Hal pertama yang perlu kita lakukan adalah melihat node yang ada dalam OCP Cluster yang kita miliki
[root@bastion ~]# oc get nodes
NAME STATUS ROLES AGE VERSION
csworker-1.drc-kcln.ocp.hq.example.co.id Ready worker 69d v1.23.12+a57ef08
csworker-2.drc-kcln.ocp.hq.example.co.id Ready worker 69d v1.23.12+a57ef08
csworker-3.drc-kcln.ocp.hq.example.co.id Ready worker 69d v1.23.12+a57ef08
infra-1.drc-kcln.ocp.hq.example.co.id Ready infra,worker 69d v1.23.12+a57ef08
infra-2.drc-kcln.ocp.hq.example.co.id Ready infra,worker 69d v1.23.12+a57ef08
infra-3.drc-kcln.ocp.hq.example.co.id Ready infra,worker 69d v1.23.12+a57ef08
master-1.drc-kcln.ocp.hq.example.co.id Ready master 69d v1.23.12+a57ef08
master-2.drc-kcln.ocp.hq.example.co.id Ready master 69d v1.23.12+a57ef08
master-3.drc-kcln.ocp.hq.example.co.id Ready master 69d v1.23.12+a57ef08
odf-1.drc-kcln.ocp.hq.example.co.id Ready infra,worker 50d v1.23.12+a57ef08
odf-2.drc-kcln.ocp.hq.example.co.id Ready infra,worker 50d v1.23.12+a57ef08
odf-3.drc-kcln.ocp.hq.example.co.id Ready infra,worker 50d v1.23.12+a57ef08
worker-1.drc-kcln.ocp.hq.example.co.id Ready worker 69d v1.23.12+a57ef08
worker-2.drc-kcln.ocp.hq.example.co.id Ready worker 69d v1.23.12+a57ef08
Selanjutnya kita perlu melihat namespace yang kita buat
[root@bastion ~]# oc get ns | grep -vE openshift
NAME STATUS AGE
cp4i Active 7d17h
default Active 69d
ibm-common-services Active 7d17h
kube-node-lease Active 69d
kube-public Active 69d
kube-system Active 69d
mq-drc Active 7d15h
services Active 35d
Dari informasi node dan namespace kita perlu mencari tau pod mana yang akan kita targetkan
[root@bastion ~]# oc get pods -n mq-drc -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mq-drc-ibm-mq-0 1/1 Running 0 7d15h 10.128.8.199 worker-2.drc-kcln.ocp.hq.example.co.id <none> <none>
qm-swift-ibm-mq-0 1/1 Running 0 17h 10.128.13.124 infra-2.drc-kcln.ocp.hq.example.co.id <none> <none>
qm-swift-ibm-mq-1 1/1 Running 0 17h 10.128.14.85 infra-1.drc-kcln.ocp.hq.example.co.id <none> <none>
Di sini penulis akan melakukan sniffing pada pod mq-drc-ibm-mq-0
yang mana resource nya terdeploy pada node worker-2.drc-kcln.ocp.hq.example.co.id
dari situ kita akan melakukan debug ke node dimana pod tersebut di deploy.
Buka debug shell pada node yang kita targetkan
oc debug node/<node-name>
[root@bastion ~]# oc debug node/worker-2.drc-kcln.ocp.hq.example.co.id
Starting pod/worker-2drc-kclnocphqexamplecoid-debug ...
To use host binaries, run `chroot /host`
Pod IP: 192.168.177.12
If you don't see a command prompt, try pressing enter.
sh-4.4#
Jika kita menggunakan custom debug image, pastikan packagetcpdump
dan nsenter
tersedia.
NOTE: Kita tidak perlu menjalankan
chroot /host
dantoolbox
karena saat ini keduanya sudah di support oleh OpenShift. Commandoc debug node/<nodename>
menggunakan image yang hampir sama dengantoolbox
, yang mana sudah terdapat packagetcpdump
dannsenter
.
Sebelum nya kita perlu build beberapa environment variable yang menjadi requirement nsenter
, parameters yang kita perlukan antara lain : nama target pod dan target namespace.
Untuk environment variable yang akan kita set perlu di sesuaikan dengan versi OCP yang kita gunakan.
Untuk versi OCP 4.8 kebawah, ikuti steps berikut:
# NAME=<pod-name>
# NAMESPACE=<pod-namespace>
# pod_id=$(chroot /host crictl pods --namespace ${NAMESPACE} --name ${NAME} -q)
# pid=$(chroot /host bash -c "runc state $pod_id | jq .pid")
# nsenter_parameters="-n -t $pid"
Untuk versi OCP 4.9 keatas, ikuti steps berikut:
# NAME=<pod-name>
# NAMESPACE=<pod-namespace>
# pod_id=$(chroot /host crictl pods --namespace ${NAMESPACE} --name ${NAME} -q)
# ns_path="/host/$(chroot /host bash -c "crictl inspectp $pod_id | jq '.info.runtimeSpec.linux.namespaces[]|select(.type==\"network\").path' -r")"
# nsenter_parameters="--net=${ns_path}"
Sebagai contoh kita menggunakan parameter di versi 4.9 keatas. Set satu persatu variable nya, sesuai dengan urutan.
# NAME=mq-drc-ibm-mq-0
# NAMESPACE=mq-drc
# pod_id=$(chroot /host crictl pods --namespace ${NAMESPACE} --name ${NAME} -q)
# ns_path="/host/$(chroot /host bash -c "crictl inspectp $pod_id | jq '.info.runtimeSpec.linux.namespaces[]|select(.type==\"network\").path' -r")"
# nsenter_parameters="--net=${ns_path}"
Sebelum menjalankan tcpdump
command, kita perlu menentukan network interface yang akan kita sniffing. Kita bisa list semua interface yang berjalan menggunakan ip a
atau tcpdump -D
di dalam pod, silahkan gunakan command di bawah ini.
nsenter $nsenter_parameters -- chroot /host ip a
Atau bisa pakai yang ini
nsenter $nsenter_parameters -- tcpdump -D
Pilih salah satu, lalu tentukan interface mana yang akan digunakan. Sebagai contoh kita akan menggunakan eth0
sebagai target interface.
sh-4.4# nsenter $nsenter_parameters -- tcpdump -D
1.eth0 [Up, Running]
2.lo [Up, Running, Loopback]
3.any (Pseudo-device that captures on all interfaces) [Up, Running]
4.bluetooth-monitor (Bluetooth Linux Monitor) [none]
5.nflog (Linux netfilter log (NFLOG) interface) [none]
6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
7.usbmon0 (Raw USB traffic, all USB buses) [none]
# INTERFACE=eth0
Setelah kita menentukan interface name, jalankantcpdump
di dalam container network namespace menggunakan command di bawah. Pastikan value dari ${INTERFACE}
adalah interface yang relevant dan terdapat pada list interface di step sebelum nya, sedangkan untuk ${HOSTNAME}
kita tidak perlu set secara manual biarkan system yang melakukan nya. Kita juga bisa menambakan additional tcpdump
capture filters jika memang di perlukan, jika tidak ada silahkan hapus saja bagian ${TCPDUMP_EXTRA_PARAMS}
.
nsenter $nsenter_parameters -- tcpdump -nn -i ${INTERFACE} -w /host/tmp/${HOSTNAME}_$(date +\%d_%m_%Y-%H_%M_%S-%Z).pcap ${TCPDUMP_EXTRA_PARAMS}
Tekan ctrl+c
ketika di rasa sudah selesai capture traffic network nya, setelah itu coba list semua generated file(s) yang di buat oleh system:
ls /host/tmp/*.pcap
Untuk melihat informasi yang lebih terperinci dalam menggunakan tcpdump
command, bisa ke sini: How to capture network packets with tcpdump. Kalian juga bisa replace tcpdump
command dengan command yang lain, sesuai dengan keinginan, tp pastikan package nya terinstall.
Sebelum keluar dari debug container, copy file tcpdump (.pcap) yang sudah di generate:
Buka satu terminal lagi untuk melakukan copy file dari pod debug ke server yang bisa di akses secara leluasa.
[root@bastion ~]# oc get pods -o wide | grep debug
worker-2drc-kclnocphqexamplecoid-debug 1/1 Running 0 24s 192.168.177.12 worker-2.drc-kcln.ocp.hq.example.co.id <none> <none>
[root@bastion ~]# oc cp worker-2drc-kclnocphqexamplecoid-debug:/host/tmp/<filename>.pcap <filename>.pcap