15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
07.10.2024

Як редагувати файл 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`, локальних сокетних з’єднань і застосунків, що покладаються на розпізнавання зворотного зв’язку. Лише додавайте або змінюйте записи; ніколи не видаляйте стандартні без конкретної, добре зрозумілої причини.

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати