Create Docker Container with IPVLAN to Distinguish the Gateway from the Host [ID]
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 :
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 :
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.