0.0.0.0 — что это такое: адрес, маска, подсеть и default route

Что означает 0.0.0.0: адрес, маска сети, default route, использование в VPN, DNS и HTTP. Простое объяснение для администраторов.

Открываешь конфиг сервера — там 0.0.0.0. Смотришь таблицу маршрутов — снова 0.0.0.0. Настраиваешь WireGuard — AllowedIPs = 0.0.0.0/0. Заглядываешь в hosts-файл на каком-нибудь блокировщике рекламы — и там тоже он.

Новички в этот момент думают, что что-то сломалось. Опытные админы молча кивают и идут дальше. Потому что 0.0.0.0 — это не баг и не ошибка. Это одна из самых многозначных записей в сетевом мире, которая может означать совершенно разные вещи в зависимости от контекста.

В этой статье разберём все случаи: что значит 0.0.0.0 как адрес, как маска, как маршрут по умолчанию, как параметр VPN и как инструмент блокировки в DNS. С примерами, командами и без академической нудятины.


Что такое 0.0.0.0

Формально — это IPv4-адрес, в котором все четыре октета равны нулю. Но в отличие от обычных IP-адресов, он не маршрутизируемый (non-routable) и не привязан к конкретному устройству или интерфейсу.

По стандарту RFC 1122 адрес 0.0.0.0 относится к категории «специальных». Его нельзя назначить сетевому интерфейсу как постоянный адрес, нельзя отправить на него пакет через интернет, и никакой реальный хост не должен использовать его как источник или назначение в обычном трафике.

Но при этом он везде. Почему? Потому что в разных контекстах он означает разные вещи:

  • «Любой адрес» — когда сервис слушает 0.0.0.0, он принимает подключения на всех интерфейсах
  • «Адрес не задан» — когда устройство ещё не получило IP (DHCP-запрос до получения аренды)
  • «Весь интернет» — в маршрутизации 0.0.0.0/0 означает маршрут по умолчанию
  • «Заблокировано» — в hosts-файле 0.0.0.0 используется для блокировки доменов

Один адрес, четыре совершенно разных смысла. Разберём каждый.


0.0.0.0 как адрес: когда сервис слушает «на всём»

Самый частый случай, с которым сталкиваются разработчики и системные администраторы — это адрес 0.0.0.0 в параметрах запуска сервиса.

Когда вы запускаете веб-сервер, он должен «слушать» на каком-то адресе и порту. Если указать конкретный IP — например, 192.168.1.10:80 — сервер будет принимать запросы только на этот адрес. Если указать 0.0.0.0:80 — сервер слушает на всех сетевых интерфейсах сразу: и на локальном, и на внешнем, и на VPN-адресе.

HTTP и 0.0.0.0:80

В конфигурации Nginx:

server {
    listen 0.0.0.0:80;
    server_name example.com;
}

Это значит: «принимай HTTP-запросы на порт 80 с любого IP-адреса, который есть на этом сервере». На практике большинство дистрибутивов Linux и конфигурации веб-серверов используют именно такую запись — она удобнее, чем перечислять все IP вручную.

Краткая запись без явного указания адреса делает то же самое:

server {
    listen 80;
}

Nginx по умолчанию подставляет 0.0.0.0.

HTTPS и 0.0.0.0:443

server {
    listen 0.0.0.0:443 ssl;
    server_name example.com;
}

Аналогично для HTTPS — слушаем на всех интерфейсах, порт 443.

Проверить, на чём слушает процесс

# Linux
ss -tlnp | grep :80
netstat -tlnp | grep :80

Если в столбце Local Address видите 0.0.0.0:80 — сервис слушает на всех интерфейсах. Если 127.0.0.1:80 — только локально.

А это безопасно?

Зависит от того, что слушает на 0.0.0.0. Веб-сервер, который должен быть доступен из интернета — да, нормально. База данных MySQL или Redis, которую вы случайно запустили на 0.0.0.0 вместо 127.0.0.1 — это уже повод для ночного кошмара и срочного патча.

Правило простое: всё, что не должно быть доступно извне, должно слушать на 127.0.0.1, а не на 0.0.0.0. Firewall тоже не помешает, но не заменяет правильный bind.


Маска 0.0.0.0 и сеть 0.0.0.0: что это означает в маршрутизации

Здесь начинается самое интересное. В контексте маршрутизации маска 0.0.0.0 означает «никаких ограничений» — то есть подходит любой IP-адрес.

В CIDR-нотации это записывается как 0.0.0.0/0 — ноль значащих бит в маске. Для сравнения:

Запись Маска Покрывает Пример
192.168.1.0/24 255.255.255.0 254 хоста Локальная подсеть офиса
10.0.0.0/8 255.0.0.0 ~16 млн хостов Крупная корпоративная сеть
0.0.0.0/0 0.0.0.0 Все IPv4-адреса Default route, весь интернет

Маска 0.0.0.0 (или /0) — это «совпадает с чем угодно». Именно поэтому она используется для маршрута по умолчанию.


0.0.0.0/0 как default route: куда идёт весь трафик

Маршрут по умолчанию (default route) — это инструкция для роутера или операционной системы: «если не знаешь, куда отправить пакет — отправь сюда». Записывается как 0.0.0.0/0 с указанием шлюза.

Как это работает

Когда система получает пакет для отправки, она смотрит в таблицу маршрутов сверху вниз — от самых конкретных маршрутов к самым общим. Если ни один конкретный маршрут не совпал — срабатывает 0.0.0.0/0, и пакет уходит на шлюз по умолчанию.

# Посмотреть таблицу маршрутов на Linux
ip route show

# Типичный вывод:
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100

Строка default via 192.168.1.1 — это и есть 0.0.0.0/0. Пакет в интернет? Идёт на 192.168.1.1 (роутер). Пакет в 192.168.1.0/24? Уходит напрямую в локальную сеть.

Добавить маршрут по умолчанию вручную

# Linux
ip route add default via 192.168.1.1

# Или в старом синтаксисе
route add default gw 192.168.1.1

В MikroTik

/ip route add dst-address=0.0.0.0/0 gateway=192.168.1.1

Посмотреть текущий default route

# Linux
ip route show 0.0.0.0/0

# MikroTik
/ip route print where dst-address=0.0.0.0/0

Если default route отсутствует — хост не знает, куда слать трафик за пределы известных подсетей. Интернет не работает. Это одна из первых вещей, которую проверяют при диагностике «не пингуется 8.8.8.8».


CIDR-нотация: 0.0.0.0/0 и 0.0.0.0/32 — в чём разница

Путаница с CIDR возникает постоянно, поэтому разберём главные варианты с нулями.

0.0.0.0/0 — весь интернет

Ноль значащих бит в маске. Совпадает с любым IPv4-адресом. Используется как default route и в VPN для full tunnel (об этом ниже).

0.0.0.0/32 — один конкретный хост

Тридцать два значащих бита. Это маска одного хоста — только адрес 0.0.0.0 ровно. В нормальной маршрутизации такая запись не имеет смысла, потому что 0.0.0.0 как хост не существует. Если вы видите 0.0.0.0/32 в конфиге — скорее всего, это ошибка конфигурации (об этом в кейсах).

0.0.0.0/8, /16, /24 — редкие случаи

Диапазоны, начинающиеся с 0.x.x.x. В RFC 1122 адреса сети 0.0.0.0/8 зарезервированы и не используются в публичном интернете. В частных сетях такое тоже лучше не трогать — путаницы больше, чем пользы.

Запись Значение Применение
0.0.0.0/0 Все адреса Default route, VPN full tunnel
0.0.0.0/32 Только 0.0.0.0 Обычно ошибка конфига
0.0.0.0/8 Сеть 0.x.x.x Зарезервировано, не использовать

0.0.0.0 в DNS и файле hosts: блокировка рекламы и защита

Файл hosts — это локальная таблица соответствий «домен → IP», которую операционная система проверяет раньше, чем идти к DNS-серверу. Находится по пути /etc/hosts на Linux/macOS и C:\Windows\System32\drivers\etc\hosts на Windows.

Зачем туда пишут 0.0.0.0

Классический способ заблокировать домен — прописать его в hosts с адресом 127.0.0.1 (localhost). Браузер пойдёт по этому адресу, ничего не найдёт, запрос провалится. Блокировка работает.

Но у 127.0.0.1 есть нюанс: если на localhost что-то слушает (например, локальный сервер разработки), браузер может получить ответ и показать что-то неожиданное. Поэтому многие блокировщики рекламы и защитные hosts-файлы используют 0.0.0.0 вместо 127.0.0.1.

0.0.0.0 ads.example.com
0.0.0.0 tracker.somesite.net
0.0.0.0 doubleclick.net

Запрос к ads.example.com? Система смотрит в hosts, видит 0.0.0.0, пытается соединиться с этим адресом — и немедленно получает отказ. Соединение с 0.0.0.0 не проходит никуда. Это быстрее и чище, чем перенаправление на localhost.

Популярные hosts-файлы для блокировки

Проекты вроде StevenBlack/hosts содержат десятки тысяч записей вида 0.0.0.0 домен для блокировки рекламных сетей, трекеров и вредоносных доменов. Устанавливаешь такой файл — и реклама пропадает на уровне DNS без каких-либо браузерных расширений.

DNS-сервер на 0.0.0.0

В конфигурации локального DNS-резолвера (например, dnsmasq или bind9) адрес 0.0.0.0 в параметре listen означает «слушать на всех интерфейсах»:

# dnsmasq.conf
listen-address=0.0.0.0

Или при запуске:

dnsmasq --listen-address=0.0.0.0

Та же логика, что и с веб-сервером: 0.0.0.0 = принимаем запросы отовсюду.


AllowedIPs = 0.0.0.0/0 в VPN: full tunnel и split tunnel

Один из самых частых вопросов при настройке WireGuard: «что значит AllowedIPs = 0.0.0.0/0 и зачем это нужно?» Отвечаем.

Как работает AllowedIPs в WireGuard

Параметр AllowedIPs в конфиге WireGuard выполняет две функции одновременно:

  • Routing: трафик, назначение которого попадает в AllowedIPs, уходит через VPN-туннель
  • Фильтрация входящего: через туннель принимается только трафик из этих адресов

Full tunnel: AllowedIPs = 0.0.0.0/0

Если указать 0.0.0.0/0 — весь трафик (все IPv4-адреса) идёт через VPN. Это называется full tunnel: и рабочий трафик, и личный браузинг, и стриминг — всё через туннель.

[Peer]
PublicKey = <ключ сервера>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0

Когда использовать: корпоративный VPN, где нужно, чтобы весь трафик сотрудника шёл через офис; обход блокировок, когда нужно выводить весь трафик через другой IP.

Split tunnel: конкретные подсети

Если нужно пускать через VPN только трафик к определённым ресурсам — указываем конкретные подсети:

[Peer]
PublicKey = <ключ сервера>
Endpoint = vpn.example.com:51820
AllowedIPs = 10.0.0.0/8, 192.168.100.0/24

Теперь через VPN идёт только трафик в 10.x.x.x и 192.168.100.x. Всё остальное — напрямую. Это split tunnel: экономит полосу и не замедляет личный трафик.

Сравнение режимов

Параметр Full tunnel (0.0.0.0/0) Split tunnel (конкретные IP)
Весь трафик через VPN ✅ Да ❌ Нет
Нагрузка на VPN-сервер Высокая Низкая
Скорость личного трафика Ограничена VPN Максимальная
Анонимность внешнего IP ✅ Полная ❌ Только для VPN-ресурсов
Корпоративное применение Контроль трафика сотрудников Доступ к внутренним ресурсам

А что с IPv6?

Если используете full tunnel и хотите закрыть весь трафик, не забудьте про IPv6. Полная запись для WireGuard:

AllowedIPs = 0.0.0.0/0, ::/0

Без ::/0 IPv6-трафик будет обходить туннель и раскрывать реальный IP.


5 практических кейсов

Кейс 1: Почему сайт слушает 0.0.0.0 — и это нормально

Развернули новый сервер, запустили Nginx, проверяете:

ss -tlnp | grep nginx

Видите 0.0.0.0:80 и 0.0.0.0:443. Не паникуйте — это правильно. Nginx слушает на всех интерфейсах: и на внешнем IP (доступен из интернета), и на внутреннем (доступен из локальной сети).

Если хотите ограничить — меняете listen в конфиге:

# Только для внешнего IP
server {
    listen 1.2.3.4:80;
}

# Только локально
server {
    listen 127.0.0.1:80;
}

Для базы данных — обязательно ограничивайте. MySQL, PostgreSQL, Redis на 0.0.0.0 без firewall — прямой путь к взлому.

# Проверить, на чём слушает MySQL
ss -tlnp | grep :3306

# Исправить в my.cnf
bind-address = 127.0.0.1

Кейс 2: Настроить full tunnel VPN через WireGuard

Задача: весь трафик клиента должен идти через VPN-сервер.

На сервере (например, 10.0.0.1 — VPN-адрес сервера):

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <приватный ключ сервера>
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <публичный ключ клиента>
AllowedIPs = 10.0.0.2/32

На клиенте:

[Interface]
Address = 10.0.0.2/24
PrivateKey = <приватный ключ клиента>
DNS = 1.1.1.1

[Peer]
PublicKey = <публичный ключ сервера>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

AllowedIPs = 0.0.0.0/0 — весь IPv4-трафик через туннель. ::/0 — весь IPv6. Включаем:

wg-quick up wg0

Проверяем внешний IP — должен быть IP VPN-сервера:

curl ifconfig.me

Кейс 3: Блокировка рекламы через hosts с 0.0.0.0

Быстрый способ заблокировать рекламные домены без браузерного расширения — скачать готовый hosts-файл и применить.

# Скачать hosts-файл (пример: StevenBlack)
curl -o /tmp/hosts https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts

# Добавить к существующему /etc/hosts (не заменять целиком!)
sudo cat /tmp/hosts >> /etc/hosts

# Сбросить DNS-кеш на Linux (systemd)
sudo systemd-resolve --flush-caches

# На macOS
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

После этого браузеры перестанут разрешать домены из списка — запросы будут падать на 0.0.0.0 и немедленно отклоняться.

Кейс 4: Настройка и диагностика маршрута по умолчанию

Классика: сервер не выходит в интернет. Начинаем с маршрутов.

# Смотрим таблицу маршрутов
ip route show

# Если default route отсутствует — добавляем
ip route add default via 192.168.1.1

# Делаем постоянным (Ubuntu/Debian, netplan)
# В /etc/netplan/00-installer-config.yaml:
# routes:
#   - to: default
#     via: 192.168.1.1

# Применяем netplan
sudo netplan apply

В MikroTik — диагностика и добавление:

# Смотрим маршруты
/ip route print

# Нет default route? Добавляем
/ip route add dst-address=0.0.0.0/0 gateway=192.168.1.1

# Проверяем
/ip route print where dst-address=0.0.0.0/0

Кейс 5: Почему 0.0.0.0/32 ломает сеть — ошибка конфигурации

Это реальная история. Администратор настраивал маршрутизацию, ошибся и добавил маршрут 0.0.0.0/32 via 10.0.0.1 вместо 0.0.0.0/0.

Что произошло: маршрут 0.0.0.0/32 — это маршрут к одному хосту 0.0.0.0. Default route так и не появился. Весь трафик, которому не нашёлся конкретный маршрут, никуда не пошёл. Интернет лёг.

# Диагностика: ищем кривые маршруты
ip route show | grep "0.0.0.0/32"

# Удаляем ошибочный маршрут
ip route del 0.0.0.0/32

# Добавляем правильный
ip route add default via 192.168.1.1

Вывод: /0 и /32 — противоположные крайности. /0 — весь интернет. /32 — один хост. Перепутать их легко при быстрой печати, последствия — немедленные.


Побочные эффекты и частые ошибки

Ошибка 1: База данных на 0.0.0.0

MySQL, Redis, MongoDB — если они слушают на 0.0.0.0 и нет firewall, база открыта для всего интернета. Проверяйте bind-адреса после каждой установки.

Ошибка 2: AllowedIPs = 0.0.0.0/0 без NAT на сервере

Настроили full tunnel WireGuard, но забыли включить маскарадинг (NAT) на сервере. Клиент отправляет трафик в туннель, сервер получает пакеты, но не знает, куда их отправить дальше. Интернет не работает. Решение — PostUp с iptables MASQUERADE, как в кейсе 2.

Ошибка 3: 0.0.0.0/32 вместо 0.0.0.0/0

Описано в кейсе 5. Всегда дважды проверяй маску при вводе default route.

Ошибка 4: Думать, что 0.0.0.0 в логах — это атака

Иногда в логах приложений видишь соединения от 0.0.0.0. Это не взлом — это внутренние события, связанные с bind и локальными сокетами. Паниковать не надо, разобраться — стоит.


Итог: рецепт от IT-Аптеки

Адрес 0.0.0.0 — это не ошибка и не случайность. Это многозначный инструмент, который IT-специалисты используют каждый день, часто даже не задумываясь об этом. Разобрав его один раз, ты перестаёшь удивляться, почему он появляется везде.

Быстрая шпаргалка:

  • Сервис слушает 0.0.0.0:80 — принимает подключения на всех интерфейсах. Нормально для веб-серверов, опасно для баз данных.
  • 0.0.0.0/0 в таблице маршрутов — маршрут по умолчанию. Весь неизвестный трафик уходит на шлюз.
  • Маска 0.0.0.0 — означает «любой адрес», равнозначна /0 в CIDR.
  • 0.0.0.0 в hosts-файле — блокировка домена. Запрос никуда не уходит.
  • AllowedIPs = 0.0.0.0/0 в WireGuard — full tunnel, весь трафик через VPN.
  • 0.0.0.0/32 — маршрут к несуществующему хосту. Почти всегда ошибка конфигурации.

Если у вас остались вопросы, что-то пошло не так или хотите разобрать свой кейс — пишите в комментарии. Подпишитесь на наш Telegram-канал — там выходят практические гайды, скрипты и разборы ошибок без воды.

over_dude
Author: over_dude

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх