Episode ini membawa HAProxy turun ke layer 4: mode TCP untuk memproxying protokol raw seperti database dan gRPC, perbedaan mendasar dibanding mode HTTP, serta inspeksi SNI dan TLS passthrough untuk routing tanpa membaca isi trafik.

Tidak semua layanan berbahasa HTTP. Database, Redis, memcached, dan banyak protokol legacy butuh proxy yang tidak ikut campur dengan isi byte. Untuk itu HAProxy punya mode TCP yang sangat mumpuni.
Episode 12 membedah mode TCP: apa bedanya dengan HTTP, cara memproxying layanan raw, dan bagaimana inspeksi SNI memungkinkan routing berbasis nama domain tanpa membuka data terenkripsi. Kemampuan ini membuat HAProxy melayani hampir semua protokol.
Perbandingan singkat yang harus diingat:
Keputusan utamanya sederhana: kalau kalian tidak perlu melihat isi protokol, pakai TCP. Lebih cepat dan lebih aman karena tidak menginterpretasi data.
Dalam mode TCP, fitur yang bergantung pada HTTP tidak tersedia:
http-request, use_backend berbasis path, atau rewrite header.src, bukan cookie.frontend redis_front
bind *:6379
mode tcp
default_backend redis_back
backend redis_back
balance leastconn
server redis1 10.0.0.21:6379 check
server redis2 10.0.0.22:6379 checkDirektif mode tcp di kedua section menandakan penerusan byte mentah. Health check TCP default hanya membuka koneksi dan menutupnya kembali.
Database adalah contoh paling umum. Klien aplikasi terhubung ke HAProxy, lalu koneksi diteruskan ke primary dan replica:
frontend pg_front
bind *:5432
mode tcp
default_backend pg_back
backend pg_back
balance source
option tcp-check
tcp-check connect
tcp-check send "select 1;\n"
tcp-check expect string "1"
server pg1 10.0.0.31:5432 check
server pg2 10.0.0.32:5432 checkoption tcp-check mengaktifkan health check berlapis TCP: HAProxy mengirim select 1; dan mengharapkan jawaban mengandung 1. Ini health check yang jauh lebih bermakna daripada sekadar koneksi terbuka.
Untuk Redis, gunakan leastconn agar koneksi yang dipegang lama tidak menumpuk di satu server:
backend redis_back
balance leastconn
option tcp-check
tcp-check connect
tcp-check send PING\r\n
tcp-check expect string +PONG
server redis1 10.0.0.41:6379 check
server redis2 10.0.0.42:6379 checktcp-check send PING\r\n dan tcp-check expect string +PONG memverifikasi bahwa Redis benar-benar merespons sebelum dianggap sehat.
Jika kalian tidak butuh routing berdasarkan service method, gRPC bisa diproxy murni di layer 4 dengan multiplexing HTTP/2 yang diteruskan apa adanya:
frontend grpc_front
bind *:8443
mode tcp
default_backend grpc_back
backend grpc_back
balance leastconn
server grpc1 10.0.0.51:8443 check
server grpc2 10.0.0.52:8443 checkMode TCP menjaga koneksi HTTP/2 tetap utuh dari klien ke server. Tidak ada buffer atau interpretasi yang bisa mengganggu stream.
TLS passthrough berarti HAProxy tidak memutus enkripsi: handshake TLS terjadi langsung antara klien dan backend. HAProxy hanya melihat bagian yang tidak terenkripsi, yaitu nama server di handshake (SNI).
Keuntungannya: kunci privat tidak pernah berada di HAProxy, dan trafik tetap dienkripsi end-to-end.
SNI di-inspeksi di mode TCP untuk memilih backend:
frontend tls_front
bind *:443
mode tcp
acl sni_db req.ssl_sni -i db.example.com
acl sni_app req.ssl_sni -i app.example.com
use_backend db_back if sni_db
use_backend app_back if sni_app
default_backend app_back
backend db_back
server db1 10.0.0.61:443 check
backend app_back
server app1 10.0.0.62:443 checkacl sni_db req.ssl_sni -i db.example.com mencocokkan nama server yang diminta klien. Pastikan frontend mengaktifkan parsing SNI dengan accept-proxy atau sekedar langsung di mode TCP, lalu use_backend db_back if sni_db mengarahkan trafik.
openssl s_client -connect localhost:443 -servername db.example.com \
</dev/null 2>/dev/null | openssl x509 -noout -subjectopenssl s_client -connect localhost:443 -servername db.example.com membuka handshake TLS dengan SNI tertentu. Jika routing benar, sertifikat yang keluar harus milik backend database.
Panduan praktisnya:
Banyak arsitektur mencampur keduanya: termination di edge untuk web, passthrough untuk layanan internal.
nc -zv localhost 6379nc -zv localhost 6379 menguji apakah port TCP terbuka. Jika koneksi berhasil, mode TCP bekerja; lalu uji protokolnya langsung lewat klien masing-masing.
Episode 12 membuka dunia layer 4: mode TCP untuk protokol raw, health check berbasis protokol dengan tcp-check, serta SNI dan TLS passthrough untuk routing yang aman dan efisien.
Inti yang harus dibawa pulang:
mode tcp meneruskan byte; mode http memahami isi protokol.option tcp-check untuk health check yang bermakna.balance leastconn untuk koneksi berumur panjang seperti Redis dan gRPC.req.ssl_sni memungkinkan routing berbasis nama domain tanpa membuka isi.Di episode 13 selanjutnya kita akan membahas high availability & clustering — setup active/passive dengan VRRP dan Keepalived, integrasi service discovery seperti Consul dan DNS, serta pengujian failover dan recovery.