Subnet Localhost Untuk Atasi Konflik Port

Prefix localhost atau ip nya yang berupa 127.0.0.1 itu adalah /8 atau bisa disebut sebagai subnet 255.0.0.0 dah gitu aja.

Kita bisa kembali ke dasar dalam pengaturan jaringan ipv4 pasti ada ip adress untuk alamat virtual, kemudian ada netmask atau subnet atau prefix untuk memisahkan setiap jaringan, layaknya dua gedung dengan divisi yang berbeda mereka bisa saja tersambung dan bisa saja tidak tergantung dari kebutuhan jaringan itu lah fungsi dari masking.

Kalau di pengaturan umum jaringan simple seperti modem wifi rumahan pasti dengan 192.168.x.x tapi prefixnya apa /24 atau 255.255.255.0 yang artinya ada 255 ip usable dan bisa di gunakan (belum termasuk pengurangan broadcast dan gateway), bagaimana dengan perangkat yang lebih dari 255? solusinya menaikan prefix seperti /23 atau /20, jika tidak solusi lain adalah routing dimana sudah berbeda bab.

Tapi kembali lagi inti pembahasan, pentingnya apa?

Berlatar belakang proyek yang berjalan bersamaan menggunakan port yang sama dan bentrok, sebenarnya solusi paling simpel adalah memisahkan port iya kan, dan itu adalah masalah terbesar saya dimana beda aplikasi tapi masih dalam satu mesin yang sama menggunakan port yang sama.

Saya terbiasa dengan menggunakan ip 127.0.0.1, kalau anda pakai localhost atau custum hostname we are not same. Becanda, biasanya untuk menjalankan sebuah proyek seperti laravel serve, atau npm run dev vue dan proyek node lainnya biasanya pasti mengarah ke ip 127.0.0.1.

Begitu juga dengan lingkungan docker, saya beberapa tahun menggunakan compose masalah utama adalah port, seperti menggunakan dua container php yang sama apakah satu container expose port 80 -> 8080 kemudian bagaimana dengan versi lain apakah ke 8081, ternyata ada service lain yang butuh expose 8080 juga dan begitu seterusnya, walaupun secara default docker akan mengeluarkan network bridge dengan ip 172.17.x.x dengan prefix /16 atau 255.255.0.0.

Yang jelas opsi lain yang tidak pernah saya dengar yaitu pemisahan ip, saya mungkin sudah pernah implementasi lama hanya saja keterbatasan dokumentasi menjadikan hal ini lupa dan kembali ke kebiasaan port, sebagai contoh tadi:

Saya menjalankan dua versi proyek laravel, pada server dev (php artisan serve) keduanya menggunakan port yang sama itu 8000, simpel saja tinggal tambahkan parameter --port=8001 saat menjalankan perintah artisan serve, tapi masalah tidak berhenti disitu, browser akan menganggap dua ip yang sama ini adalah satu host, salah satu contoh adalah cookies akan saling timpa (sebenarnya tinggal ubah nama cookies atau session) tapi apakah semudah itu? membuat unik setiap cookies? dan tetap mendefinisikan satu host? salah satu solusi dari teman kantor lama saya adalah tambahan ekstensi browser seperti multi session atau cookies, yang tidak pernah saya coba.

Sebenarnya dari pada nambah banyak tools pengembang, memisahkan port atau seperti solusi laragon dengan hostname yang berbeda, solusi saya adalah tinggal mengubah ip, mengingat 127.0.0.1 adalah subnet dari /8 atau 255.0.0.0 artinya 127.0.0.1 hanyalah ujung dari iceberg, yang sebenarnya bisa saja pakai 127.0.0.2, 127.0.2.255, bahkan sampai 127.255.255.254 (mengingat 127.255.255.255 adalah broadcast), jadi sebenarnya ada berapa ip yang bisa di gunakan? 2²⁴ - 2 atau sekitar 16.777.214 dan berapa limitasi atau maximal port? 0-65.535 itu pun banyak yang sudah digunakan.

Untuk membuktikan bisa atau tidaknya, cukup lakukan ping ke salah satu ip misal ping 127.255.255.254, ping 127.2.2.0 kalau ada reply atau 0% loss artinya bisa digunakan, dan itu lah mengapa di sebut sebagai loopback bagaimana ketika aplikasi mencari suatu alamat ip tapi paket jaringan belum sempat meninggalkan mesin.

Jadi dari pada menghafal port 8000, 8001, 3000, 4000, cukup gunakan port 80 dan bind ip yang mudah di ingat seperti 127.0.0.2, 127.0.0.4, 127.0.20.1, saya pun akan menjalankan proyek laravel dengan perintah --host=127.0.0.2 --port=80 atau --host=127.0.0.2 saja soalnya malas.

Walaupun saya masih belum paham kenapa tools pengembang lebih memilih cara pemisahan port, apakah ada beberapa perangkat yang mungkin memiliki limitasi seperti linux embedded, jadi harus binding langsung ke ip publik/private mesin dari pada host local 127.0.0.1.

Dari masalah ini pun membantu saya dalam melakukan klasifikasi reverse proxy dari container nginx menuju container php, mungkin hanya ada beberapa container tapi dengan jumlah subdomain yang ratusan sepertinya lumayan merepotkan, dari pada menuliskan dan menghafal masing-masing port yang sering lupa dan menimpulkan salah atau typo, akan lebih mudah jika mendefinisikan ip saja, mungkin akan saya bahas di artikel berikutnya.

Semoga Terbantu.

Refrensi:

Keyword:

  • Taukah anda prefix untuk localhost atau 127.0.0.1
  • Proyek web sama bentrok di port yang sama