EBPF DEBUGGING NETWORK LOCAL-DEVELOPMENT DEVOPS LINUX SYSTEM-PROGRAMMING TROUBLESHOOTING MICROSERVICES PERFORMANCE OBSERVABILITY DEVELOPER-EXPERIENCE CLI-TOOLS KERNEL TRACING LATENCY CONNECTIVITY BACKEND FRONTEND WEB-DEVELOPMENT PRACTICAL-GUIDE

eBPF untuk Debugging Jaringan Lokal: Mengintip Lalu Lintas Tanpa Proxy di Lingkungan Pengembangan Anda

⏱️ 10 menit baca
👨‍💻

eBPF untuk Debugging Jaringan Lokal: Mengintip Lalu Lintas Tanpa Proxy di Lingkungan Pengembangan Anda

1. Pendahuluan

Pernahkah Anda merasa frustrasi saat mencoba mendebug masalah jaringan di lingkungan pengembangan lokal? Aplikasi Anda tidak bisa terhubung ke database, microservice Anda gagal berkomunikasi satu sama lain, atau ada latensi misterius yang memperlambat semuanya. Seringkali, kita berakhir dengan menebak-nebak, mencoba berbagai kombinasi ping, curl, netstat, atau bahkan memasang proxy seperti mitmproxy yang terkadang justru menambah kompleksitas.

Di sinilah eBPF (extended Berkeley Packet Filter) hadir sebagai jurus rahasia baru Anda. eBPF bukan sekadar alat monitoring jaringan biasa; ia adalah sebuah superpower yang memungkinkan Anda menjalankan program kustom di dalam kernel Linux, memberikan visibilitas yang belum pernah ada sebelumnya ke dalam setiap aspek sistem, termasuk lalu lintas jaringan.

Artikel ini akan membawa Anda menyelami bagaimana eBPF dapat merevolusi cara Anda mendebug masalah jaringan di lingkungan pengembangan lokal. Kita akan melihat bagaimana eBPF memungkinkan Anda “mengintip” langsung ke dalam kernel, melacak panggilan sistem, menganalisis koneksi, dan mengukur latensi, semuanya tanpa perlu proxy atau tool yang mengganggu. Siap untuk mendapatkan wawasan mendalam tentang apa yang sebenarnya terjadi di balik layar jaringan aplikasi Anda? Mari kita mulai!

2. Mengapa eBPF untuk Debugging Jaringan Lokal?

Anda mungkin bertanya, “Bukankah sudah ada tcpdump atau Wireshark untuk menganalisis lalu lintas jaringan?” Tentu saja ada, dan mereka adalah alat yang hebat. Namun, eBPF menawarkan beberapa keunggulan signifikan, terutama dalam konteks debugging di lingkungan pengembangan:

Singkatnya, eBPF seperti memiliki “kacamata X-ray” yang memungkinkan Anda melihat langsung ke dalam mesin jaringan sistem operasi Anda, memberikan kejelasan yang tak tertandingi saat mendebug.

3. Prasyarat dan Setup Awal

Untuk memulai petualangan eBPF Anda, ada beberapa hal yang perlu disiapkan:

  1. Sistem Operasi Linux: eBPF adalah teknologi kernel Linux. Pastikan Anda menggunakan distribusi Linux modern (Ubuntu 18.04+, Fedora 30+, CentOS 8+). Versi kernel yang lebih baru (5.x ke atas) umumnya memiliki dukungan eBPF yang lebih baik.
  2. Akses Root: Program eBPF memerlukan hak akses root untuk dimuat dan dijalankan di kernel.
  3. Tool eBPF: Ada beberapa tool yang mempermudah interaksi dengan eBPF tanpa harus menulis kode C atau Rust untuk kernel. Yang paling populer adalah:
    • bpftrace: Ini adalah tool yang paling mudah digunakan untuk pemula. Anda bisa menulis skrip singkat mirip awk untuk melacak peristiwa kernel. Ini akan menjadi fokus utama kita.
    • BCC (BPF Compiler Collection): Kumpulan tool eBPF yang ditulis dalam Python dan C. Lebih powerful dan menyediakan banyak skrip siap pakai untuk berbagai kasus penggunaan.

Instalasi bpftrace (Contoh untuk Ubuntu/Debian)

# Update package list
sudo apt update

# Install bpftrace dan dependencies-nya
sudo apt install -y bpftrace build-essential linux-headers-$(uname -r)

Untuk distribusi lain, Anda bisa mencari panduan instalasi bpftrace spesifik untuk OS Anda. Pastikan juga debuginfo atau kernel-headers yang sesuai dengan versi kernel Anda terinstal agar bpftrace dapat berfungsi dengan baik.

Tips: Setelah instalasi, coba jalankan sudo bpftrace -l 'tracepoint:syscalls:*' untuk melihat daftar tracepoint syscall yang tersedia. Jika berhasil, artinya bpftrace Anda sudah siap digunakan!

4. Studi Kasus 1: Mengintip Koneksi TCP/UDP

Mari kita mulai dengan skenario paling dasar: melacak kapan sebuah proses mencoba membuat koneksi jaringan (TCP) atau mengirim/menerima data (UDP).

📌 Masalah: Aplikasi frontend saya tidak bisa mengambil data dari API backend lokal. Apakah koneksinya gagal terbentuk?

Dengan bpftrace, kita bisa melacak panggilan sistem connect (untuk TCP) atau sendto/recvfrom (untuk UDP).

sudo bpftrace -e 'tracepoint:syscalls:sys_enter_connect {
    printf("PID %d (%s) is connecting to ", pid, comm);
    if (args->addr->sa_family == AF_INET) {
        $ipv4 = (struct sockaddr_in *)args->addr;
        printf("IPv4: %d.%d.%d.%d:%d\n",
               ($ipv4->sin_addr.s_addr >> 0) & 0xff,
               ($ipv4->sin_addr.s_addr >> 8) & 0xff,
               ($ipv4->sin_addr.s_addr >> 16) & 0xff,
               ($ipv4->sin_addr.s_addr >> 24) & 0xff,
               ntohs($ipv4->sin_port));
    } else if (args->addr->sa_family == AF_INET6) {
        $ipv6 = (struct sockaddr_in6 *)args->addr;
        // Output IPv6 addresses is more complex, simplified for brevity
        printf("IPv6: [address]:%d\n", ntohs($ipv6->sin6_port));
    }
}
tracepoint:syscalls:sys_exit_connect /retval != 0/ {
    printf("PID %d (%s) connect failed with error %d\n", pid, comm, retval);
}'

Penjelasan:

Sekarang, jalankan skrip di terminal Anda dengan sudo bpftrace -e '...' dan kemudian coba jalankan aplikasi frontend Anda. Anda akan melihat output real-time tentang setiap upaya koneksi yang dibuat oleh aplikasi Anda, termasuk jika ada yang gagal. Ini jauh lebih informatif daripada sekadar “Network Error” di browser!

5. Studi Kasus 2: Menganalisis Latensi Jaringan

📌 Masalah: Aplikasi microservice saya terasa lambat saat berkomunikasi dengan layanan lain. Apakah ada latensi tinggi di jaringan lokal?

Mengukur latensi adalah salah satu kekuatan eBPF. Anda bisa mengukur waktu antara dua peristiwa kernel yang berbeda dengan presisi milidetik atau bahkan mikrodetik.

Salah satu tool BCC yang sangat berguna adalah tcplife. Tool ini melacak siklus hidup koneksi TCP, termasuk waktu koneksi, transfer data, dan durasi total.

# Jika Anda menginstal BCC tools (biasanya paket bcc-tools atau bcc)
sudo tcplife

Output tcplife akan terlihat seperti ini:

PID    COMM         LADDR             LPORT RADDR             RPORT TX_KB RX_KB MS
20345  node         127.0.0.1         34567 127.0.0.1         8080  0     0     0.11
20345  node         127.0.0.1         34568 127.0.0.1         8081  1     2     0.25

Dari sini, Anda bisa melihat MS (milidetik) yang menunjukkan durasi koneksi. Jika ada koneksi yang memiliki MS tinggi, itu bisa menjadi indikasi latensi.

Mengukur Latensi Kustom dengan bpftrace

Anda juga bisa membuat skrip bpftrace kustom untuk mengukur latensi lebih spesifik, misalnya, waktu antara connect dan accept (latensi handshake TCP).

sudo bpftrace -e '
BEGIN { printf("Tracing TCP connection latencies...\n"); }

tracepoint:syscalls:sys_enter_connect {
    @start[tid] = nsecs;
}

tracepoint:syscalls:sys_exit_connect /@start[tid]/ {
    $latency_ns = nsecs - @start[tid];
    printf("PID %d (%s) connected in %d us\n", pid, comm, $latency_ns / 1000);
    delete(@start[tid]);
}

tracepoint:syscalls:sys_enter_accept {
    @accept_start[tid] = nsecs;
}

tracepoint:syscalls:sys_exit_accept /@accept_start[tid]/ {
    $latency_ns = nsecs - @accept_start[tid];
    printf("PID %d (%s) accepted connection in %d us\n", pid, comm, $latency_ns / 1000);
    delete(@accept_start[tid]);
}'

Penjelasan:

💡 Ide: Anda bisa memperluas ini untuk melacak latensi antara send dan recv untuk mengukur waktu pulang-pergi (RTT) data aktual.

6. Studi Kasus 3: Memecahkan Masalah Konektivitas Microservices

📌 Masalah: Salah satu microservice saya tidak bisa dijangkau oleh layanan lain, meskipun konfigurasi IP dan port sudah benar. Apa yang terjadi?

Debugging konektivitas antar microservices bisa jadi rumit. eBPF dapat membantu melacak paket yang hilang atau ditolak di kernel.

Tool BCC seperti tcpdrop dapat menunjukkan mengapa paket TCP mungkin ditolak oleh kernel.

sudo tcpdrop

Outputnya bisa sangat detail, menunjukkan di mana di dalam tumpukan jaringan kernel paket itu ditolak dan mengapa. Ini sangat berharga untuk mendiagnosis masalah firewall (misalnya, iptables yang salah konfigurasi), masalah routing, atau bahkan bug kernel.

Melacak Retransmisi TCP dengan bpftrace

Retransmisi TCP yang tinggi seringkali menjadi indikator masalah jaringan atau beban berlebih. Anda bisa melacaknya dengan bpftrace:

sudo bpftrace -e 'kprobe:tcp_retransmit_skb {
    $sk = (struct sock *)arg0;
    printf("TCP Retransmit: PID %d (%s) from %s:%d to %s:%d\n",
           pid, comm, ntop($sk->__sk_common.skc_rcv_saddr), $sk->__sk_common.skc_num,
           ntop($sk->__sk_common.skc_daddr), $sk->__sk_common.skc_dport);
}'

Penjelasan:

Jika Anda melihat banyak retransmisi TCP, ini bisa menunjukkan:

Dengan informasi ini, Anda bisa menyempurnakan investigasi Anda, misalnya dengan memeriksa log aplikasi dari layanan yang kewalahan atau memeriksa konfigurasi jaringan host Anda.

Kesimpulan

eBPF adalah alat yang sangat powerful dan serbaguna yang dapat mengubah cara Anda mendebug masalah jaringan di lingkungan pengembangan lokal. Dengan kemampuannya untuk mengintip langsung ke dalam kernel, melacak panggilan sistem dengan presisi, dan mengukur metrik performa dengan overhead minimal, Anda bisa mendapatkan wawasan yang jauh lebih dalam daripada tool tradisional.

Meskipun kurva pembelajarannya mungkin sedikit curam di awal, investasi waktu untuk memahami dasar-dasar bpftrace akan sangat terbayar. Anda akan bisa:

Jadi, lain kali Anda menghadapi masalah jaringan yang membandel, jangan ragu untuk mengeluarkan “kacamata X-ray” eBPF Anda. Selamat mendebug!

🔗 Baca Juga