Cara Mengedit File Hosts di Linux: Panduan Teknis Lengkap
File `/etc/hosts` di Linux adalah tabel pencarian statis yang memetakan nama host ke alamat IP, diproses oleh sistem operasi *sebelum* kueri DNS apa pun dikirim. Dengan menambahkan atau memodifikasi entri dalam file ini, Anda dapat mengganti resolusi DNS untuk domain tertentu pada basis per-mesin — tanpa menyentuh server DNS, router, atau pengaturan registrar Anda.
Mekanisme ini dikendalikan oleh Name Service Switch (NSS), dikonfigurasi di `/etc/nsswitch.conf`. Baris `hosts:` default biasanya berbunyi `files dns`, artinya sistem berkonsultasi dengan `/etc/hosts` terlebih dahulu, kemudian beralih ke resolver DNS yang didefinisikan di `/etc/resolv.conf`. Memahami urutan ini sangat penting: jika nama host ada di `/etc/hosts`, kueri DNS tidak pernah meninggalkan mesin.
Apa Itu File Hosts dan Cara Kerjanya
File `/etc/hosts` mendahului sistem DNS modern sepenuhnya. Pada era ARPANET awal, satu file `HOSTS.TXT` yang dikelola oleh Stanford Research Institute didistribusikan ke setiap mesin yang terhubung ke jaringan. `/etc/hosts` saat ini adalah keturunan langsung dari konsep tersebut — lapisan penggantian lokal yang otoritatif yang masih dihormati oleh setiap sistem operasi yang sesuai dengan POSIX.
Setiap baris non-komentar dalam file mengikuti sintaks ini:
“`
IP_address canonical_hostname [alias1] [alias2] …
“`
- Baris yang dimulai dengan `#` adalah komentar dan diabaikan.
- Spasi putih (spasi atau tab) memisahkan bidang.
- Satu alamat IP dapat dipetakan ke beberapa nama host pada baris yang sama.
- Entri IPv4 dan IPv6 dapat berdampingan dalam file yang sama.
File `/etc/hosts` default minimal pada instalasi Linux baru terlihat seperti ini:
“`
127.0.0.1 localhost
127.0.1.1 myhostname.local myhostname
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
“`
Entri `127.0.1.1` khusus untuk Debian/Ubuntu dan memetakan FQDN mesin ke alamat loopback ketika IP statis tidak ditetapkan. Menghapusnya dapat merusak alat seperti `sudo` yang bergantung pada resolusi nama host.
Mengapa Anda Perlu Mengedit File Hosts
Kasus penggunaan mencakup dari kenyamanan pengembang sederhana hingga tugas infrastruktur yang kritis terhadap keamanan:
Lingkungan pengembangan dan staging lokal
Arahkan domain produksi (misalnya, `myapp.com`) ke `127.0.0.1` atau IP LAN saat membangun atau menguji, tanpa memodifikasi catatan DNS langsung. Ini adalah kasus penggunaan paling umum bagi pengembang yang menjalankan lingkungan VPS Hosting secara lokal atau di server jarak jauh.
Pengujian aplikasi multi-server
Saat memigrasikan situs ke server baru, arahkan domain ke IP server baru hanya di mesin lokal Anda. Anda dapat memverifikasi bahwa lingkungan baru berfungsi penuh sebelum memperbarui catatan DNS publik — menghilangkan risiko downtime.
Memblokir domain berbahaya atau yang tidak diinginkan
Mengalihkan domain ke `0.0.0.0` (lebih disukai daripada `127.0.0.1` untuk pemblokiran) menyebabkan koneksi gagal segera tanpa menunggu koneksi yang ditolak di localhost. Proyek seperti `StevenBlack/hosts` mengumpulkan jutaan domain iklan, pelacak, dan malware ke dalam satu daftar blokir berformat hosts.
Jaringan container dan microservice
Di lingkungan Docker atau LXC tanpa resolver DNS khusus, entri `/etc/hosts` di dalam container (atau di host) menyediakan penemuan layanan yang ringan. Flag `–add-host` Docker menyuntikkan entri langsung ke `/etc/hosts` container saat runtime.
Mengganti split-horizon DNS
Di jaringan perusahaan di mana DNS internal dan eksternal mengembalikan catatan berbeda untuk nama host yang sama, entri file hosts memberi Anda kontrol deterministik pada mesin tertentu.
Pengujian validasi sertifikat SSL
Saat menguji deployment SSL Certificates baru di server staging, mengarahkan domain ke IP staging di `/etc/hosts` memungkinkan Anda memverifikasi handshake TLS penuh, rantai sertifikat, dan perilaku pengalihan HTTPS sebelum go-live.
Langkah demi Langkah: Cara Mengedit File Hosts di Linux
Langkah 1: Buka Terminal
Akses emulator terminal. Pada distribusi desktop, pintasan `Ctrl + Alt + T` berfungsi di GNOME, KDE, dan XFCE. Di server tanpa antarmuka grafis, Anda sudah berada dalam sesi shell melalui SSH.
Konfirmasi pengguna saat ini dan tingkat hak akses Anda:
“`bash
whoami
id
“`
Langkah 2: Buat Cadangan File Hosts Saat Ini
Selalu buat cadangan dengan cap waktu sebelum memodifikasi file sistem apa pun. `hosts.backup` generik dapat ditimpa secara tidak sengaja; cap waktu tidak ambigu:
“`bash
sudo cp /etc/hosts /etc/hosts.bak.$(date +%Y%m%d_%H%M%S)
“`
Verifikasi bahwa cadangan telah dibuat:
“`bash
ls -lh /etc/hosts*
“`
Langkah 3: Periksa Izin dan Kepemilikan File
Sebelum mengedit, konfirmasi kepemilikan dan izin file saat ini:
“`bash
ls -la /etc/hosts
“`
Output yang diharapkan:
“`
-rw-r–r– 1 root root 221 Jan 10 09:00 /etc/hosts
“`
File harus dimiliki oleh `root:root` dengan izin `644`. Jika izin berbeda, selidiki sebelum melanjutkan — `/etc/hosts` yang dapat ditulis oleh semua orang adalah kerentanan keamanan.
Langkah 4: Buka File Hosts dengan Editor Teks
Menggunakan nano (direkomendasikan untuk sebagian besar pengguna):
“`bash
sudo nano /etc/hosts
“`
Menggunakan vim:
“`bash
sudo vim /etc/hosts
“`
Menggunakan gedit (GUI, desktop GNOME):
“`bash
sudo gedit /etc/hosts
“`
Menggunakan tee untuk penambahan non-interaktif/terskrip (tidak memerlukan editor):
“`bash
echo "192.168.1.50 staging.myapp.com" | sudo tee -a /etc/hosts
“`
Flag `-a` menambahkan ke file daripada menimpanya. Ini adalah metode paling aman untuk skrip otomasi dan playbook Ansible.
Langkah 5: Tambah, Modifikasi, atau Hapus Entri
Navigasikan ke akhir file dan tambahkan entri Anda. Ikuti aturan pemformatan ini dengan ketat:
- Satu entri per baris.
- Alamat IP terlebih dahulu, kemudian satu atau lebih nama host yang dipisahkan oleh spasi putih.
- Gunakan `#` sebaris untuk memberi anotasi pada entri sebagai referensi di masa mendatang.
Alihkan domain ke server pengembangan lokal:
“`
127.0.0.1 myproject.local # Local dev – remove before production
“`
Arahkan domain ke server staging jarak jauh:
“`
203.0.113.45 staging.myapp.com # Staging server – pre-DNS cutover
“`
Blokir domain (metode yang disukai menggunakan 0.0.0.0):
“`
0.0.0.0 ads.example.com
0.0.0.0 tracker.analytics-provider.com
“`
Tambahkan entri IPv6:
“`
::1 ipv6-service.local
“`
Petakan beberapa alias ke satu IP (berguna untuk virtual host):
“`
127.0.0.1 app.local api.local static.local
“`
Langkah 6: Simpan dan Keluar dari Editor
Di nano:
- Simpan: `Ctrl + O`, kemudian `Enter` untuk mengonfirmasi nama file.
- Keluar: `Ctrl + X`.
Di vim:
- Kembali ke mode normal: `Esc`
- Simpan dan keluar: `:wq` kemudian `Enter`
- Keluar tanpa menyimpan: `:q!` kemudian `Enter`
Langkah 7: Verifikasi Isi File
Konfirmasi bahwa entri Anda telah ditulis dengan benar:
“`bash
cat /etc/hosts
“`
Untuk file hosts yang besar, gunakan `grep` untuk menemukan entri tertentu:
“`bash
grep "myproject.local" /etc/hosts
“`
Periksa kesalahan sintaks — entri dengan IP yang hilang atau alamat yang salah format akan diabaikan secara diam-diam oleh resolver:
“`bash
sudo python3 -c "
with open('/etc/hosts') as f:
for i, line in enumerate(f, 1):
line = line.strip()
if line and not line.startswith('#'):
parts = line.split()
if len(parts) < 2:
print(f'Line {i} may be malformed: {line}')
"
“`
Langkah 8: Flush Cache DNS
Perubahan pada `/etc/hosts` langsung berlaku untuk koneksi baru di sebagian besar sistem. Namun, jika sistem Anda menjalankan daemon caching DNS lokal, Anda harus mem-flush cache-nya untuk melihat perubahan.
systemd-resolved (Ubuntu 18.04+, sebagian besar distro modern):
“`bash
sudo systemd-resolve –flush-caches
sudo systemd-resolve –statistics # Verify cache was cleared
“`
nscd (Name Service Cache Daemon):
“`bash
sudo systemctl restart nscd
“`
dnsmasq:
“`bash
sudo systemctl restart dnsmasq
“`
NetworkManager dengan plugin dnsmasq:
“`bash
sudo systemctl restart NetworkManager
“`
Browser mempertahankan cache DNS mereka sendiri secara independen. Chrome dan Firefox menyimpan catatan DNS hingga 60 detik. Untuk menghapus cache DNS internal Chrome, navigasikan ke `chrome://net-internals/#dns` dan klik “Clear host cache.”
Langkah 9: Uji Resolusi
Gunakan `getent` daripada `ping` untuk pengujian rantai resolusi NSS yang lebih andal:
“`bash
getent hosts myproject.local
“`
`getent` mengkueri Name Service Switch sistem secara langsung, menghormati `/etc/nsswitch.conf`, dan akan menunjukkan kepada Anda persis apa yang diselesaikan oleh OS — bukan apa yang dikembalikan oleh server DNS. Ini adalah pengujian definitif.
Selain itu:
“`bash
ping -c 3 myproject.local
“`
“`bash
curl -v http://myproject.local
“`
Jika `getent` mengembalikan IP yang benar tetapi `ping` tidak, masalahnya terletak pada tumpukan jaringan atau firewall, bukan pada file hosts.
File Hosts vs. DNS: Kapan Menggunakan Masing-masing
| Kriteria | `/etc/hosts` | Server DNS |
|---|
| — | — | — |
|---|
| Cakupan | Hanya satu mesin | Seluruh jaringan atau global |
|---|
| Penundaan propagasi | Instan | Menit hingga 48 jam (bergantung pada TTL) |
|---|
| Memerlukan jaringan | Tidak | Ya (untuk DNS eksternal) |
|---|
| Skalabilitas | Buruk (manual, per-host) | Sangat baik (dikelola secara terpusat) |
|---|
| Mendukung wildcard | Tidak | Ya (misalnya, `*.example.com`) |
|---|
| Bertahan setelah reboot | Ya (file tetap ada) | Ya (dikelola server) |
|---|
| Jejak audit | Hanya melalui version control | Bergantung pada penyedia DNS |
|---|
| Terbaik untuk | Penggantian dev/test, pemblokiran | Infrastruktur produksi |
|---|
| Dukungan IPv6 | Ya | Ya |
|---|
| Ramah otomasi | Sedang (pengeditan file) | Tinggi (berbasis API) |
|---|
Untuk tim yang mengelola beberapa server — seperti armada Dedicated Servers — manajemen DNS terpusat selalu lebih unggul daripada mendistribusikan perubahan file hosts secara manual. File hosts adalah alat per-mesin, bukan alat infrastruktur.
Teknik Lanjutan dan Kasus Tepi
Menggunakan File Hosts dengan Virtual Host di Apache dan Nginx
Saat menjalankan beberapa situs web di satu server menggunakan virtual hosting, file hosts di *mesin klien* Anda harus mengarahkan domain ke IP server. Server web kemudian menggunakan header HTTP `Host:` untuk merutekan permintaan ke virtual host yang benar. Entri file hosts dan konfigurasi virtual host server harus menggunakan nama host yang sama.
Misalnya, jika Anda memiliki virtual host Apache yang dikonfigurasi untuk `myapp.local` di VPS dengan cPanel, tambahkan IP server ke file hosts lokal Anda:
“`
198.51.100.10 myapp.local
“`
Kemudian akses `http://myapp.local` di browser Anda. Apache membaca header `Host: myapp.local` dan menyajikan situs yang benar.
Melindungi File Hosts dari Modifikasi yang Tidak Sah
Malware sering menargetkan `/etc/hosts` untuk mengalihkan domain yang sah (misalnya, situs perbankan) ke server phishing. Gunakan `chattr` untuk membuat file tidak dapat diubah:
“`bash
sudo chattr +i /etc/hosts
“`
Ini mencegah modifikasi bahkan oleh root hingga flag immutable dihapus secara eksplisit:
“`bash
sudo chattr -i /etc/hosts # Remove immutability to edit
“`
Periksa atributnya:
“`bash
lsattr /etc/hosts
“`
Mengontrol Versi File Hosts Anda
Untuk tim atau lingkungan pengembangan yang kompleks, lacak perubahan `/etc/hosts` dengan Git:
“`bash
sudo cp /etc/hosts ~/dotfiles/hosts
cd ~/dotfiles && git add hosts && git commit -m "Add staging.myapp.com entry"
“`
Alat seperti etckeeper secara otomatis mengontrol versi seluruh direktori `/etc` menggunakan Git atau backend VCS lainnya, menyediakan jejak audit lengkap dari perubahan file sistem.
File Hosts di Docker dan Kubernetes
Di Docker, Anda dapat menyuntikkan entri file hosts saat container dimulai tanpa memodifikasi sistem host:
“`bash
docker run –add-host=myservice.local:192.168.1.100 myimage
“`
Di Kubernetes, `hostAliases` dalam spesifikasi Pod mencapai hasil yang sama:
“`yaml
spec:
hostAliases:
- ip: "192.168.1.100"
hostnames:
- "myservice.local"
“`
Pendekatan ini lebih disukai daripada memodifikasi `/etc/hosts` host saat bekerja di lingkungan yang dikontainerisasi.
Perdebatan Pemblokiran `0.0.0.0` vs. `127.0.0.1`
Kedua alamat digunakan untuk memblokir domain, tetapi berperilaku berbeda:
- `127.0.0.1`: Merutekan koneksi ke antarmuka loopback lokal. Jika tidak ada yang mendengarkan di port 80/443 secara lokal, koneksi ditolak — tetapi OS masih mencoba untuk membangunnya, menyebabkan penundaan singkat.
- `0.0.0.0`: Mewakili tujuan yang tidak valid di sebagian besar sistem. Koneksi gagal segera tanpa mencoba handshake TCP, menghasilkan pemuatan halaman yang lebih cepat saat memblokir sejumlah besar domain iklan/pelacak.
Untuk kasus penggunaan daftar blokir, `0.0.0.0` adalah pilihan yang secara teknis lebih unggul.
Kesalahan Umum dan Pemecahan Masalah
Perubahan tidak berlaku setelah pengeditan:
- Konfirmasi bahwa entri secara sintaksis benar (IP terlebih dahulu, kemudian nama host).
- Flush cache DNS lokal (lihat Langkah 8).
- Periksa `/etc/nsswitch.conf` — jika `dns` muncul sebelum `files` di baris `hosts:`, DNS dikueri terlebih dahulu dan file hosts dilewati untuk entri yang di-cache.
Kesalahan `sudo: unable to resolve host` setelah pengeditan:
- Anda kemungkinan menghapus atau merusak baris yang memetakan nama host mesin Anda ke `127.0.1.1` atau `127.0.0.1`. Pulihkan cadangan segera: `sudo cp /etc/hosts.bak.TIMESTAMP /etc/hosts`.
Entri diabaikan untuk aplikasi tertentu:
- Beberapa aplikasi (terutama yang menggunakan `getaddrinfo` dengan konfigurasi NSS khusus, atau yang memiliki resolver yang ditautkan secara statis) melewati `/etc/nsswitch.conf` sepenuhnya dan mengkueri DNS secara langsung. Ini umum terjadi pada biner Go yang dikompilasi dengan CGO dinonaktifkan. Verifikasi dengan `strace -e trace=network yourapp`.
File hosts berfungsi secara lokal tetapi tidak di container Docker:
- Jaringan container terisolasi. Container memiliki `/etc/hosts`-nya sendiri. Gunakan `–add-host` atau `hostAliases` seperti yang dijelaskan di atas.
Poin Teknis Utama: Daftar Periksa Keputusan
Sebelum mengedit `/etc/hosts`, jalankan daftar periksa ini:
- Pemeriksaan cakupan: Apakah perubahan ini hanya diperlukan pada satu mesin? Jika beberapa mesin membutuhkannya, gunakan DNS atau alat seperti Ansible untuk mendistribusikan perubahan.
- Cadangkan terlebih dahulu: Selalu buat cadangan dengan cap waktu (`hosts.bak.YYYYMMDD_HHMMSS`) sebelum pengeditan apa pun.
- Gunakan `0.0.0.0` untuk pemblokiran: Kegagalan lebih cepat, tidak ada overhead loopback.
- Flush cache yang tepat: Identifikasi apakah sistem Anda menggunakan `systemd-resolved`, `nscd`, atau `dnsmasq` sebelum me-restart layanan yang salah.
- Uji dengan `getent`: Lebih andal daripada `ping` untuk mengonfirmasi resolusi NSS.
- Lindungi file: Gunakan `chattr +i` pada sistem produksi atau yang sensitif terhadap keamanan.
- Dokumentasikan entri Anda: Tambahkan komentar sebaris (`# reason – added YYYY-MM-DD`) ke setiap entri non-default.
- Hapus entri sementara: Entri dev/test yang tertinggal di file hosts produksi adalah sumber umum bug perutean yang sulit didiagnosis.
Jika Anda mengelola alur kerja pengembangan di beberapa lingkungan, pertimbangkan untuk memasangkan manajemen file hosts lokal dengan pengaturan VPS Control Panels yang dikonfigurasi dengan benar untuk memusatkan manajemen virtual host dan mengurangi penyimpangan konfigurasi per-mesin.
Untuk proyek yang melibatkan Pendaftaran Domain dan peluncuran bertahap, file hosts tetap menjadi cara paling andal untuk melakukan pengujian end-to-end penuh dari konfigurasi server baru sebelum propagasi DNS selesai — memberi Anda jendela validasi tanpa risiko sebelum publik melihat perubahan apa pun.
FAQ
Apakah mengedit `/etc/hosts` memerlukan reboot sistem?
Tidak. Perubahan pada `/etc/hosts` langsung berlaku untuk koneksi baru. Jika Anda memiliki daemon caching DNS lokal (`systemd-resolved`, `nscd`, atau `dnsmasq`), Anda harus mem-flush cache-nya. Browser juga mempertahankan cache DNS independen yang mungkin perlu dihapus secara manual.
Mengapa entri file hosts saya berfungsi di terminal tetapi tidak di browser saya?
Browser menyimpan catatan DNS secara independen dari resolver OS. Chrome menyimpan catatan hingga 60 detik. Navigasikan ke `chrome://net-internals/#dns` dan hapus cache host, atau tunggu TTL habis.
Bisakah saya menggunakan wildcard di `/etc/hosts`?
Tidak. File `/etc/hosts` tidak mendukung entri wildcard. Setiap nama host harus dicantumkan secara eksplisit. Jika Anda memerlukan resolusi wildcard (misalnya, `*.local`), gunakan resolver DNS lokal seperti `dnsmasq` atau `unbound`.
Berapa jumlah maksimum entri di `/etc/hosts`?
Tidak ada batas yang dikodekan secara keras yang diberlakukan oleh kernel atau glibc. Namun, kinerja menurun dengan file yang sangat besar karena file diurai secara linear untuk setiap pencarian. File dengan puluhan ribu entri (umum dengan daftar pemblokiran iklan) dapat menambah latensi yang terukur pada resolusi nama host. Untuk daftar blokir yang besar, DNS sinkhole khusus seperti Pi-hole lebih efisien.
Apakah aman untuk menghapus entri default di `/etc/hosts`?
Tidak. Entri default (`127.0.0.1 localhost`, `::1 localhost`, dan pemetaan nama host mesin itu sendiri) diperlukan untuk operasi sistem yang benar. Menghapusnya dapat merusak `sudo`, koneksi soket lokal, dan aplikasi yang bergantung pada resolusi loopback. Hanya tambahkan atau modifikasi entri; jangan pernah menghapus default tanpa alasan yang spesifik dan dipahami dengan baik.
