Create Docker Container with IPVLAN to Distinguish the Gateway from the Host [ID]

Gilang Virga Perdana
3 min readFeb 20, 2023
Membuat Docker Container yang berjalan diatas Ubuntu VM di Openstack dengan mode IPVLAN untuk terkoneksi dengan gateway WAN yang berbeda dengan bantuan Policy Based Routing pada Mikrotik

Terkadang yang dinamakan kebutuhan tak luput dari kebutuhan akan kreativitas, pada case yang pernah saya jumpai cluster Openstack sejatinya memiliki 1 ISP namun dipecah menjadi dua WAN yang satu melewati suatu Host Ubuntu Server (yang menjadi default route link) yang satu lainnya langsung direct ke ISP (menjadi failover link). Namun karena satu-dua alasan kita membutuhkan koneksi langsung ke link failover (yang mana itu membutuhkan Gateway yang berbeda).

Umumnya masalah seperti ini bisa di selesaikan dengan menggunakan suatu VM namun pada case ini kami membutuhkan efisiensi dalam resource jadi kami putuskan untuk menggunakan suatu container saja untuk menjalankan beberapa script monitoring (namun tidak akan dijelaskan disini). Oke langsung saja kita cek topologi, goals nya seperti gambar berikut :

Topology Goals

Goals

  • Docker Container yang berjalan diatas VM Openstack memiliki Gateway langsung ke ether3 Mikrotik
  • Docker Container tidak boleh membuat IP pool baru, harus mengikuti IP Pool dari Instance Pool existing yakni 172.20.0.0/16
  • VM yang mengangkut Docker Container ybs (VM2) harus tetap menggunakan default gateway ether8 Mikrotik

Prerequisites

  • Openstack Cluster
  • Mikrotik
  • Ubuntu Server 20.04 LTS
  • Docker

Konfigurasi Networking Docker & Mikrotik

Mengacu pada goals point 2, opsi IPVLAN mode L3 pada Docker Network sudah gugur karena kita tidak diperbolehkan membuat IP pool baru. Maka dari itu keputusan saat itu memilih IPVLAN mode L2 dengan tujuan Kontainer memiliki IP independent pada pool 172.20.0.0/16.

Membuat IPVLAN L2 pada Docker :

docker network create -d ipvlan \
--subnet 172.20.0.0/16 \
--gateway 172.20.0.1 \
-o parent=ens3 \
WAN4PBR

Terlihat disini kita mendefinisikan subnet & gateway sesuai IP Pool Instance yakni 172.20.0.0/16 dengan nama Docker Network WAN4PBR . Setelah Docker Network siap digunakan, kami menentukan IP untuk Docker Container yakin 172.20.1.194 . Penentuan IP ini digunakan untuk membuat rules pada Mikrotik untuk penggunaan Policy Based Routing.

Membuat Rules pada Mikrotik :

# Create list for IP wishlist
/ip firewall address-list
add list=special-clients address=172.20.1.194

# Create mange for specify routing to IP wishlist on special-clients list
/ip firewall mangle
add chain=prerouting src-address-list=special-clients action=mark-routing new-routing-mark=special-routing

# Create route for special-routing routing mark
/ip route
add dst-address=0.0.0.0/0 gateway=10.20.0.1 routing-mark=special-routing

# Default route `to 192.168.69.1` of all client except `172.20.1.194`
/ip route
add dst-address=0.0.0.0/0 gateway=192.168.69.1

Pada rules diatas berarti semua paket dari/untuk 172.20.1.194 otomatis langsung akan diarahkan ke 10.20.0.1 dimana 10.20.0.1 akan langsung mengarah ke ether3 karena ether8 memiliki default gateway 192.168.69.1 .

Membuat Container dengan tipe network IPVLAN

docker run -d --restart always --network WAN2PBR --ip 172.20.1.194 --name containerwanether3 $DOCKER_IMAGE

Verifikasi Gateway

Setelah kontainer running, kita akan coba traceroute ke suatu endpoint untuk melihat rute gateway.

traceroute google.com

Dalam kasus ini, kita akan mencoba membandingkan antara VM yang mengangkut kontainer (VM2) dengan kontainer itu sendiri. Goalsnya adalah VM2 akan memiliki rute gateway 192.168.69.1 sedangkan untuk kontainer tidak akan ada rute gateway 192.168.69.1 . Berikut hasilnya :

Gateway Check from Container & VM

Terlihat dari hasil traceroute yang diberikan, Gambar atas adalah kontainer IPVLAN dan Gambar bawah adalah VM2. Bisa disimpulkan bahwa kontainer tidak melewati 192.168.69.1 sedangkan VM2 melewati 192.168.69.1 yang notabene dalam satu interface & environment yang sama.

Demikian hasil case yang pernah saya hadapi, saya akan terus update hasil case-case saya pada laman-laman saya khususnya pada GitHub untuk versi markdown-nya.

Terima kasih, semoga bermanfaat.

--

--