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:

KomponenPeran
docker0Virtual bridge (seperti switch)
veth pairKabel virtual antara host dan container
iptablesImplementasi 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:

  1. Container mengirim request (misalnya curl google.com)
  2. Source IP: 172.17.0.2
  3. Docker melakukan MASQUERADE
  4. 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:

  1. User mengakses http://localhost:8080
  2. Request masuk ke host
  3. iptables melakukan DNAT
  4. 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:

  1. Isolasi jaringan Container tidak langsung terekspos ke jaringan luar

  2. Kemudahan penggunaan Tidak perlu routing manual

  3. Portabilitas Bekerja di laptop, VM, maupun server bare-metal

  4. 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 NetworkNAT?Catatan
bridgeDefault, pakai NAT
hostTanpa NAT, langsung pakai network host
overlay⚠️NAT tergantung implementasi
macvlanContainer punya IP langsung di LAN

NAT vs Host Network #

Perbandingan singkat:

AspekBridge (NAT)Host
IsolasiTinggiRendah
PerformaSedikit overheadMaksimal
KeamananLebih amanLebih berisiko
Port conflictTidakBisa terjadi

Best Practice #

  1. Gunakan bridge + NAT untuk local development
  2. Gunakan port mapping eksplisit, hindari expose berlebihan
  3. Untuk performa tinggi (misalnya reverse proxy), pertimbangkan --network host
  4. Untuk kebutuhan IP LAN langsung, gunakan macvlan
  5. 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.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact