Mengaktifkan ipv6 Di Docker

Saya mempunyai sebuah ipv6-only VPS. Untuk mengakses internet (keluar VPS) yang mayoritas masih ipv4, saya menggunakan layanan NAT64 (https://nat64.xyz/). Yaitu sebuah DNS resolver seperti 1.1.1.1 atau 8.8.8.8 tetapi sekaligus berfungsi sebagai gateway ipv4.

Setup NAT64 sama seperti DNS64 atau resolver biasa. Cukup taruh alamat IP DNS server di /etc/resolv.conf

Semua berjalan asyik walau dengan ipv6, tetapi masalah terjadi ketika saya mencoba Docker di environment ipv6 ini.

Container yang dibuat tidak bisa akses internet. Cek ping google.com pun hasilnya:

  1. ping: bad address 'google.com' 

Lalu saya mencoba pentunjuk dokumentasi Docker untuk mengaktifkan ipv6 di https://docs.docker.com/config/daemon/ipv6/

Intinya Docker daemon (dockerd) harus di restart dengan opsi --ipv6 dan --fixed-cidr-v6 "2001:db8:1::/64". Atau edit /etc/docker/daemon.json

  1. { 
  2.   "ipv6": true, 
  3.   "fixed-cidr-v6": "2001:db8:1::/64" 
  4. } 

Lalu restart service docker. "systemctl restart docker". Tapi saya menggunakan Alpine Linux (openrc), jadi:

  1. rc-service docker restart 

Kemudian saya coba lagi ping dari dalam container dan problem masih sama. ping: bad address 'google.com'

Saya coba cek rule nat utk ipv6 dengan:

  1. ip6tables -t nat -L 

Hasilnya masih polosan, tidak ada rule apapun yang dibuat oleh Docker. Hmm...

  1. Chain PREROUTING (policy ACCEPT) 
  2. target     prot opt source               destination 
  3.  
  4. Chain INPUT (policy ACCEPT) 
  5. target     prot opt source               destination 
  6.  
  7. Chain OUTPUT (policy ACCEPT) 
  8. target     prot opt source               destination 
  9.  
  10. Chain POSTROUTING (policy ACCEPT) 
  11. target     prot opt source               destination 

Setelah googling nemu clue dari forum https://forums.docker.com/t/docker-user-chain-for-ip6tables/133961/7 Yang ternyata perlu menambahkan lagi opsi --experimental dan --ip6tables. Dan ini tidak/belum disebutkan di dokumentasi.

Jadi /etc/docker/daemon.json harusnya:

  1. { 
  2.   "ipv6": true, 
  3.   "fixed-cidr-v6": "2001:db8:1::/64", 
  4.   "experimental": true, 
  5.   "ip6tables": true 
  6. } 

Setelah mengubah konfig tersebut dan kembali melakukan restart service docker. Masalah internet di dalam docker container teratasi.

Ini juga ditandai dengan munculnya "MASQUERADE" di chain POSTROUTING jika dilakukan ip6tables -t nat -L hasilnya:

  1. Chain PREROUTING (policy ACCEPT) 
  2. target     prot opt source               destination 
  3. DOCKER     all      anywhere             anywhere             ADDRTYPE match dst-type LOCAL 
  4.  
  5. Chain INPUT (policy ACCEPT) 
  6. target     prot opt source               destination 
  7.  
  8. Chain OUTPUT (policy ACCEPT) 
  9. target     prot opt source               destination 
  10. DOCKER     all      anywhere            !localhost            ADDRTYPE match dst-type LOCAL 
  11.  
  12. Chain POSTROUTING (policy ACCEPT) 
  13. target     prot opt source               destination 
  14. MASQUERADE  all      2001:db8:1::/64      anywhere 
  15.  
  16. Chain DOCKER (2 references) 
  17. target     prot opt source               destination 
  18. RETURN     all      anywhere             anywhere 

#Linux #Docker

Semoga bermanfaat!