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 vs. 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` vs. `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
Начать