NAT #
Saat pertama kali menggunakan Docker, banyak developer merasa “ajaib”: container bisa mengakses internet, bisa diakses dari host, padahal container punya IP sendiri yang berbeda dengan host. Di balik semua itu, ada satu konsep jaringan yang sangat penting dan sering luput dibahas secara mendalam, yaitu Network Address Translation (NAT).
Untuk mempermudah pemahaman, mari kita lihat gambaran sederhana bagaimana NAT bekerja di Docker.
+-------------------+ +-------------------+ +-------------+
| Container | | Docker Host | | Internet |
| 172.17.0.2:80 | -----> | 192.168.1.10 | -----> | |
| | | (iptables NAT) | | |
+-------------------+ +-------------------+ +-------------+
^ |
| |
+--------------------------+
Port Mapping (DNAT)
Host:8080 -> Container:80
Diagram di atas menunjukkan dua arah utama NAT di Docker:
- Outbound (SNAT/MASQUERADE): container keluar ke internet
- Inbound (DNAT/Port Mapping): request dari host atau luar masuk ke container
Artikel ini akan membahas konsep NAT, bagaimana Docker mengimplementasikannya, dan apa implikasinya dalam praktik sehari-hari.
Apa Itu NAT? #
Network Address Translation (NAT) adalah teknik di jaringan komputer untuk menerjemahkan satu alamat IP ke alamat IP lain. Biasanya NAT digunakan agar:
- Banyak device dengan IP private bisa mengakses internet menggunakan satu IP public
- Jaringan internal tetap tersembunyi dari jaringan luar
Dalam konteks Docker:
- Container menggunakan IP private
- Host bertindak sebagai router sekaligus NAT gateway
Arsitektur Network Docker #
Secara default, Docker membuat:
- Bridge network (
docker0) - Subnet private, biasanya
172.17.0.0/16 - Set aturan iptables otomatis
Komponen utamanya:
| Komponen | Peran |
|---|---|
| docker0 | Virtual bridge (seperti switch) |
| veth pair | Kabel virtual antara host dan container |
| iptables | Implementasi NAT dan firewall |
Jenis NAT di Docker #
Docker menggunakan iptables NAT table untuk dua kebutuhan utama.
SNAT / MASQUERADE (Outbound NAT) #
Digunakan saat container mengakses jaringan luar.
Alur:
- Container mengirim request (misalnya
curl google.com) - Source IP:
172.17.0.2 - Docker melakukan MASQUERADE
- Source IP diganti menjadi IP host (
192.168.1.10)
Contoh rule iptables (konseptual):
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
Maknanya:
- Semua traffic dari subnet container
- Keluar bukan lewat
docker0 - Akan di-NAT menggunakan IP host
Tanpa rule ini, container tidak bisa akses internet.
DNAT (Port Mapping / Inbound NAT) –> #
Digunakan saat kita menjalankan:
docker run -p 8080:80 nginx
Alur:
- User mengakses
http://localhost:8080 - Request masuk ke host
- iptables melakukan DNAT
- Traffic diteruskan ke
172.17.0.2:80
Contoh rule DNAT (konseptual):
-A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
Inilah alasan mengapa:
- Container tidak perlu IP public
- Kita tetap bisa expose service keluar
Mengapa Docker Menggunakan NAT? #
Docker memilih NAT karena:
Isolasi jaringan Container tidak langsung terekspos ke jaringan luar
Kemudahan penggunaan Tidak perlu routing manual
Portabilitas Bekerja di laptop, VM, maupun server bare-metal
Keamanan default Service tidak otomatis terbuka ke publik
Dampak NAT dalam Praktik #
Kelebihan #
- Mudah digunakan
- Aman secara default
- Cocok untuk local development
Kekurangan #
- Overhead tambahan (walau kecil)
- Sulit melakukan service discovery berbasis IP
- Debugging jaringan lebih kompleks
Karena itu, untuk kebutuhan tertentu, Docker menyediakan alternatif:
| Mode Network | NAT? | Catatan |
|---|---|---|
| bridge | ✅ | Default, pakai NAT |
| host | ❌ | Tanpa NAT, langsung pakai network host |
| overlay | ⚠️ | NAT tergantung implementasi |
| macvlan | ❌ | Container punya IP langsung di LAN |
NAT vs Host Network #
Perbandingan singkat:
| Aspek | Bridge (NAT) | Host |
|---|---|---|
| Isolasi | Tinggi | Rendah |
| Performa | Sedikit overhead | Maksimal |
| Keamanan | Lebih aman | Lebih berisiko |
| Port conflict | Tidak | Bisa terjadi |
Best Practice #
- Gunakan bridge + NAT untuk local development
- Gunakan port mapping eksplisit, hindari expose berlebihan
- Untuk performa tinggi (misalnya reverse proxy), pertimbangkan
--network host - Untuk kebutuhan IP LAN langsung, gunakan
macvlan - Jangan mengandalkan IP container, gunakan service name / DNS Docker
Penutup #
NAT adalah fondasi tersembunyi yang membuat Docker terasa “sederhana” digunakan. Dengan memahami bagaimana SNAT dan DNAT bekerja di balik layar, kita bisa:
- Debug masalah jaringan dengan lebih cepat
- Memilih mode network yang tepat
- Mendesain arsitektur container yang lebih aman dan efisien
Memahami NAT di Docker bukan hanya soal networking, tapi soal kontrol dan kejelasan atas bagaimana aplikasi kita benar-benar berjalan di level sistem operasi.