Благодаря заметке Изучаем Ethernet-фреймы с помощью осциллографа теперь мы знаем, как физически осуществляется передача данных по Ethernet-кабелю. Однако описанный в посте подход не слишком удобен для полноценной отладки какого-то устройства, работающего с Ethernet . Есть несколько решений этой проблемы. Например, можно воспользоваться старым Ethernet-хабом (но нынче их не так-то просто найти) или настроить зеркалирование портов на Ethernet-свиче. Но в рамках этого поста мы рассмотрим альтернативное решение, которое заключается в использовании платы Throwing Star LAN Tap.
Плата была разработана Michael Ossmann (который также является создателем HackRF и других прекрасных проектов) в 2011 году. Как нам известно, в Ethernet-кабеле есть пара проводов для передачи данных в одну сторону, и еще пара для передачи в другую. Throwing Star имеет два Ethernet-разъема (J1 и J2), между которыми данные просто передаются как есть. Еще на два разъема (J3 и J4) дублируют данные, передаваемый от порта J1 к порту J2 и от порта J2 к порту J1 соответственно.
Вот как это выглядит:
Кабель от верхнего порта (J2) идет к роутеру с выходом в интернет, а кабель от нижнего порта (J1) — к ноутбуку. На левый порт (J4) приходят данные, идущие с ноутбука на роутер, а на правый (J3) дублируются фреймы от роутера к ноутбуку.
Помимо прочего, Throwing Star интересен своей компактностью, а также тем, что для работы ему не нужно никакого питания. Кроме того, плата практически не оказывает влияния на передаваемые данные. Нет никаких лишних задержек, как при использовании свича, потому что данным негде задерживаться. Если же мы случайно пошлем что-то на левый или правый порт, ничего страшного — передающие контакты у этих портов все равно ни с чем не соединены.
Из минусов — плата работает только для скоростей 10 Мбит/сек и 100 Мбит/сек. Связано это с тем, что в гигабитном Ethernet’е данные передаются одновременно в обе стороны по каждой паре проводов. По этой причине в Throwing Star предусмотрено два конденсатора на 220 пФ. Они работают, как фильтры нижних частот и не позволяют передавать данные со скоростью больше 100 Мбит/сек. Таким образом, два устройства, соединенных через Throwing Star, будут вынуждены работать на 10 Мбит/сек или 100 Мбит/сек.
Fun fact! Вы можете помнить, что стандарты 10baseT и 100baseT используют только две пары проводов, когда 1000baseT нужны все четыре. Тогда зачем использовать конденсаторы, если можно просто не соединять лишние провода? Дело в том, что по витой паре может передаваться и что-то отличное от Ethernet, например RS-232 , и использовать при этом все провода. Плата позволяет снифать и такие протоколы тоже.
Есть и другая проблема. Чтобы увидеть весь передаваемый трафик, нужно две сетевые карты, по одной на каждых из боковых портов. Большинство же компьютеров имеют только одну сетевую карту. К счастью, в наше время есть великое множество внешних сетевых карт, подключаемых по USB. Я использовал недорогую сетевую карту на базе чипа AX88772B , производимую Olimex:
AX88772B широко распространен и прекрасно работает с Linux. На eBay вы найдете сетевые карты других производителей, которые, согласно описанию, также основаны на этом чипе. Из интереса я заказал одну их таких сетевых карт. На деле устройство оказалось основанном на чипе Davicom DM9601. Но тоже работает.
Итак, давайте уже попробуем что-нибудь поснифать. Для этого обе сетевые карты следует перевести в promiscuous mode . В это режиме карта принимает любые пакеты, независимо от того, направлены ли они на ее адрес, или не на ее.
Соответствующие команды:
sudo ip link set enp0s20u3 promisc on
Теперь можно воспользоваться каким-нибудь tcpdump или Wireshark, как обычно. Я лично использовал самопальный снифер на базе libpcap :
# в другом терминале:
sudo . / eaxsniff enp0s20u3 tcp
На ноутбуке, подключенном к нижнему разъему Throwing Star, говорим:
Возвращаемся к окнам терминала со снифером. В первом терминале видим:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A GET / HTTP/1.1..
0010 48 6F 73 74 3A 20 65 61 78 2E 6D 65 0D 0A 55 73 Host: remontka.com..Us
0020 65 72 2D 41 67 65 6E 74 3A 20 63 75 72 6C 2F 37 er-Agent: curl/7
0030 2E 34 37 2E 30 0D 0A 41 63 63 65 70 74 3A 20 2A .47.0..Accept: *
0040 2F 2A 0D 0A 0D 0A /*….
Во втором:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000 48 54 54 50 2F 31 2E 31 20 33 30 31 20 4D 6F 76 HTTP/1.1 301 Mov
0010 65 64 20 50 65 72 6D 61 6E 65 6E 74 6C 79 0D 0A ed Permanently..
0020 53 65 72 76 65 72 3A 20 6E 67 69 6E 78 0D 0A 44 Server: nginx..D
0030 61 74 65 3A 20 4D 6F 6E 2C 20 32 32 20 4F 63 74 ate: Mon, 22 Oct
0040 20 32 30 31 38 20 30 39 3A 31 30 3A 30 39 20 47 2018 09:10:09 G
0050 4D 54 0D 0A 43 6F 6E 74 65 6E 74 2D 54 79 70 65 MT..Content-Type
0060 3A 20 74 65 78 74 2F 68 74 6D 6C 0D 0A 43 6F 6E : text/html..Con
0070 74 65 6E 74 2D 4C 65 6E 67 74 68 3A 20 31 37 38 tent-Length: 178
0080 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 ..Connection: ke
0090 65 70 2D 61 6C 69 76 65 0D 0A 4C 6F 63 61 74 69 ep-alive..Locati
00A0 6F 6E 3A 20 68 74 74 70 73 3A 2F 2F 65 61 78 2E on: https://eax.
00B0 6D 65 2F 0D 0A 0D 0A 3C 68 74 6D 6C 3E 0D 0A 3C me/….<html>..<
00C0 68 65 61 64 3E 3C 74 69 74 6C 65 3E 33 30 31 20 head><title>301
00D0 4D 6F 76 65 64 20 50 65 72 6D 61 6E 65 6E 74 6C Moved Permanentl
00E0 79 3C 2F 74 69 74 6C 65 3E 3C 2F 68 65 61 64 3E y</title></head>
… пропущено …
Как видите, все получилось! По завершении работы не забудьте выключить promiscuous mode.
На сайте greatscottgadgets.com перечислено множество магазинов , продающих Throwing Star. Поскольку проект является открытым, на eBay вы без труда найдете множество его клонов. Ну и в крайнем случае устройство всегда можно просто спаять из двух Ethernet-кабелей.