Вопрос из заголовка, порой, вводит в тупик, даже коллег, имеющих сертификаты уровня CCNA. Давайте обсудим как выглядят фреймы на каждом этапе передачи от клиента к коммутатору, к роутеру, к межсетевому экрану и к серверу и какие поля при этом там меняются.

Буду исходить из того, что читатель знаком с базовым курсом по TCP/IP, поэтому буду касаться только нужных для статьи моментов. Как введение рекомендую прочитать статью "Как файлы помещают во фреймы Ethernet"


Проведем эксперимент

Давайте подключимся браузером от клиента к веб-серверу и посмотрим на IP и MAC адреса источника и получателя в каждом фрейме сетевого трафика в каждом из каналов на картинке ниже. Самое простое - это увидеть самим и подключить в каждый канал сниффер.

Предлагаю внимательно посмотреть на схему подключения сетевого оборудования ниже:

Схема подключения клиента к серверу через промежуточное оборудования с IP и MAC адресами.
Схема подключения клиента к серверу через промежуточное оборудования с IP и MAC адресами.

Клиент с IP адресом 10.1.1.11/24 и MAC адресом 0000.0001.1111 подключается к серверу с IP адресом 10.1.3.33/24 и MAC адресом 0000.0008.8888. Маска /24 (255.255.255.0) выбрана для примера.

Стуктура фреймов Ethernet при передаче по сети

Напомню как выглядит структура фрейма (кадра) Ethernet при передаче в сеть: все заголовки и данные вышестоящих протоколов стека TCP/IP объединяются в единый блок данных для передачи. Ваши файлы, голос и видео в виде нарезанных кусочков перемещаются в поле Payload. Подробнее тут. Внутри Ethernet заголовка находятся MAC адреса источника и получателя, и внутри IP заголовка находятся IP адреса источника и получателя. Эта структура данных в наших сетях используется коммутаторами и маршрутизаторами для передачи фреймов друг другу. Например, ниже внутри фрейма отображены заголовки IP протокола 4 версии и TCP протокола (могут быть помещены и другие протоколы, например ICMP или UDP):

Пример фрейма (кадра) Ethernet
Ethernet MTU – максимальный размер фрейма для данной среды передачи. Обычно 1500 байт.
TCP MSS – максимальный размер сегмента данных TCP. Обычно MSS = MTU-40 = 1460
В сумме длина фрейма 1518 байт.
Пример фрейма (кадра) Ethernet Ethernet MTU – максимальный размер фрейма для данной среды передачи. Обычно 1500 байт. TCP MSS – максимальный размер сегмента данных TCP. Обычно MSS = MTU-40 = 1460 В сумме длина фрейма 1518 байт.

Хорошая визуализация схемы передачи фреймов (кадров) по сети есть статье Артема Санникова, вот демонстрация как производится пересылка фрейма через коммутатор:

Интересно, что в заголовке фрейма первым идет адрес назначения, а в IP заголовке первым идет адрес источника.
Интересно, что в заголовке фрейма первым идет адрес назначения, а в IP заголовке первым идет адрес источника.

Изучим первый фрейм, между клиентом и свитчом.

Итак, какие будут Source IP и MAC, Destination IP и MAC в первом фрейме от клиентского компьютера?

Source MAC Address = ???
Destination MAC Address = ???
Source IP Address = ???
Destination IP Address = ???

Попробуем написать эти адреса во фреймах сами?

Лучше сначала заполнить самому

Если вы преподаватель, то дайте такое задание своим студентам: попросите их заполнить все эти карточки на картинке ниже.

Если вы читаете этот текст как статью, то запишите на бумаге ваши ответы с MAC и IP адресами каждого фрейма на картинке и только затем читайте дальше. Проверьте себя.

Заполните сами данные поля заголовков фреймов перед тем как продолжить читать ответы
Заполните сами данные поля заголовков фреймов перед тем как продолжить читать ответы

Будем исходить из того, что клиент и сервер уже передавали друг другу данные, и поэтому все нужные ARP таблицы и таблицы маршрутизации настроены на всем пути от клиента к серверу. У клиента маршрутизатором по умолчанию является адрес 10.1.1.1, соответственно MAC адрес у этого IP адреса уже был запрошен в одном из ранее отправленных ARP запросов и в ARP таблице клиента есть информация о MAC адресе для IP адреса 10.1.1.1. Маска сети везде /24.

Заполняем первый фрейм данными IP и MAC адресов

Фрейм от клиента
Src MAC - MAC адрес отправителя
Dst MAC - MAC адрес получателя
Src IP - IP адрес отправителя
Dst IP - IP адрес получателя
Фрейм от клиента Src MAC - MAC адрес отправителя Dst MAC - MAC адрес получателя Src IP - IP адрес отправителя Dst IP - IP адрес получателя

Полагаю, что вы понимаете какие во фрейме от клиента будут IP адреса источника и получателя - они ведь даны в условии задачи: мы хотим отправить данные с IP адреса 10.1.1.11 на IP адрес 10.1.3.33. Поэтому эти адреса и вписываем в IP заголовок.

Автор встречал студентов, которые пишут IP адресом получателя IP адрес следующего маршрутизатора (в данном примере - это 10.1.1.1). Это ошибка. У нас всегда во всех фреймах на всем протяжении движения по сетям в поле IP заголовка будут только IP адреса источника и получателя.

  • Если вы напишете другой адрес и отправите, то маршрутизатор не будет знать настоящий адрес получателя и не сможет в таблице маршрутизации увидеть куда направлять пакеты.

  • Если вы напишете другой IP адрес источника, то маршрутизатор не будет знать куда возвращать ошибки их доставки в случае чего

При этом, IP адреса во фреймах могут меняться в случае появления по пути движения фреймов устройства с включенным source или destination NAT. Но в данной задаче такое устройство выполняющее трансляцию адресов нигде не указано.

Также легко понять какой у нас будет MAC адрес отправителя: это MAC адрес нашего клиента: 0000.0001.1111.

Какой написать MAC адрес получателя?

Поскольку это самая важная часть текста, то выделил в отдельную главу.

Какой MAC адрес получателя написать во фрейме исходящем с интерфейса Client?
Какой MAC адрес получателя написать во фрейме исходящем с интерфейса Client?
  • Иногда люди думают, что MAC адресом получателя во фрейме исходящем с порта клиентского компьютера будет именно MAC адрес сервера, а именно 0000.00008.8888. Если вы создадите такой фрейм и отправите с интерфейса компьютера клиента в сторону свитча, то фрейм реально попадет в широковещательный домен доступный через коммутатор в левой части картинки. Коммутатор получит данный фрейм, проверит в своей MAC address table, что такого MAC адреса в его таблице нет и отправит этот фрейм сразу на все свои порты. Этот фрейм в итоге, дойдет до роутера в левой части картинки сверху, на котором MAC адрес другой (0000.0003.3333) и роутер просто отбросит этот фрейм, потому что этот фрейм не по адресу. Такой фрейм до сервера просто не дойдет.

  • Иногда люди думают, что MAC адресом получателя будет MAC адрес свитча. Когда свитч получит этот фрейм, то он увидит, что фрейм предназначен именно ему и скорее всего просто убьет его (может зависеть от производителя), ведь фрейм уже дошел и ему непонятно что с ним делать, ведь это коммутатор, а не роутер. И тут мне еще интересно, а откуда вы знаете на компьютере клиента данный MAC адрес коммутатора? Ведь MAC адрес порта коммутатора вам неизвестен - коммутатор никаким образом не сообщает этот адрес подключенным устройствам.

Правильный ответ: нужно указывать MAC адрес роутера, который является вашим маршрутизатором по умолчанию. У вас IP адрес маршрутизатора по-умолчанию задан в таблице маршрутизации при настройке компьютера или получен от DHCP сервера. И соответственно компьютер Client заранее сделал ARP запрос и узнал MAC адрес соответствующий IP адресу роутера. Именно этот MAC адрес и надо подставлять в поле Destination MAC address.

В результате данный фрейм от клиента попадает на свитч. Ключевая информация здесь, что коммутатор не меняет при прохождении через себя ни MAC адреса, ни IP адреса. При этом свитч хранит у себя таблицу на каком интерфейсе какие MAC адреса подключены и знает на каком интерфейсе находится у него нужный нам следующий маршрутизатор 0000.0003.3333. И фрейм отправляется уже после коммутатора на маршрутизатор (неизмененным), где благополучно принимается на интерфейсе маршрутизатора, ведь получатель указал именно его MAC адрес.

Я специально нарисовал на данной схеме коммутатор, потому что хотел показать читателям важную информацию: ни MAC адреса ни IP адреса в заголовках фреймов на свитчах не меняются. Также важно заметить, что коммутатор не надо указывать в поле destination MAC address.

Иногда студенты спрашивают: почему не указан на картинке MAC адрес верхнего интерфейса коммутатора слева. И вы уже знаете ответ: потому что это неважно. В поле Source MAC address будет стоять MAC адрес интерфейса клиентского компьютера, а не интерфейса коммутатора - коммутатор не меняет ни destination, но source MAC адрес в заголовках фреймов. Три раза повторил, да? )

Правильный ответ

В итоге конечная картинка будет выглядеть так. Вы видите, что IP адреса в заголовке IP внутри фрейма всегда одинаковые, а вот MAC адреса меняются на MAC адреса всех интерфейсов имеющих IP адрес. Именно так работает сеть на основе Ethernet. По пути между маршрутизаторами могут быть и другие порты: серийные, frame relay, ATM. Нужно понимать, что MAC адрес применим только к протоколу Ethernet. Разные протоколы канального уровня используют разные схемы адресации, например, протокол Frame relay использует номер DLCI, а протокол ATM использует VPI/VCI. Сегодня говорим только про Ethernet. В настоящей сети все эти фреймы вы можете посмотреть сниффером, подключившись на SPAN порт любого из этих устройств, или воспользоваться TAP устройствами или даже сетевыми брокерами. Если это виртуализация, то используйте vTAP или vBroker.

Схема передачи фреймов по сети от клиента к серверу. Синим помечены адреса клиента. Красным адреса сервера.
Схема передачи фреймов по сети от клиента к серверу. Синим помечены адреса клиента. Красным адреса сервера.

А что будет, если я добавлю в эту сеть NGFW?

Давайте поместим на данную схему NGFW, который будет защищать подключения от клиентов к серверу. Во-первых нужно понимать, что NGFW сам будет являться маршрутизатором для сети. У него будут IP адреса на интерфейсах и MAC адреса. И тогда схема прохождения фреймов будет аналогичной схеме через роутер.

Схема передачи фреймов в сети с NGFW с включенной маршрутизацией
Схема передачи фреймов в сети с NGFW с включенной маршрутизацией

Автора иногда озадачивают запросы проверять на NGFW MAC адреса. Посмотрите внимательно на картинку. На NGFW видны только MAC адреса ближайших роутеров. И вы никогда не сможете получить фрейм с настоящим MAC адресом клиента или сервера. Проверки по MAC адресам сделать можно, но там будет либо написано в этом поле any, либо MAC адрес вашего роутера или роутера провайдера.

А если я хочу фильтрующий мост?

Если изменить картинку выше и подключить NGFW не как роутер (Layer 3 устройство), а как коммутатор (Layer 2 устройство) или как виртуальную линию (Layer 1 устройство), то NGFW на самом деле будет называться фильтрующий мост, согласно типовой классификации межсетевых экранов. И тут мы все-равно понимаем, что фильтровать можно будет только устройства, которые непосредственно подключены к NGFW или напрямую, или через коммутатор. Такое, в принципе, бывает в SCADA сетях, но в Интернет все устройства L3 и по MAC адресам фильтровать их не получится. В SCADA логичнее тогда сделать VLAN Insertion и разделить один broadcast domain на несколько разными VLAN и сделать замену тегов VLAN на самом NGFW. Пример описан в данной видеолекции.

Схема передачи фреймов в сети с межсетевым экраном уровня L2 (прозрачным для L3 уровня)
Схема передачи фреймов в сети с межсетевым экраном уровня L2 (прозрачным для L3 уровня)

Выводы

Мне бы хотелось, чтобы теперь все знали, что:

  • При перемещении IP пакетов по сети, коммутаторы не подставляют свои MAC адреса в фреймы (кадры) Ethernet.

  • При перемещении IP пакетов по сети, каждый маршрутизатор подставляет свои собственные MAC адреса и наши снифферы или анализаторы трафика (например системы защиты NTA) видят MAC адрес ближайшего маршрутизатора, а не реального хоста.

  • Нет смысла в фильтрации по MAC адресам, кроме работы внутри одной локальной сети или одного широковещательного домена.

Еще будет меняться поле TTL и контрольные суммы, и это можно обсуждать отдельно.

Комментарии (23)


  1. ivanrt
    26.12.2022 09:27

    Я вообще неправильно распарсил заголовок статьи. Думал какие-то несимметричности клиент->сервер и обратно. Думал, чтобы это могло быть.

    Фильтровать нужно было в рамках gretap туннеля чтобы объединить две IP сети в одну через wifi bridge, чтобы был общий broadcast адрес и работало в Minecraft LAN discovery локальных серверов.


    1. ksiva Автор
      26.12.2022 10:15

      Minecraft использует UDP мультикаст на IP адрес 224.0.2.60 и порт 4445. Мультикаст по IP адресам распространяется через маршрутизауторы, поэтому туннелирование ethernet заголовков через gretap будет лишним, на мой взляд.


      1. ivanrt
        26.12.2022 11:57

        Если машины были в разных IP сетях то локальные сервера не показывались на машинах другой сети. А сделать bridge через wifi я не смог - нельзя анонсировать несколько IP адресов на одном wifi хосте, по крайней мере если это raspberry pi. Поэтому сделал gretap туннель чтобы соединить сети за RPI на уровне ниже IP. Не знаю, может можно как-то проще сделать.


        1. mayorovp
          26.12.2022 13:48
          +2

          А ведь можно просто настроить хождение мультикаст-пакетов между сетями...


          1. ivanrt
            26.12.2022 15:17

            Спасибо за идею. Попробую.


    1. ksiva Автор
      26.12.2022 10:31
      +1

      Про gretap не знал, спасибо! Интересно, что можно даже Ethernet заголовок туда поместить.


      1. mayorovp
        26.12.2022 13:46
        +1

        Что значит "даже"? Это как бы основное отличие tap от tun — первый инкапсулирует кадры (2й уровень), второй — пакеты (3й уровень).


        1. ksiva Автор
          26.12.2022 14:11

          именно это и имел в виду, что даже инкапсулирует кадры, где есть Ethernet заголовок.


  1. MonkAlex
    26.12.2022 09:33
    +1

    Файлы перемещают роутеры?

    Хороший вопрос, никакой из передаваемых мной файлов не переместил мой роутер даже по столу. И айпи в сети интернет остался без изменений. И даже айпи в сети провайдера те же. Так что ответ - никак.


    1. ksiva Автор
      26.12.2022 09:59

      Даже tftp не работает у вас? ;-)


      1. MonkAlex
        26.12.2022 10:04

        Должен, судя по описанию =)


        1. ksiva Автор
          26.12.2022 10:21

          значит какие-то файлы все-таки передаются ;-)


          1. MonkAlex
            26.12.2022 10:25

            Хм, я может недостаточно явно описал, что смутило.

            В заголовке "файлы перемещают роутеры". Файлы выполняют функцию перемещения над роутерами =)

            Да, можно на русском это читать наоборот - но таки не общепринято.


            1. ksiva Автор
              26.12.2022 10:37
              +2

              какое посоветуете название для статьи? сидел мучался как раз над этим )


              1. Mogidin
                26.12.2022 10:42
                +2

                поменять местами. как роутеры перемещают файлы


  1. dmitryrf
    26.12.2022 14:46
    -1

    Мне кажется очень неправильным, что у вас фреймы содержат IP-адреса. По-моему, фреймы и пакеты надо рассматривать отдельно.


    1. ksiva Автор
      26.12.2022 17:26

      Привет! Каждый фрейм содержит внутри себя все заголовки вышележащих протоколов. Это было описано в предыдущей статье: https://habr.com/ru/post/707674/


      1. victor_1212
        26.12.2022 19:17
        -2

        чего бы не использовать терминологию OSI?

        типа pdu как общий термин, frame строго для уровня 2, возможно Вы это и имеете в виду, но выглядит не вполне отчетливо,

        imho, Дмитрий прав в том смысле, что желательно рассматривать отдельно потому как frame имеет отношение именно к синхронизации приемника и источника, что необходимо для приема сигнала, а не к логической иерархии протоколов

        ps

        статья конечно полезная как ликбез, если у автора в будущем будут вопросы и желание пишите в личку, протоколов в живой сети видеть пришлось примерно "google", в том числе экзотических, реализовывать тоже :)


        1. victor_1212
          26.12.2022 21:45

          просьба к минусовавшему - может быть у Вас найдется характера отправить в личку сообщение с чем именно Вы не согласны?

          типа похожая история - примерно пару лет назад появилась эдесь статья про protocol analyzer, не очень сильная, вежливо предложил автору если требуется помощь, упомянул что когда-то написал практически все интерпретаторы osi protocol suite (типа IS-IS, X.400, X.500 и пр.) , немедленно минус в карму такой был ответ, вобщем мне без разницы, но таки любопытно что именно не понравилось в комментарии, что же сделаешь если сетями начал заниматься когда половина участников еще не родилась, как именно ethernet frame работает узнал в свое время от авторов патента, а не из книг (соседи были по cubicle) :)


        1. ksiva Автор
          27.12.2022 09:05

          Привет! Статья сугубо практическая, для тех кто реально занимается анализом трафика в сетях. Фрейм (кадр) Ethernet в этой статье рассматривается как структура данных, внутри которой есть поля IP протокола. И мы изучали как меняются поля с адресами внутри этой структуры данных, которая передается от хоста к хосту. Саму структуру фрейма, включая скриншоты со структурой фреймов из wireshark я изобразил в статье https://habr.com/ru/post/707674/ Посмотрите, пожалуйста, внимательно. Слово Frame используется в самой утилите Wireshark для обозначения того же самого. https://wiki.wireshark.org/Protocols/frame


          1. victor_1212
            27.12.2022 17:17

            Привет, то что статья учебная это очевидно, кстати полезная.

            Вы не совсем меня поняли, в том смысле что отсылка к терминологии wireshark это скорее для студентов, когда еще не было wireshark даже в планах были другие инструменты (sniffer и пр.) в создании которых в частности пришлось участвовать, все рабочие документы всключая стандарты osi были у меня на столе + библиотека файлов wire capture с которой постоянно работали, историй того времени хватило бы на книгу, но статей здесь писать не буду, типа совсем, также никогда никого не минусовал независимо нравится или нет, так время от времени мелкие замечания не более,

            большая часть истории сети прошла перед моими глазами, начиная от личного общения с людьми из bbn на ранних стадиях, кое в чем участвовал, таких людей сейчас осталось немного (конечно не в россии), у Вас была возможность общаться с одним из них, примерно так

            ps

            между делом прочел Ваши статьи и комментарии, так что более-менее представление о Вашем профессиональном уровне и интересах у меня есть


        1. mayorovp
          27.12.2022 09:53

          Так что не так с терминологией OSI-то?


          Кадр у себя внутри содержит пакет IP целиком, в том числе и заголовки. От смены терминологии эти заголовки не пропадут.


          1. ksiva Автор
            27.12.2022 09:58

            Привет! Не понял вопроса. Что нужно объяснить?
            UPD: а вижу, что это не мне был вопрос. )