Мой домашний датацентр, часть 2: сетевые приключения

Так как мой домашний датацентр заслуживает быть геораспределенным, настало время поднимать вторую реплику в другой локации. Это породило определенную цепочку зависимостей, во главе которых было заменить унылый провайдерский роутер на что-то более веселое и оживленное. Например, на новенький роутер Mikrotik. Как положено настоящему системному администратору, даже дома должен быть церебральный секс. Казалось бы, взял коробочку, воткнул в розетку, и оно должно заработать, да?

Нетрудно догадаться, что если бы все решалось именно так, я бы не писал этот пост…

Что имеем

Для того, чтобы поиграться с распределенными системами, Syncthing, рассказывать всем, как мой Git-сервер1 отказоустойчив, и мои несчастные два репозитория могут пережить любые катаклизмы, надо было поднять второй датацентр2 в новой локации. Для этого надо было, чтобы я мог пробрасывать на него порты с моего роутера. К сожалению, роутер, предоставляемый провайдером, настолько Plug’n’Play, что у него нет даже админки. То есть не то, что пробросить порты, я даже не могу поменять пароль на вайфай, и вопросы гостей “а какой у тебя пароль” неизменно заканчиваются броском коробки из-под роутера. Совершенно неприемлемо для дома айтишника.

Пробуем с наскока

Из интернет-магазина за бешеные деньги заказывается Mikrotik, достается из экологичной картонной коробочки, и втыкается в розетку. Консультация с руководствами от провайдера показывают, что достаточно включить DHCP режим, и внешний IP-адрес должен прилететь сам. Консльтация с реальностью показала, что это далековато от правды. На роутер прилетал IP-адрес вида 10.23.32.553, и попытки попасть во внешний мир успеха не имели. Налицо какое-то различие конфигураций. К сожалению, детальный анализ оказался невозможен, потому что посмотреть на сетевые настройки на роутере без админки - дело непростое.

Первая идея - фильтрация по MAC-адресу роутера. Звонок в техподдержку провайдера, объяснение, что я купил новый роутер, меня просят назвать его MAC, он заносится в базу, теперь надо всего лишь перезагрузить. Безуспешно, новый IP-адрес слабо отличается от предыдущего своей бесполезностью. Зато старый роутер теперь тоже не работает! Спесь сбита, робкая просьба вернуть все как было, размышления о тщетности бытия.

Вторая идея - мой роутер слишком умный, и более рабоче-крестьянские железяки со всем справятся из коробки. Благо у сочувствующих есть роутер на одолжить, который должен послужить непредвзятой третьей стороной, и показать, на чьей стороне правда. Розетка, провод, 10.32.14.78. Кажется, нужно доставать свитер с оленями, это задача, достойная сисадмина.

А вы точно хакер?

Каждый из этих роутеров делает примерно одинаковую задачу - отправляет DHCP-запрос, получает DHCP-ответ. Только вот один, похоже, получает нормальную информацию, а остальные два - какую-то нехристь. Как понять, в чем разница? Самое время послушать, а какие же запросы они отправляют, и что получают. Для этого мое скромное обиталище было подвержено обыску на предмет девайсов, в которых все еще есть Ethernet разъем. Ничего лучше, чем 6-летний геймерский ноут под рукой не оказалось. Есть, что есть, главное - чтобы на нем запускался Linux и tcpdump4. Основное опасение - драйвера от сетевой карты. Этот зверь иногда просит просто так переустановить их на винде, а уж что будет на линуксе…

Исходя из опыта macMini, у которого нормально работал проводной интернет, а вот беспроводная карточка требовала сильных колдунств, надо найти LiveCD, в котором есть нужные мне сетевые утилиты, и дальше надеяться, что можно просто воткнуть провод от роутера в компьютер, и все заверте. Первое, что пришло в голову - Kali Linux, который любят высмеивать за то, что это первый дистрибутив среди школьников, возомнивших себя хакерами. Но, в отличие от них, я действительно хакер5, и к тому же, у Kali есть опция LiveCD со всеми возможными пакетами. То, что надо.

На удивление, с Kali из коробки заработала сетевая карта целиком, то есть я мог слушать пакеты на проводном интерфейсе, и при этом скидывать собранные данные по локальной сети на основной компьютер вместо того, чтобы фотографировать экран телефоном. По очереди втыкаем каждый из роутеров, запускаем tcpdump -i eth1 -XX -vv, и смотрим, что получаем6:

# Провайдерская железка

11:24:30.938632 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 576)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from am:og:us:am:og:us (oui Unknown), length 548, xid 0xa6e955c, Flags [none] (0x0000)
	  Client-Ethernet-Address am:og:us:am:og:us (oui Unknown)
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message (53), length 1: Discover
	    Client-ID (61), length 7: ether am:og:us:am:og:us
	    Hostname (12), length 9: "AMOGUSGWS"
	    Vendor-Class (60), length 9: "AMOGUSGWS"
	    MSZ (57), length 2: 576
	    Parameter-Request (55), length 9:
	      Subnet-Mask (1), Default-Gateway (3), Domain-Name-Server (6), Hostname (12)
	      Domain-Name (15), BR (28), NTP (42), Vendor-Option (43)
	      Unknown (250)
	    END (255), length 0
	    PAD (0), length 0, occurs 258
	0x0000:  ffff ffff ffff amog usam ogus 8100 022b  ...............+
	0x0010:  0800 4500 0240 0000 0000 4011 78ae 0000  ..E..@[email protected]...
	0x0020:  0000 ffff ffff 0044 0043 022c dcee 0101  .......D.C.,....
	0x0030:  0600 0a6e 955c 0000 0000 0000 0000 0000  ...n.\..........
	0x0040:  0000 0000 0000 0000 0000 amog usam ogus  ................
	0x0050:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0060:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0070:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0080:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0090:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0100:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0110:  0000 0000 0000 0000 0000 6382 5363 3501  ..........c.Sc5.
	0x0120:  013d 0701 amog usam ogus 0c09 414d 4f47  .=..P...)O..AMOG
	0x0130:  5553 4757 533c 0941 3168 6f6d 6547 5753  USGWS<.AMOGUSGWS
	0x0140:  3902 0240 3709 0103 060c 0f1c 2a2b faff  9..@7.......*+..
	0x0150:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0160:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0170:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0180:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0190:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x01a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x01b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x01c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x01d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x01e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x01f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0200:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0210:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0220:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0230:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0240:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0250:  0000                                     ..
11:26:09.603508 IP (tos 0x0, ttl 16, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from am:og:us:am:og:us (oui Unknown), length 300, xid 0xcc2c34c4, secs 13, Flags [Broadcast] (0x8000)
	  Client-Ethernet-Address am:og:us:am:og:us (oui Unknown)
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message (53), length 1: Discover
	    Parameter-Request (55), length 8:
	      Subnet-Mask (1), Classless-Static-Route (121), Default-Gateway (3), Static-Route (33)
	      Domain-Name-Server (6), NTP (42), Unknown (138), Vendor-Option (43)
	    Hostname (12), length 8: "MikroTik"
	    Client-ID (61), length 7: ether am:og:us:am:og:us
	    END (255), length 0
	    PAD (0), length 0, occurs 27
	0x0000:  ffff ffff ffff amog usam ogus 0800 4500  ..............E.
	0x0010:  0148 0000 0000 1011 a9a6 0000 0000 ffff  .H..............
	0x0020:  ffff 0044 0043 0134 3536 0101 0600 cc2c  ...D.C.456.....,
	0x0030:  34c4 000d 8000 0000 0000 0000 0000 0000  4...............
	0x0040:  0000 0000 0000 amog usam ogus 0000 0000  ................
	0x0050:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0060:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0070:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0080:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0090:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0100:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0110:  0000 0000 0000 6382 5363 3501 0137 0801  ......c.Sc5..7..
	0x0120:  7903 2106 2a8a 2b0c 084d 696b 726f 5469  y.!.*.+..MikroTi
	0x0130:  6b3d 0701 amog usam ogus ff00 0000 0000  k=..P...)O......
	0x0140:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0150:  0000 0000 0000
11:27:54.803198 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 321)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from am:og:us:am:og:us (oui Unknown), length 293, xid 0x50b1d744, Flags [none] (0x0000)
	  Client-Ethernet-Address am:og:us:am:og:us (oui Unknown)
	  Vendor-rfc1048 Extensions
	    Magic Cookie 0x63825363
	    DHCP-Message (53), length 1: Discover
	    MSZ (57), length 2: 1500
	    Client-ID (61), length 7: ether am:og:us:am:og:us
	    Vendor-Class (60), length 6: "ndhcpc"
	    Hostname (12), length 13: "Keenetic_Lite"
	    Parameter-Request (55), length 11:
	      Subnet-Mask (1), Default-Gateway (3), Domain-Name-Server (6), Domain-Name (15)
	      BR (28), Static-Route (33), NTP (42), Vendor-Option (43)
	      Netbios-Name-Server (44), Classless-Static-Route (121), Classless-Static-Route-Microsoft (249)
	    END (255), length 0
	0x0000:  ffff ffff ffff amog usam ogus 0800 4500  ..............E.
	0x0010:  0141 0000 0000 4011 79ad 0000 0000 ffff  [email protected].......
	0x0020:  ffff 0044 0043 012d 2b22 0101 0600 50b1  ...D.C.-+"....P.
	0x0030:  d744 0000 0000 0000 0000 0000 0000 0000  .D..............
	0x0040:  0000 0000 0000 amog usam ogus 0000 0000  ................
	0x0050:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0060:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0070:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0080:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0090:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x00f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0100:  0000 0000 0000 0000 0000 0000 0000 0000  ................
	0x0110:  0000 0000 0000 6382 5363 3501 0139 0205  ......c.Sc5..9..
	0x0120:  dc3d 0701 amog usam ogus 3c06 6e64 6863  .=..P...)O<.ndhc
	0x0130:  7063 0c0d 4b65 656e 6574 6963 5f4c 6974  pc..Keenetic_Lit
	0x0140:  6537 0b01 0306 0f1c 212a 2b2c 79f9 ff    e7......!*+,y..

Особых отличий не видно. Где же секретный соус? Глаз опускается чтобы посмотреть на DHCP ответ, и видно что-то странное:

12:16:20.220634 IP (tos 0xc0, ttl 64, id 65483, offset 0, flags [none], proto UDP (17), length 374)
    10.31.64.1.bootps > 10.31.75.171.bootpc: [udp sum ok] BOOTP/DHCP, Reply, length 346, xid 0x57cf2878, Flags [none] (0x0000)
          Your-IP 10.31.75.171
          Gateway-IP 10.20.96.1
          ...
            Vendor-Option (43), length 41: 1.39.85.82.76.61.104.116.116.112.58.47.47.49.48.46.50.48.46.50.53.52.46.51.52.58.51.55.49.54.56.47.98.97.115.105.99.46.120.109.108
          ...
        0x0130:  2901 2755 524c 3d68 7474 703a 2f2f 3130  ).'URL=http://10
        0x0140:  2e32 302e 3235 342e 3334 3a33 3731 3638  .20.254.34:37168
        0x0150:  2f62 6173 6963 2e78 6d6c 420b 3130 2e32  /basic.xmlB.10.2

В DHCP-ответе приходит какой-то адрес с адресом XML, причем до этого адреса можно дотянуться из внутренней сети! Давай-те ка попробуем стянуть этот XML себе…

bash-5.1$ curl http://10.20.254.34:37168/basic.xml -v
*   Trying 10.20.254.34:37168...
* Connected to 10.20.254.34 (10.20.254.34) port 37168 (#0)
> GET /basic.xml HTTP/1.1
> Host: 10.20.254.34:37168
> User-Agent: curl/7.74.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host 10.20.254.34 left intact
curl: (52) Empty reply from server

Хм, никакого интересного ответа нет, сервер просто хлопнул дверью и закрыл соединение. А что если отправить ему вместо HTTP запроса ересь?..

bash-5.1$ telnet 10.20.254.34 37168
Trying 10.20.254.34...
Connected to 10.20.254.34.
Escape character is '^]'.
asdfasdfasdf
HTTP/1.1 400 Bad Request
Date: Mon, 07 Mar 2022 20:31:45 GMT
Server: orel-daemon
Content-Type: text/html
Content-Length: 57

<title>400 Bad Request</title>
<h1>400 Bad Request</h1>

Connection closed by foreign host.

Про орла-мужчину я еще слышал, а вот про орла-демона нет… Кажется, это какое-то сильное колдунство. Неужели роутер на самом деле по DHCP должен получать настройки из вот этого XML? Время свериться с интернетом.

К сожалению, мне не удалось найти никаких намеков на то, что кто-то еще, кроме этого провайдера использует basic.xml файл, очень похоже, что этот орел провел всю свою жизнь в их гнезде. Но как же получить его настройки? Наверное, надо отправить запрос с правильными хедерами. А кто знает хедера лучше провайдерского роутера?

Поднимаем локальный dnsmasq, настраиваем его, чтобы в качестве параметра Vendor-Option (43) отдавать адрес для поднятого локально сервера на питоне, логгирующего весь запрос. Подключаем роутер, ждем, пока он включится… А почему лампочки не зажигаются?

Лирическое отступление о блоках питания

Когда я посмотрел на блоки питания от трех роутеров под рукой, я подумал, что наконец-то люди собрались и стандартизировали разъемы питания даже для роутеров. Наконец-то он взаимозаменяемые, и можно втыкать любой шнур в любой роутер…

Нет. Блок питания провайдерского роутера рассчитан на 0.5 Ампера тока, от микротика - на 1 Ампер7. Странно, что не запахло жареным. И вообще, роутер от этого должен работать только лучше, я же накачал его волшебным дымом

Провайдер оказался на удивление быстрым (возможно, они испугались, когда я сказал, что сжег роутер), и через час у меня уже был такой же роутер, только новенький и рабочий. Сеть 5ГГц он терял через час работы совершенно так же…

Время продолжать эксперименты.

Охота на орла

Поднимаем dnsmasq, в этот раз уже на маке, так как нашелся переходничок на Ethernet. Почему-то несмотря на то, что в логе tcpdump DHCP реквесты от провайдерского роутера видно, dnsmasq на них не отвечал. Если втыкать другие роутеры, то все работало. Неужели ларчик так близко?..

Сваливаем странности поведения на macOS, поднимаем виртуальную машинку с Linux, просовываем Bridged интерфейс внутрь, слушаем пакеты. Та же история. Может, в интернете есть ответ?

Азино “три топора”

Да. Оказалось, что эти DHCP запросы не принимались, потому что пакеты были потеганы VLAN. Это означает, что сетевые интерфейсы, которые не настроены в явном виде принимать и обрабатывать эти пакеты, не будут этого делать. tcpdump видел их по той причине, что сетевой интерфейс переходил в режим монитора, но это не значит, что ядро станет их обрабатывать. tcpdump -e показал, что сетевое взаимодействие происходит в VLAN555. Быстрая настройка микротика8 с подменой MAC-адреса, и все работает! Эпопея длиной в неделю, наконец, завершена.

Жалко только одно - я так и не узнал, что же за орел, и какие данные он отдавал. Что бы я ни пробовал, у роутера не было никакого интереса лезть в мою ловушку за XML. Возможно, однажды я смогу открыть эту тайну, но пока что время продолжить работу над более насущными вопросами. Подозреваю, что реальных потребителей этой вундервафли уже нет, и эндпоинт существует исключительно по историческим причинам.


  1. Чтобы написать пост о нем, мне надо было сперва поднять новый датацентр. О гите ждите рассказа в ближайшее^tm время. ↩︎

  2. Иногда кажется, что я живу на складе macMini 2012 года. ↩︎

  3. 10.*.*.* - диапазон внутренних IP-адресов. ↩︎

  4. Да, подозреваю, что захват пакетов возможен и на винде, но руки уже привыкли к этим вашим линупсам. ↩︎

  5. For legal reasons, this is a joke. ↩︎

  6. Тут и далее часть данных будет замазана из соображений приватности. Марка провайдерского роутера на самом деле не AMOGUS. ↩︎

  7. Для не-физиков: это очень большая разница. ↩︎

  8. Позволю себе немного позларадствовать над теми, кто думал, что кинетик лучше микротика, ведь там влан не настраивается. ↩︎