Короткий ответ

Маска задаёт, что считается прямо подключённым. В схеме 10.0.10.0/24 узел 10.0.10.10 должен ARP-ить только 10.0.10.0–255 и слать остальное на 10.0.10.1. Если маска /16 (255.255.0.0), он будет ARP-ить 10.0.20.10 как соседа и не найдёт его в VLAN 10. Если /25, часть 10.0.10.0/24 внезапно «удалённая». Узел «есть» в ping по случайности, маршрут уже врёт.

Сначала ipconfig /all / ip addr и connected-маршруты, не добавление статики «на всякий».

Симптомы и как отличить

  • До шлюза 10.0.10.1 ping есть, до 10.0.10.200 нет (маска /25);
  • до 10.0.20.10 Windows пишет «Destination host unreachable» от самого себя;
  • traceroute до интернета странный: нет первого хопа.

Это не нет маршрута в чистом виде: таблица есть, но connected слишком широкий/узкий. Не APIPA: адрес из 10.0.10.x.

Возможные причины

  1. DHCP option 1 (mask) не 255.255.255.0.
  2. Ручная статика /16 «как в старой сети».
  3. netplan prefix 16 при VLAN /24.
  4. Классная маска по привычке A-класса для 10.0.0.0/8 на одном хосте.
  5. VPN добавляет 10.0.0.0/8 on-link.
  6. Кластер: VIP с другой маской.
  7. Документ «сеть 10.0.10.0», на деле два /25.

Диагностика

1. Prefix на клиенте

Get-NetIPAddress -AddressFamily IPv4 | Format-Table InterfaceAlias, IPAddress, PrefixLength
Get-NetIPConfiguration
ipconfig /all
Get-NetRoute -AddressFamily IPv4 | Where-Object DestinationPrefix -like '10.*'
ip -br addr
ip route
ip route get 10.0.10.1
ip route get 10.0.10.200
ip route get 10.0.20.10

Ожидание для /24: 10.0.10.200dev eth0 (on-link), 10.0.20.10via 10.0.10.1. Если 10.0.20.10 on-link — маска слишком широкая.

Как читать: таблица маршрутизации.

2. ARP vs routed

arp -a
Get-NetNeighbor | Where-Object IPAddress -like '10.*'
ip neigh

Попытка ARP на 10.0.20.10 из VLAN 10 — дымящийся пистолет широкой маски.

3. Откуда маска пришла

Get-DhcpServerv4OptionValue -ComputerName DC01 -ScopeId 10.0.10.0
# option 1

На клиенте после renew сравните с сервером. Статика в NIC бьёт DHCP.

Ubuntu netplan:

cat /etc/netplan/*.yaml
nmcli connection show "$(nmcli -t -f NAME,DEVICE c show --active | head -1 | cut -d: -f1)"

4. Не конфликт ли из-за перекрытия

Широкая маска + узлы с теми же последними октетами в другой L2 — конфликт или ложный ARP. Узкий prefix — «нет маршрута» до половины VLAN.

Решение

Сценарий A. DHCP врёт option 1

Исправьте scope mask на /24, ipconfig /renew. Проверьте, что option не переопределён на резервации.

Сценарий B. Ручной /16

Windows: свойства IPv4, маска 255.255.255.0. Ubuntu:

addresses:
  - 10.0.10.10/24
routes:
  - to: default
    via: 10.0.10.1
sudo netplan try

Split-tunnel: не публикуйте 10.0.0.0/8 если офис /24. Иначе «локальный» ARP на филиал.

Сценарий D. Намеренные два /25

Тогда это не ошибка маски, а дизайн. Шлюзы разные. Документируйте. Не ставьте /24 на хостах.

5. Два ip route get как доказательство в тикете

Покажите заказчику не «маска неправильная», а два решения стека. На Ubuntu с проблемного узла 10.0.10.10:

ip route get 10.0.10.200
ip route get 10.0.20.10
ip neigh show

Ожидание /24: первый on-link (dev eth0 без via), второй via 10.0.10.1. Если оба on-link — prefix слишком широкий, ARP на 10.0.20.10 уйдёт в VLAN 10 и получит incomplete. Windows: Find-NetRoute -RemoteIPAddress для тех же целей; NextHop 0.0.0.0 = on-link. Снимите Get-NetIPAddress PrefixLength: GUI иногда врёт.

Откуда маска: DHCP option 1 на scope 10.0.10.0, резервация, netplan, VPN /8. VPN on-link /8 ломает даже правильный LAN /24, если host-маршрут слабее — проверьте longest prefix. Не чините «добавлением маршрута на каждый хост» вместо option 1. Смена маски на SVI без хостов разъедет connected: план, не «поправили шлюз за минуту». После renew сравните трёх клиентов. Статика .10 с /16 и DHCP-соседи с /24 в одном VLAN — источник странного NAT и ложных конфликтов.

Сверьте DHCP option 1 с IPAM: для VLAN со шлюзом 10.0.10.1 маска должна быть 255.255.255.0. Если в scope внезапно /16, новые клиенты начнут ARP-ить чужие /24 как локальные, а NAT на 10.0.10.1 их не увидит как «нужно маршрутизировать». Пострадавшие будут жаловаться на «нет интернета» при живом ping шлюза. Это не повод трогать NAT первым. На Windows после renew смотрите PrefixLength, не подпись в ncpa.cpl. На Ubuntu nmcli -f IP4.ADDRESS,IP4.GATEWAY не заменяет ip route get. Если часть хостов уже со статическим /24, а DHCP раздаёт /16, получите смешанный сегмент: одни ходят через шлюз, другие пытаются L2. Почините источник маски, затем массовый renew в окно, не наоборот. Документируйте исключение, если сознательно два /25 — тогда эта статья не про «ошибку», а про дизайн, и шлюзы должны быть разные.

Как проверить, что проблема устранена

Get-NetIPAddress -AddressFamily IPv4
ip route get 10.0.10.200   # на Ubuntu
ping -n 2 10.0.10.1
ping -n 2 10.0.10.200
Test-NetConnection 10.0.20.10
tracert -d 10.0.20.10

Первый хоп до другой подсети — 10.0.10.1. Внутри /24 — прямой ARP, без шлюза. DNS 10.0.10.2 доступен.

На Windows ip route get нет: смотрите Find-NetRoute -RemoteIPAddress 10.0.20.10.

Find-NetRoute -RemoteIPAddress 10.0.20.10 | Format-List

NextHop должен быть 10.0.10.1, не 0.0.0.0 (on-link).

Если не помогло

  • Маска /24, но proxy ARP на шлюзе прячет ошибку другой стороны.
  • Secondary IP с другой маской на том же NIC.
  • Асимметрия из-за разных prefix на двух хостах.
  • Wi‑Fi даёт /24, кабель /16 — два профиля.

Профилактика

  • Единый prefix в IPAM и DHCP.
  • Запрет ручных масок «широких» на ПК GPO.
  • Мониторинг: хост с PrefixLength != 24 в VLAN 10.
  • Не использовать 10.0.0.0/8 на одном интерфейсе «для простоты».

FAQ

Почему часть адресов пингуется при /16?

Те, кто в том же L2 и отвечает на ARP. Остальные — unreachable. «Сеть частично жива» — типичный паттерн.

Маска на клиенте /24, на шлюзе /16. Что будет?

Шлюз считает больше адресов connected. Ответы могут идти иначе, чем запросы. Это путь к асимметрии и странному NAT.

APIPA имеет маску /16. Это то же самое?

APIPA всегда /16 для 169.254.0.0. Это не ваша LAN-маска. Сначала DHCP.

Нужно ли править маску, если ping шлюза есть?

Если connected врёт для других сетей — да. Живой ping шлюза не доказывает верный prefix.

Windows показывает /24 в GUI, Get-NetIPAddress /16. Кому верить?

PowerShell. GUI иногда кэширует. Смотрите Get-NetRoute.