Як редагувати файл Hosts у Linux: повний технічний посібник
Файл `/etc/hosts` у Linux — це статична таблиця пошуку, яка зіставляє імена хостів з IP-адресами і обробляється операційною системою *до* надсилання будь-якого DNS-запиту. Додаючи або змінюючи записи в цьому файлі, ви можете перевизначити DNS-розпізнавання для конкретних доменів на окремій машині — не торкаючись DNS-сервера, маршрутизатора або налаштувань реєстратора.
Цим механізмом керує Name Service Switch (NSS), налаштований у `/etc/nsswitch.conf`. Стандартний рядок `hosts:` зазвичай має вигляд `files dns`, тобто система спочатку звертається до `/etc/hosts`, а потім переходить до DNS-резолверів, визначених у `/etc/resolv.conf`. Розуміння цього порядку є критично важливим: якщо ім’я хоста існує в `/etc/hosts`, DNS-запит ніколи не покидає машину.
Що таке файл hosts і як він працює
Файл `/etc/hosts` з’явився ще до сучасної системи DNS. У ранню епоху ARPANET єдиний файл `HOSTS.TXT`, який підтримував Стенфордський дослідницький інститут, розповсюджувався на кожну підключену до мережі машину. Сучасний `/etc/hosts` є прямим нащадком цієї концепції — локальний авторитетний шар перевизначення, який досі підтримується кожною POSIX-сумісною операційною системою.
Кожен рядок файлу, що не є коментарем, має такий синтаксис:
“`
IP_address canonical_hostname [alias1] [alias2] …
“`
- Рядки, що починаються з `#`, є коментарями і ігноруються.
- Поля розділяються пробілами або табуляцією.
- Одна IP-адреса може зіставлятися з кількома іменами хостів в одному рядку.
- Записи IPv4 та IPv6 співіснують в одному файлі.
Мінімальний стандартний `/etc/hosts` на щойно встановленому Linux виглядає так:
“`
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
“`
Запис `127.0.1.1` є специфічним для Debian/Ubuntu і зіставляє FQDN машини з адресою зворотного зв’язку, коли статична IP-адреса не призначена. Його видалення може порушити роботу таких інструментів, як `sudo`, які покладаються на розпізнавання імен хостів.
Навіщо редагувати файл hosts
Випадки використання охоплюють діапазон від простої зручності для розробників до критично важливих завдань безпеки інфраструктури:
Локальні середовища розробки та тестування
Спрямуйте виробничий домен (наприклад, `myapp.com`) на `127.0.0.1` або LAN IP під час розробки чи тестування, не змінюючи живі DNS-записи. Це найпоширеніший випадок використання для розробників, які запускають середовище VPS Hosting локально або на віддаленому сервері.
Тестування багатосерверних застосунків
При міграції сайту на новий сервер спрямуйте домен на IP нового сервера лише на своїй локальній машині. Ви можете переконатися, що нове середовище повністю функціонує, перш ніж оновлювати публічний DNS-запис — усуваючи ризик простою.
Блокування шкідливих або небажаних доменів
Перенаправлення домену на `0.0.0.0` (переважно над `127.0.0.1` для блокування) призводить до негайного збою з’єднання без очікування відхиленого з’єднання на localhost. Такі проєкти, як `StevenBlack/hosts`, агрегують мільйони доменів реклами, трекерів і шкідливого програмного забезпечення в єдиний блок-список у форматі hosts.
Мережа контейнерів і мікросервісів
У середовищах Docker або LXC без власного DNS-резолвера записи `/etc/hosts` всередині контейнерів (або на хості) забезпечують легке виявлення сервісів. Прапорець `–add-host` Docker вставляє записи безпосередньо в `/etc/hosts` контейнера під час виконання.
Перевизначення split-horizon DNS
У корпоративних мережах, де внутрішній і зовнішній DNS повертають різні записи для одного імені хоста, запис у файлі hosts дає вам детерміноване управління на конкретній машині.
Тестування перевірки SSL-сертифікатів
При тестуванні нового розгортання SSL Certificates на тестовому сервері, спрямування домену на тестовий IP у `/etc/hosts` дозволяє перевірити повне TLS-рукостискання, ланцюжок сертифікатів і поведінку перенаправлення HTTPS до запуску.
Покрокова інструкція: як редагувати файл hosts у Linux
Крок 1: Відкрийте термінал
Відкрийте емулятор терміналу. На десктопних дистрибутивах комбінація `Ctrl + Alt + T` працює в GNOME, KDE та XFCE. На безголовому сервері ви вже перебуваєте в сеансі оболонки через SSH.
Підтвердіть поточного користувача та рівень привілеїв:
“`bash
whoami
id
“`
Крок 2: Створіть резервну копію поточного файлу hosts
Завжди створюйте резервну копію з міткою часу перед зміною будь-якого системного файлу. Загальна назва `hosts.backup` може бути випадково перезаписана; мітка часу є однозначною:
“`bash
sudo cp /etc/hosts /etc/hosts.bak.$(date +%Y%m%d_%H%M%S)
“`
Перевірте, що резервну копію створено:
“`bash
ls -lh /etc/hosts*
“`
Крок 3: Перевірте права доступу та власника файлу
Перед редагуванням підтвердіть поточного власника та права доступу до файлу:
“`bash
ls -la /etc/hosts
“`
Очікуваний результат:
“`
-rw-r–r– 1 root root 221 Jan 10 09:00 /etc/hosts
“`
Файл має належати `root:root` з правами `644`. Якщо права відрізняються, розберіться з цим перед продовженням — `/etc/hosts` з доступом на запис для всіх є вразливістю безпеки.
Крок 4: Відкрийте файл hosts у текстовому редакторі
Використання nano (рекомендовано для більшості користувачів):
“`bash
sudo nano /etc/hosts
“`
Використання vim:
“`bash
sudo vim /etc/hosts
“`
Використання gedit (GUI, робочий стіл GNOME):
“`bash
sudo gedit /etc/hosts
“`
Використання tee для неінтерактивного/скриптового додавання (редактор не потрібен):
“`bash
echo "192.168.1.50 staging.myapp.com" | sudo tee -a /etc/hosts
“`
Прапорець `-a` додає вміст до файлу, а не перезаписує його. Це найбезпечніший метод для скриптів автоматизації та плейбуків Ansible.
Крок 5: Додайте, змініть або видаліть записи
Перейдіть до кінця файлу та додайте свої записи. Суворо дотримуйтесь цих правил форматування:
- Один запис на рядок.
- Спочатку IP-адреса, потім одне або кілька імен хостів, розділених пробілами.
- Використовуйте `#` вбудовано для анотування записів для майбутнього використання.
Перенаправлення домену на локальний сервер розробки:
“`
127.0.0.1 myproject.local # Local dev – remove before production
“`
Спрямування домену на віддалений тестовий сервер:
“`
203.0.113.45 staging.myapp.com # Staging server – pre-DNS cutover
“`
Блокування домену (переважний метод з використанням 0.0.0.0):
“`
0.0.0.0 ads.example.com
0.0.0.0 tracker.analytics-provider.com
“`
Додавання запису IPv6:
“`
::1 ipv6-service.local
“`
Зіставлення кількох псевдонімів з одним IP (корисно для віртуальних хостів):
“`
127.0.0.1 app.local api.local static.local
“`
Крок 6: Збережіть файл і вийдіть з редактора
У nano:
- Зберегти: `Ctrl + O`, потім `Enter` для підтвердження імені файлу.
- Вийти: `Ctrl + X`.
У vim:
- Повернутися до нормального режиму: `Esc`
- Зберегти та вийти: `:wq` потім `Enter`
- Вийти без збереження: `:q!` потім `Enter`
Крок 7: Перевірте вміст файлу
Підтвердіть, що ваші записи були записані правильно:
“`bash
cat /etc/hosts
“`
Для великих файлів hosts використовуйте `grep` для пошуку конкретних записів:
“`bash
grep "myproject.local" /etc/hosts
“`
Перевірте синтаксичні помилки — запис з відсутньою IP-адресою або неправильно сформованою адресою буде мовчки проігнорований резолвером:
“`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}')
"
“`
Крок 8: Очистіть кеш DNS
Зміни в `/etc/hosts` набувають чинності негайно для нових з’єднань на більшості систем. Однак якщо ваша система запускає локальний демон кешування DNS, вам потрібно очистити його кеш, щоб побачити зміни.
systemd-resolved (Ubuntu 18.04+, більшість сучасних дистрибутивів):
“`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 з плагіном dnsmasq:
“`bash
sudo systemctl restart NetworkManager
“`
Браузери підтримують власний кеш DNS незалежно. Chrome і Firefox кешують DNS-записи до 60 секунд. Щоб очистити внутрішній кеш DNS Chrome, перейдіть до `chrome://net-internals/#dns` і натисніть «Clear host cache».
Крок 9: Перевірте розпізнавання
Використовуйте `getent` замість `ping` для більш надійного тестування ланцюжка розпізнавання NSS:
“`bash
getent hosts myproject.local
“`
`getent` запитує Name Service Switch системи безпосередньо, враховуючи `/etc/nsswitch.conf`, і покаже вам саме те, що розпізнає ОС — а не те, що повертає DNS-сервер. Це остаточний тест.
Додатково:
“`bash
ping -c 3 myproject.local
“`
“`bash
curl -v http://myproject.local
“`
Якщо `getent` повертає правильний IP, а `ping` — ні, проблема полягає в мережевому стеку або брандмауері, а не у файлі hosts.
Файл hosts проти DNS: коли використовувати кожен
| Критерій | `/etc/hosts` | DNS-сервер |
|---|
| — | — | — |
|---|
| Область дії | Лише одна машина | Мережевий або глобальний рівень |
|---|
| Затримка поширення | Миттєво | Від кількох хвилин до 48 годин (залежить від TTL) |
|---|
| Потребує мережі | Ні | Так (для зовнішнього DNS) |
|---|
| Масштабованість | Погана (вручну, для кожного хоста) | Відмінна (централізоване управління) |
|---|
| Підтримує символи підстановки | Ні | Так (наприклад, `*.example.com`) |
|---|
| Зберігається після перезавантаження | Так (файл зберігається) | Так (керується сервером) |
|---|
| Журнал аудиту | Лише через систему контролю версій | Залежить від DNS-провайдера |
|---|
| Найкраще для | Перевизначення для розробки/тестування, блокування | Виробнича інфраструктура |
|---|
| Підтримка IPv6 | Так | Так |
|---|
| Зручність автоматизації | Помірна (редагування файлів) | Висока (керується через API) |
|---|
Для команд, які керують кількома серверами — наприклад, парком Dedicated Servers — централізоване управління DNS завжди переважає над ручним розповсюдженням змін файлу hosts. Файл hosts є інструментом для окремої машини, а не інструментом інфраструктури.
Розширені техніки та граничні випадки
Використання файлу hosts з віртуальними хостами в Apache та Nginx
При запуску кількох веб-сайтів на одному сервері з використанням віртуального хостингу файл hosts на вашій *клієнтській машині* повинен спрямовувати домен на IP сервера. Веб-сервер потім використовує HTTP-заголовок `Host:` для маршрутизації запиту до правильного віртуального хоста. Запис у файлі hosts і конфігурація віртуального хоста сервера повинні використовувати однакове ім’я хоста.
Наприклад, якщо у вас є віртуальний хост Apache, налаштований для `myapp.local` на VPS з cPanel, додайте IP сервера до вашого локального файлу hosts:
“`
198.51.100.10 myapp.local
“`
Потім відкрийте `http://myapp.local` у браузері. Apache зчитує заголовок `Host: myapp.local` і обслуговує правильний сайт.
Захист файлу hosts від несанкціонованих змін
Шкідливе програмне забезпечення часто атакує `/etc/hosts` для перенаправлення легітимних доменів (наприклад, банківських сайтів) на фішингові сервери. Використовуйте `chattr`, щоб зробити файл незмінним:
“`bash
sudo chattr +i /etc/hosts
“`
Це запобігає змінам навіть з боку root, доки прапорець незмінності не буде явно знятий:
“`bash
sudo chattr -i /etc/hosts # Remove immutability to edit
“`
Перевірте атрибут:
“`bash
lsattr /etc/hosts
“`
Контроль версій файлу hosts
Для команд або складних середовищ розробки відстежуйте зміни `/etc/hosts` за допомогою Git:
“`bash
sudo cp /etc/hosts ~/dotfiles/hosts
cd ~/dotfiles && git add hosts && git commit -m "Add staging.myapp.com entry"
“`
Такі інструменти, як etckeeper, автоматично контролюють версії всього каталогу `/etc` за допомогою Git або інших бекендів VCS, забезпечуючи повний журнал аудиту змін системних файлів.
Файл hosts у Docker та Kubernetes
У Docker ви можете вставляти записи файлу hosts під час запуску контейнера без зміни хост-системи:
“`bash
docker run –add-host=myservice.local:192.168.1.100 myimage
“`
У Kubernetes `hostAliases` у специфікації Pod досягає того самого результату:
“`yaml
spec:
hostAliases:
- ip: "192.168.1.100"
hostnames:
- "myservice.local"
“`
Ці підходи є кращими, ніж зміна `/etc/hosts` хоста при роботі в контейнеризованих середовищах.
Дискусія про блокування `0.0.0.0` проти `127.0.0.1`
Обидві адреси використовуються для блокування доменів, але вони поводяться по-різному:
- `127.0.0.1`: Спрямовує з’єднання на локальний інтерфейс зворотного зв’язку. Якщо нічого не прослуховує порт 80/443 локально, з’єднання відхиляється — але ОС все одно намагається його встановити, що спричиняє коротку затримку.
- `0.0.0.0`: Представляє недійсне призначення на більшості систем. З’єднання завершується невдачею негайно без спроби TCP-рукостискання, що призводить до швидшого завантаження сторінок при блокуванні великої кількості доменів реклами/трекерів.
Для випадків використання блок-списків `0.0.0.0` є технічно кращим вибором.
Поширені помилки та усунення несправностей
Зміни не набувають чинності після редагування:
- Переконайтеся, що запис синтаксично правильний (спочатку IP, потім ім’я хоста).
- Очистіть локальний кеш DNS (див. Крок 8).
- Перевірте `/etc/nsswitch.conf` — якщо `dns` з’являється перед `files` у рядку `hosts:`, DNS запитується першим і файл hosts обходиться для кешованих записів.
Помилка `sudo: unable to resolve host` після редагування:
- Ймовірно, ви видалили або пошкодили рядок, що зіставляє ім’я хоста вашої машини з `127.0.1.1` або `127.0.0.1`. Негайно відновіть резервну копію: `sudo cp /etc/hosts.bak.TIMESTAMP /etc/hosts`.
Запис ігнорується для конкретного застосунку:
- Деякі застосунки (зокрема ті, що використовують `getaddrinfo` з власними конфігураціями NSS, або ті, що мають статично пов’язані резолвери) повністю обходять `/etc/nsswitch.conf` і запитують DNS безпосередньо. Це поширено в бінарних файлах Go, скомпільованих з вимкненим CGO. Перевірте за допомогою `strace -e trace=network yourapp`.
Файл hosts працює локально, але не в контейнері Docker:
- Мережа контейнерів ізольована. Контейнер має власний `/etc/hosts`. Використовуйте `–add-host` або `hostAliases`, як описано вище.
Ключові технічні висновки: контрольний список рішень
Перед редагуванням `/etc/hosts` пройдіть цей контрольний список:
- Перевірка області дії: Чи потрібна ця зміна лише на одній машині? Якщо кільком машинам потрібна ця зміна, використовуйте DNS або такий інструмент, як Ansible, для її розповсюдження.
- Спочатку резервна копія: Завжди створюйте резервну копію з міткою часу (`hosts.bak.YYYYMMDD_HHMMSS`) перед будь-яким редагуванням.
- Використовуйте `0.0.0.0` для блокування: Швидший збій, без накладних витрат на зворотний зв’язок.
- Очистіть правильний кеш: Визначте, чи використовує ваша система `systemd-resolved`, `nscd` або `dnsmasq`, перш ніж перезапускати неправильний сервіс.
- Тестуйте за допомогою `getent`: Надійніше, ніж `ping`, для підтвердження розпізнавання NSS.
- Захистіть файл: Використовуйте `chattr +i` на виробничих або чутливих до безпеки системах.
- Документуйте свої записи: Додавайте вбудовані коментарі (`# reason – added YYYY-MM-DD`) до кожного нестандартного запису.
- Видаляйте тимчасові записи: Записи для розробки/тестування, залишені у виробничих файлах hosts, є поширеним джерелом важко діагностованих помилок маршрутизації.
Якщо ви керуєте робочим процесом розробки в кількох середовищах, розгляньте можливість поєднання локального управління файлом hosts з належно налаштованим VPS Control Panels для централізованого управління віртуальними хостами та зменшення розбіжностей у конфігурації між машинами.
Для проєктів, що передбачають Domain Registration та поетапні розгортання, файл hosts залишається найнадійнішим способом виконати повне наскрізне тестування нової конфігурації сервера до завершення поширення DNS — надаючи вам вікно перевірки без ризику до того, як публіка побачить будь-які зміни.
FAQ
Чи потребує редагування `/etc/hosts` перезавантаження системи?
Ні. Зміни в `/etc/hosts` набувають чинності негайно для нових з’єднань. Якщо у вас є локальний демон кешування DNS (`systemd-resolved`, `nscd` або `dnsmasq`), вам потрібно очистити його кеш. Браузери також підтримують незалежні кеші DNS, які може знадобитися очистити вручну.
Чому запис у файлі hosts працює в терміналі, але не в браузері?
Браузери кешують DNS-записи незалежно від резолвера ОС. Chrome кешує записи до 60 секунд. Перейдіть до `chrome://net-internals/#dns` і очистіть кеш хостів або зачекайте закінчення TTL.
Чи можна використовувати символи підстановки в `/etc/hosts`?
Ні. Файл `/etc/hosts` не підтримує записи з символами підстановки. Кожне ім’я хоста має бути вказане явно. Якщо вам потрібне розпізнавання з символами підстановки (наприклад, `*.local`), використовуйте локальний DNS-резолвер, такий як `dnsmasq` або `unbound`.
Яка максимальна кількість записів у `/etc/hosts`?
Немає жорстко закодованого обмеження, що накладається ядром або glibc. Однак продуктивність знижується при дуже великих файлах, оскільки файл аналізується лінійно для кожного пошуку. Файли з десятками тисяч записів (поширені у списках блокування реклами) можуть додавати відчутну затримку до розпізнавання імен хостів. Для великих блок-списків більш ефективним є спеціалізований DNS-синкхол, наприклад Pi-hole.
Чи безпечно видаляти стандартні записи в `/etc/hosts`?
Ні. Стандартні записи (`127.0.0.1 localhost`, `::1 localhost` та зіставлення власного імені хоста машини) необхідні для правильної роботи системи. Їх видалення може порушити роботу `sudo`, локальних сокетних з’єднань і застосунків, що покладаються на розпізнавання зворотного зв’язку. Лише додавайте або змінюйте записи; ніколи не видаляйте стандартні без конкретної, добре зрозумілої причини.
