«Маршрутизатор будет пересылать пакет, отправленный хостом 1, по шлюзу по умолчанию, если и только если для всех его подключенных интерфейсов сконфигурированный адрес интерфейса побитовый И с маской подсети хоста 1 не равен сетевому адресу хоста 1»?
В традиционной IP-маршрутизации да. Пересылка пакетов осуществляется путем выбора наиболее конкретного подходящего маршрута из таблицы маршрутизации (нет особого различия между «подключенным интерфейсом» и «шлюзом по умолчанию», они оба являются просто стандартными маршрутами). Таким образом, если у маршрутизатора есть два маршрута, соответствующих пакету, один для 0.0.0.0/0
(шлюз по умолчанию) и другой для 1.2.3.0/24
(локальная подсеть), последний всегда побеждает.
Хотя вы должны заметить, что маршрутизаторы не обязательно имеют шлюз по умолчанию (особенно в так называемой « зоне по умолчанию », что на самом деле означает, что у них есть более специфичные маршруты для абсолютно всего).
Также я говорю «традиционная IP-маршрутизация», потому что маршрутизаторы могут делать больше, чем просто сопоставление маршрутов на основе пункта назначения. Например, в IPv6 некоторые системы поддерживают маршруты, которые соответствуют источнику и получателю; Например, вы можете иметь маршруты from ::/0 to ::/0 via <gw1>
и from 2001:db8::/48 to ::/0 via <gw2>
.
Также распространено (как в IPv4, так и в IPv6) реализация маршрутизации на основе политик, которая может соответствовать пакетам по протоколу или по метке брандмауэра. Если маршрутизатор имеет два восходящих потока (два маршрута по умолчанию), он часто будет хотеть использовать политику маршрутизации, чтобы гарантировать, что пакеты, полученные от восходящего потока 1, будут отправлять свои ответы на тот же самый восходящий поток 1, даже если таблица маршрутизации предпочла бы восходящий поток 2.
В частности, если адрес назначения находится в той же подсети, что и host1, скажем, 1.2.3.50, но не существует в локальной сети, верно ли, что маршрутизатор никогда не переадресует его по шлюзу по умолчанию?
Да. Если в таблице маршрутизации указано, что пункт назначения является локальным, но маршрутизатору не удается получить ответ ARP / NDP, он не отступит на другой, менее конкретный маршрут - он сразу же сдастся и вернет какую-то ошибку ICMP, возможно, «Назначение». узел недоступен ".
(То, находится ли пункт назначения в той же сети, что и источник, обычно ни на что не влияет. Даже если это означает отправку пакета из того же интерфейса, в котором он был получен, маршрутизатор по-прежнему ведет себя так же.)
Наконец, если я (абсурдно) выберу маску подсети / 0 для host1, [...] маршрутизатор будет действовать как коммутатор и рассылать спам каждый пакет на все подключенные интерфейсы (кроме межсетевого интерфейса), и никогда не переадресовывать ничего его шлюз по умолчанию?
Изменение маски подсети на хосте не влияет на маршрутизатор. Маршрутизатор не знает, какая маска подсети настроена на других хостах; он будет вести себя в соответствии с тем, как настроены его собственные интерфейсы. (И наоборот, хост не знает, как настроен маршрутизатор.)
Если вы напрямую настраиваете маршрутизатор на наличие маски подсети / 0 на каком-либо интерфейсе, он абсолютно не начинает действовать как коммутатор. Он все еще действует как маршрутизатор, но если раньше у него был маршрут по умолчанию, у него теперь просто есть два маршрута по умолчанию - один из них просто утверждает, что все узлы являются локальными на указанном интерфейсе.
Если маршрутизатор предпочитает этот второй маршрут по умолчанию, вы все равно увидите обычное поведение «локальной подсети»: маршрутизатор будет продолжать пытаться ARP / NDP для каждого пункта назначения непосредственно на этом интерфейсе (при условии, что это широковещательный интерфейс, такой как Ethernet / Wi-Fi) и по-прежнему не будет пересылать пакеты, пока не получит ответ ARP и не узнает MAC-адрес получателя.
И если вы настраиваете хост на наличие маски подсети / 0, в основном происходит то же самое: два маршрута по умолчанию, один из них локальный, поэтому хост будет пытаться выполнять запросы ARP для каждого пункта назначения и в случае сбоя. (Единственное различие между хостами и маршрутизаторами состоит в том, что хост не будет пересылать полученные пакеты, а маршрутизатор будет. В противном случае они обрабатывают таблицы маршрутизации почти таким же образом.)
Наконец, если я (нелепо) выберу маску подсети / 0 для host1, это фактически заблокирует весь интернет от моего хоста?
Обычно да, потому что хост никогда не преуспеет в запросах ARP для мест назначения, которые не являются действительно локальными.
Но у вас может быть фальшивый ответ маршрутизатора на эти запросы - функция под названием «Proxy ARP». Когда он включен, когда хост пытается выполнить запрос ARP для какого-либо удаленного хоста, он вместо этого узнает MAC-адрес локального маршрутизатора, и с этого момента все работает так, как если бы у хоста был нормальный маршрут шлюза. (Единственное отличие состоит в том, что хост получит огромный кэш ARP.)
Это чаще используется, когда хост думает, что он находится в стандартной подсети (скажем, / 24), но на самом деле не может отправлять кадры Ethernet ни на что, кроме локального маршрутизатора. Хостинговая компания может настроить свои коммутаторы так, чтобы они отбрасывали все пакеты, за исключением / из «доверенного» порта маршрутизатора (изоляция порта), и включали прокси-ARP на маршрутизаторе. Это позволяет фильтровать трафик даже между клиентами в одной подсети в соответствии с правилами брандмауэра маршрутизатора, которые они обычно обходят.