Бесклассовая адресация CIDR: маски подсети, сабнетинг, агрегация маршрутов и правило Longest Prefix Match.
Как определяется принадлежность IP-адреса к определённой подсети при бесклассовой адресации?
Что означает правило Longest Prefix Match при маршрутизации?
Что представляет собой маршрут 0.0.0.0/0?
Какое преимущество даёт агрегация маршрутов провайдерам?
На каких устройствах присутствует таблица маршрутизации?
Есть два маршрута: 10.1.0.0/16 через шлюз A и 10.1.1.0/24 через шлюз B. Куда будет направлен пакет для адреса 10.1.1.5?
Бесклассовая адресация (CIDR) строится на основе классовой — для понимания ipv4-classless необходимо сначала изучить ipv4-classful
Задачи на IP-адресацию требуют уверенного понимания бесклассовой адресации (CIDR) — нужно изучить ipv4-classless перед практическими задачами
Адресация IPv6 строится на понимании масок и префиксов из IPv4
Итак, следующий пункт программы — это бесклассовая адресация, то есть то, чем мы пользуемся сегодня в реальном мире.
Минусы классовой адресации стали понятны достаточно быстро. Адреса расходовались исключительно неэффективно. Да, их много, да, их 4 миллиарда, но по факту вся первая половина практически не используется из-за того, что это класс A. Соответственно, используются только сети класса C и немножко класс B в качестве запасного варианта.
Мы проговорили про три класса: A, B и C. Но на самом деле можно себе представить, что есть и другие классы:
0 (первый бит), то есть первая половина всех адресов10, то есть четверть всех адресов110, то есть ещё одна восьмаяОставалась ещё одна восьмая неиспользованной. Впоследствии адреса после класса C (начинающиеся с 224 и выше) были разбиты на ещё два класса:
1110, используется под мультикаст (то, подо что планировался IPv5, но в итоге вошло как часть IPv4)1111, просто нельзя использоватьОдна шестнадцатая от всего числа адресов даже сегодня до сих пор использовать нельзя. Этот диапазон запрещено даже брать в расчёт. Несмотря на то, что все кричат "IPv4-адреса заканчиваются!", на самом деле ещё одна шестнадцатая от всего числа адресов лежит в загашнике, и ни одно оборудование её никогда не сможет задействовать.
В 1984 году появляется механизм, который указывает, что все эти проблемы возникают из-за необходимости определять границу между левой частью (Network ID) и правой частью (Host ID) по внешнему виду IP-адреса. Если определять эту границу как-нибудь иначе, то проблемы с неэффективным использованием адресов и большим размером таблиц маршрутизации уйдут.
Дело в том, что вы можете эту границу смещать куда угодно. Например, можно сказать: нам нужна очень маленькая сеть — два узла, два служебных адреса, итого четыре адреса. Под них достаточно двух бит Host ID, а всё остальное пусть будет Network ID. То есть границу хочется указывать не в одном из трёх фиксированных мест, а где угодно.
Для этого придётся описать, где у вашего IP-адреса проходит граница между левой и правой частью.
Классовая адресация продолжала использоваться ещё долгое время, потому что оборудование под неё выпускалось, в том числе и после выхода RFC 917.
У нас есть узел с IP-адресом. При классовой адресации узел определял границу между Network ID и Host ID по классу адреса. В случае с сабнетингом узел по-прежнему считал, что находится в классовой сети, но эту сеть можно было разделить на части.
Что такое "разделить сеть на части"? У нас есть сеть — это все IP-адреса, которые начинаются на определённые биты. Допустим, есть сеть класса C: 192.168.5.0. Это все адреса от 192.168.5.0 до 192.168.5.255.
Можно разделить эту сеть на две части:
192.168.5.0 — 192.168.5.127192.168.5.128 — 192.168.5.255Вы смещаете границу между Network ID и Host ID вправо относительно оригинальной классовой границы. Если у классовой сети класса C было 24 бита Network ID и 8 бит Host ID, то вы "откусываете" один бит от Host ID:
0 или 1 — два вариантаПринцип: у кого откушенный бит равен 0 — тот в левой половинке, у кого 1 — в правой.
Вы купили одну большую классовую сеть, порезали её на части нужного размера и назначаете эти части туда, где удобно:
Делите пополам, оставшуюся половинку ещё делите пополам — и так далее.
Эта штука называется VLSM (Variable Length Subnet Mask) — вы можете перемещать границу между левой и правой частью. Но для того, чтобы указать, где проходит эта граница, нужно как-то сообщить узлу размер левой части. Раньше это было понятно из класса адреса, а теперь нужен отдельный механизм — маска (Mask).
1. Десятичная запись (RFC 950)
Маска записывается как 32-битное число в форме четырёх октетов, разделённых точками (как IP-адрес). Правило:
10Маска всегда состоит из последовательности единиц, за которыми следуют нули. Всего возможно 33 варианта маски (от 0 до 32 единиц).
Пример: 255.255.255.240
2. Префиксная запись (RFC 1860, CIDR-нотация)
Записывается как /число после IP-адреса. Число указывает количество бит, относящихся к Network ID.
Пример: 192.168.5.1/28 — означает, что 28 бит относятся к Network ID, а оставшиеся 4 бита — к Host ID.
Обе записи абсолютно равнозначны:
| Десятичная маска | Префиксная запись |
|---|---|
255.255.255.240 |
/28 |
255.255.255.0 |
/24 |
255.255.0.0 |
/16 |
255.0.0.0 |
/8 |
В Cisco IOS при назначении IP-адреса на интерфейс обязательно использовать десятичную запись маски. Более новое оборудование, как правило, позволяет задавать и префиксную запись.
Допустим, у нас IP-адрес 10.0.0.1 с маской 255.255.255.240 (она же /28).
В двоичном виде:
10 = 00001010255.255.255.240 = 28 единиц, затем 4 нуляДля адреса класса A (10.x.x.x) классовая маска была бы /8 (8 бит Network ID). Сейчас мы говорим, что к Network ID относятся 28 бит — граница сместилась вправо на 20 бит. Эти 20 бит хранят Subnet ID (номер подсети), а оставшиеся 4 бита отводятся под Host ID.
Чтобы узнать, находятся ли два узла в одной сети:
Важно: узел не знает маску соседа. Он использует только свою собственную маску для обеих операций.
Пример:
10.0.0.1/28 → 10.0.0.1 AND 255.255.255.240 = 10.0.0.010.0.0.2 → 10.0.0.2 AND 255.255.255.240 = 10.0.0.0Возьмём сеть 192.168.1.0/29 (8 адресов: от .0 до .7). Левые 29 бит одинаковые, правые 3 бита пробегают все значения.
Переносим границу вправо на 1 бит (маска становится /30):
Подсеть 1: 192.168.1.0/30
.0, .1, .2, .30Подсеть 2: 192.168.1.4/30
.4, .5, .6, .71Была одна сеть на 8 адресов — стало 2 сети по 4 адреса.
Обратный процесс — агрегация. Если есть несколько подсетей, у которых левые биты совпадают, а все остальные пробегают все возможные значения, их можно объединить в одну большую сеть.
Пример: четыре сети /31, порезанные из одной /29, можно снова собрать в одну сеть /29.
Очень полезная штука для провайдеров. Провайдер получает в своё распоряжение блок адресов (например, /16), делит его на части и выдаёт клиентам (например, по /24). Всем остальным провайдерам в мире не нужно запоминать 256 отдельных клиентских сетей — достаточно знать один провайдерский блок. Тем самым:
В корпоративных сетях агрегация встречается редко, а вот сабнетинг — часто.
Два термина, которые иногда встречаются в литературе:
Смысл у обоих одинаковый — можно переносить границу относительно классовой сети.
Оригинальный RFC 950, который разрешал резать сети на части, содержал рекомендацию: не использовать первую и последнюю подсеть из нарезки.
Причина: при разделении сети на части у первой подсети адрес сети совпадает с адресом родительской сети, а у последней — совпадает широковещательный адрес. Некоторое оборудование могло их путать.
Если резать всего на две части — рекомендация теряет смысл (обе нельзя использовать). Если на четыре — первую и последнюю нельзя, вторую и третью можно.
Сегодня эта рекомендация устарела. RFC 1878 уже давно сказал, что можно брать первый и последний кусок без проблем. Но если в сети есть старое классовое оборудование (из 80-х годов), лучше эту рекомендацию соблюдать — из-за совпадения адресов могут возникнуть петли маршрутизации.
В Cisco IOS есть команда
ip subnet-zero(разрешает использовать первую подсеть) иno ip subnet-zero(запрещает). В современных версиях IOSip subnet-zeroвключена по умолчанию.
Допустим, у узла два интерфейса:
10.0.1.1/2410.0.2.1/24Нужно отправить пакет узлу 10.0.2.2. Для каждого интерфейса:
Интерфейс 1: 10.0.1.1 AND /24 = 10.0.1.0. Адрес получателя: 10.0.2.2 AND /24 = 10.0.2.0. Не совпало — получатель не в этой сети.
Интерфейс 2: 10.0.2.1 AND /24 = 10.0.2.0. Адрес получателя: 10.0.2.2 AND /24 = 10.0.2.0. Совпало! Отправляем пакет напрямую через интерфейс 2, указав MAC-адрес получателя в кадре.
Важно: IP-адреса разных интерфейсов не должны пересекаться. Например, нельзя ставить
10.0.0.1/24на одном интерфейсе и10.0.0.2/25на другом — адрес одного интерфейса попадёт в сеть другого.
Если получатель не находится в одной сети ни с одним интерфейсом, нужна таблица маршрутизации. Как и при классовой адресации, у бесклассовых узлов есть таблица маршрутизации с:
Маршрут по умолчанию в бесклассовой адресации — это маршрут на суперсеть 0.0.0.0/0. Это все IP-адреса в мире: у абсолютно любого адреса первые 0 бит совпадают с адресом 0.0.0.0.
В отличие от классовой адресации, в бесклассовой один IP-адрес может принадлежать нескольким сетям. Поэтому при поиске маршрута:
Пример таблицы маршрутизации:
| Сеть | Маска | Next-hop |
|---|---|---|
192.168.100.0 |
/24 |
Router A |
192.168.0.0 |
/16 |
Router B |
0.0.0.0 |
/0 |
Router C |
Для пакета до 192.168.100.45 подходят все три маршрута. Побеждает /24 — у неё маска числом больше всех.
Маршрут 0.0.0.0/0 работает как "все остальные сети в мире" — подхватывает пакеты, которые не попали под более конкретные маршруты.
На обычных абонентских узлах:
10.0.0.0/24)0.0.0.0/0 via 10.0.0.254)На центральном маршрутизаторе:
10.0.1.0/30, 10.0.2.0/29, 10.0.3.0/24, 192.168.0.0/24)10.0.0.0/24 via 10.0.1.1)0.0.0.0/0 via провайдер)Таблица маршрутизации есть на всех узлах: рабочих станциях, маршрутизаторах, даже на принтерах. Она может быть вырожденной (один интерфейс + маршрут по умолчанию), но она всё равно есть.
Команда route print показывает таблицу маршрутизации:
0.0.0.0/0192.168.0.0/24)192.168.0.255)255.255.255.255, 127.255.255.255)Добавление статического маршрута:
route add 8.8.8.8 mask 255.255.255.255 192.168.0.1
Это создаёт запись: пакеты до 8.8.8.8/32 отправлять через 192.168.0.1. Для выполнения нужны права администратора.
Если у вас один интерфейс и один маршрутизатор — нет смысла. Но если на машине несколько интерфейсов (Wi-Fi, Ethernet, 3G-модем), можно:
Пример: Ethernet — основной канал (метрика меньше), Wi-Fi — резервный (метрика больше). Если Ethernet отключается, трафик автоматически идёт через Wi-Fi.
В штатном VPN-клиенте Windows по умолчанию стоит галочка "Устанавливать шлюз по умолчанию через этот VPN". Из-за этого при подключении к VPN отваливается весь остальной интернет. В большинстве случаев эту галочку нужно снять (свойства подключения -> "Использовать шлюз в удалённой сети").
Ещё один нюанс: протокол PPP, который используется в Windows VPN, не умеет передавать маску. Когда VPN назначает IP-адрес (например, 192.168.0.1), Windows добавляет классовый маршрут до сети этого адреса.
Назначение IP-адреса на интерфейс:
interface GigabitEthernet 0/0
no shutdown
ip address 172.31.1.254 255.255.248.0
Cisco IOS требует десятичную запись маски (формат RFC 950), префиксную запись при назначении адреса не поддерживает.
Команда ip address без ключевого слова задаёт основной адрес. Повторный вызов ip address без secondary заменяет предыдущий.
Для добавления дополнительных адресов используется ключевое слово secondary:
ip address 10.0.0.1 255.255.255.0 secondary
ip address 10.0.0.2 255.255.255.0 secondary
ip address 10.0.0.3 255.255.255.0 secondary
Secondary-адреса:
Полезно при миграции сети на новую адресацию: вешаете на один интерфейс и старый, и новый адрес, а затем постепенно переводите клиентов.
Команда show ip route показывает:
/32). Пакеты на эти адреса обрабатываются локально.IOS также справочно показывает информацию о классовых суперсетях: какая классовая сеть была "подербанена" на части и какие подсети из неё получились (VLSM-режим отображения).
ip route 0.0.0.0 0.0.0.0 GigabitEthernet 0/0
Звёздочка * в выводе show ip route отмечает маршрут по умолчанию.
Cisco IOS исторически имеет классовые корни. Команда no ip classless переводит маршрутизатор в классовый режим, а ip classless — в бесклассовый (по умолчанию в современных версиях).
Команда no ip routing полностью отключает маршрутизацию. Маршрутизатор превращается в простое устройство: умеет отправлять и принимать IP-пакеты, но не умеет маршрутизировать. Вместо полноценной таблицы маршрутизации можно задать только ip default-gateway — единственный маршрут по умолчанию:
no ip routing
ip default-gateway 10.0.0.254
Это полезно для простых устройств (принт-серверы и подобные), которым нужен IP, но не нужна полноценная маршрутизация.
Также существует команда ip default-network — классовый механизм, который помечает одну из классовых сетей звёздочкой как маршрут по умолчанию. Работает только в классовом режиме. Следы этой команды можно встретить в документации по протоколу EIGRP.
Команда ip route print показывает таблицу маршрутизации. Активные маршруты помечены буквой A.
Пример вывода:
192.168.0.0/24 через Ethernet-интерфейс192.168.1.1/240.0.0.0/0: через GRE-туннель и через 192.168.0.1Если два маршрута по умолчанию с одинаковой метрикой — часть трафика пойдёт через один канал, часть через другой. Это приводит к проблемам, особенно при наличии NAT: пакеты одного приложения, проходя через разных провайдеров, получат разные IP-адреса источника.
Команда route (или ip route show) показывает таблицу маршрутизации:
192.168.100.0/24) через интерфейс eth0default) через шлюз (например, 192.168.100.5)Типичный вопрос начинающих: "У меня есть маршрутизатор, хочу подключить двух провайдеров. Как это сделать?"
Ответ: легко сделать не получится. Основные проблемы:
NAT — если трафик проходит через NAT, пакеты, ушедшие через разных провайдеров, получат разные IP-адреса. Получатель увидит два потока с разных адресов, хотя вы отправляли из-под одного.
Привязка приложений — трафик одного приложения всегда должен идти через одного и того же провайдера. Нельзя "размазывать" его между двумя каналами.
Балансировка — если направить торрент через один канал, а YouTube и голос через другой, может получиться, что один канал забит, а другой простаивает.
Отказоустойчивость — при падении одного канала нужно переключение, но сервисы (например, Skype) могут нервно реагировать на смену IP-адреса.
Единственный надёжный вариант — когда с обоими провайдерами заключено соглашение, что они не перебивают ваши IP-адреса (например, вы купили свой блок адресов и анонсируете его через BGP обоим провайдерам).
На сегодня всё. В следующем уроке продолжим говорить про IP-маршрутизацию: будем решать задачки и разберём дополнительные механизмы протокола IP.