Статья

Метод обхода сетевой изоляции контейнера HASS.io в Docker

В качестве предисловия хочу предупредить, что это моя первая статья. И написана она исключительно для экономии времени тех, кто будет топтаться по тем же граблям, что и я.

И хочу особо выделить тот момент, что метод не будет работать для счастливых обладателей Hass.io в качестве операционной системы. Нужен только образ Hass.io в Docker.

К тому же, я ещё не постиг дзена, как некоторые другие авторы сайта, поэтому уровень моей IT-подготовки далек от желаемого. Поэтому прошу снисходительно отнестись к экстравагантным методам реализации моего умного дома.

Недавно я решил добавить в свою пресную жизнь перчинки и перейти от Home assistant, установленого в качестве пакета в venv, к Hass.io, установленого в Docker. Благо материалов по этому поводу на сайте предостаточно.

Правда, после развертывания системы и восстановления файлов конфигурации от старой установки выяснилось, что Hass.io, хоть и подкупающе красочный,благодаря обилию плагинов, но ещё и очень параноидальный.

Он наотрез отказывался исполнять ssh запросы моих command_line сенсоров shell_command изнутри контейнера.

Опрос home-assistant и telegram комьюнити показал, что сетевая изоляция Hass.io - это один из аспектов сетевой безопасности, которые многие поддерживают (а может просто смирились). Немногие несогласные с этим поведением написали несколько статей по методам партизанской борьбы.

Одна из них более недоступна (но мне кажется, что это её копипаста).

Другая - напоминает записки на полях одного сумасшедшего ученого - другому (по крайней мере, для меня).

После вольного осмысления описанных в них методов, родилось рабочее решение, которое переживает перезапуск контейнера. Им я и спешу поделиться.

От монтирования чего-то в готовый контейнер мне, после нескольких попыток, пришлось отказаться (не получилось).

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

Ещё раз обращу внимание владельцев Hass.io как операционной системы, по ошибке дочитавших до этого места. Этот метод не для вас. У вас просто нету "дружелюбной среды". Вам некуда прокидывать ключи.

Алгоритм

  • Узнаем ID необходимого нам контейнера с Home Assistant. Можно и через интерфейс Portainer, но он там какой-то слишком здоровый. Через run компактнее.

pi@raspberrypi:~ $ docker ps -a

В моем случае - это b4a144826c5a.

  • Подключаемся к нужному контейнеру и с этого момента все действия по генерации ключей совершаем из него (обратите внимание на вид строки ввода команд).

pi@raspberrypi:~ $ docker exec -it b4a144826c5a /bin/bash

  • Создаем ключи аутентификации.

bash-5.0# ssh-keygen

  • И записываем их на локальную машину (где крутится Docker).

bash-5.0# ssh-copy-id -i ~/.ssh/id_rsa.pub UserName@RemoteServer

Где UserName - ваш пользователь на локальной машине, а RemoteServer - адрес машины в локальной сети.

В моем случае, это выглядит вот так.

bash-5.0# ssh-copy-id -i ~/.ssh/id_rsa.pub pi@192.168.2.10

  • После этих действий у вас уже должна появится возможность ходить из докера на локальную машину без пароля.

bash-5.0# ssh pi@192.168.2.10 Linux raspberrypi 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l The programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.Last login: Thu Oct 3 15:23:00 2019 from 192.168.2.10 pi@raspberrypi:~ $

  • Если все получилось - то с этого момента все ваши сенсоры и команды по ssh изнутри Hass.io будут нормально работать, после добавления к ним такой обвязки.

ssh UserName@RemoteServer 'команда'

В моем случае, вот так (определение степени загаженности торрент-диска на роутере).

Пример не самый удачный (можно ключ сразу на 192.168.1.1 кинуть), но самый короткий из моего арсенала.

- platform: command_line #Torrent disk full name: Torrent disk space scan_interval: 2400 command: ssh pi@192.168.2.10 'ssh pi@192.168.1.1 -p 222 df -h | grep /dev/sdb1 | cut -d G -f 4 | cut -c 3-4' unit_of_measurement: "%"

Буду рад, если удалось сэкономить кому-то время и нервы.

И конструктивной критике.


А что, --network host как-то плохо работает?

Разве --network=host не для того, чтобы стек сети контейнера в режим хоста перевести? Или я не правильно понял вопрос?

Это для того, чтобы контейнер использовал сеть хоста. Не будет внутренней подсети и той самой "изоляции"

А супервизор Хасса эту штуку не пофиксит после перезагрузки?

Если честно - не пробовал, поскольку, когда искал решение, такого метода мне под руку не попалось. Вот и ушел на темную сторону силы :)

Если под дружелюбной средой вы понимаете ssh на хост машину, то в hassio он есть.

Имеется ввиду не подключения по ssh, а возможность выполнения скриптов по ssh из Hass.io, а там затык из-за ввода пароля. А так да, ssh есть.


Вернуться назад
Вернуться назад