69

Как сделать Raspberry Pi доступным из любой точки мира

Введение


В прошлой статье я рассказал о том, как развернуть домашнее облачное хранилище на базе подготовленного командой cusdeb.com образа для Raspberry Pi 2 и 3 с предустановленным Nextcloud 11 (кстати, совсем недавно мы обновили образ до 12-й версии), а прямо сейчас я расскажу о том, как делать сервисы наподобие Nextcloud доступными извне. Несмотря на то, что на протяжении всей статьи упоминается Raspberry Pi, ничего из сказанного здесь не ограничивает вас в использовании любого другого устройства.


«Белые» динамические и статические IP-адреса


Все IP-адреса протокола IPv4 делятся на «белые» (более формально – публичные, глобальные или внешние) и «серые» (более формально – частные, локальные или внутренние). К устройству с «белым» IP-адресом можно получить доступ из любой точки мира, т.к. «белые» IP-адреса маршрутизируются в Интернете, в отличие от «серых» IP-адресов.

«Белые» IP-адреса, в свою очередь, делятся на динамические и статические. Динамические «белые» IP-адреса являются сегодня большой редкостью, но если вам все-таки повезло, то у вас есть возможность с небольшими трудозатратами абсолютно бесплатно сделать свой RPi (или любую другую машину) доступным через Интернет. Дело в том, что сервис NO-IP позволяет зарегистрировать домен третьего уровня и посредством специального клиентского ПО в фоновом режиме отслеживать изменение вашего динамического IP-адреса и при необходимости обновлять DNS, чтобы ваша машина была всегда доступна по зарегистрированному вами домену.

Если у вас по той или иной причине нет динамического «белого» IP-адреса, то почти наверняка у вас есть возможность купить у вашего провайдера «белый» статический IP-адрес. На самом деле это является наиболее надежным и наименее трудозатратным решением. Вот расценки трех провайдеров, которые у меня всегда на слуху.

* ТТК – 250 руб. в месяц

* Ростелеком – 50 руб. активация и 100 руб. в месяц

* Дом.ru – 450 руб. активация и 20 руб. в месяц


Если вы являетесь клиентом провайдера Дом.ru, то не спешите покупать у него статический «белый» IP-адрес, т.к. у вас определенно есть возможность получить динамический «белый» IP-адрес абсолютно бесплатно. Для этого убедитесь в своем личном кабинете, что у вас выключен NAT.


Проброс портов


Этот этап необходимо пройти в том случае, если у вас есть «белый» IP-адрес (вне зависимости от того, динамический он или статический). Основная идея здесь заключается в том, чтобы маршрутизатор, который стоит перед вашим RPi, принимал все запросы, а затем передавал их одноплатнику. Для каждого маршрутизатора эта процедура выглядит по-разному, и в Сети можно легко найти описание той, которая будет применима именно для вашего маршрутизатора. Вот как она выглядит для моего ZyXEL Keenetic DSL.

Для начала нужно назначить RPi статический адрес в локальной сети, чтобы при перезагрузке устройства маршрутизатор случайно не дал ему IP-адрес отличный от предыдущего. Для этого переходим на страницу «Домашняя сеть» и на вкладке «Устройства» выбираем свой RPi, подключенный к локальной сети. В появившемся диалоговом окне ставим галочку напротив «Постоянный IP-адрес».

Как сделать Raspberry Pi доступным из любой точки мира Raspberry pi, Своими руками, Длиннопост, Начинающий
Теперь можно выполнить сам проброс портов. Для этого переходим на страницу «Безопасность» и на вкладке «Трансляция сетевых адресов (NAT)» добавляем новое правило. В появившемся диалоговом окне указываем «Broadband connection (ISP)» в качестве «Интерфейса». Теперь все зависит от того, какой сервис нужно сделать доступным извне. В данном конкретном примере я рассмотрю Nextcloud, до которого в моей локальной сети можно дотянуться по адресу http://192.168.1.37:8001/nc. Таким образом, указываем «TCP» в качестве «Протокола» и говорим, что все запросы, которые приходят на 80-й порт маршрутизатора, нужно передавать на http://192.168.1.37:8001.
Как сделать Raspberry Pi доступным из любой точки мира Raspberry pi, Своими руками, Длиннопост, Начинающий
После этого сервис будет доступен через <белый IP-адрес>/nc без указания номера порта 8001. Если используется «белый» статический IP-адрес, то на этом можно остановиться. В данном случае последним штрихом может стать только регистрация домена, к примеру, на domain.com. Если же используется «белый» динамический IP-адрес, то сервис будет доступен до тех пор, пока не поменяется этот IP-адрес. Таким образом, необходимо воспользоваться услугами сервиса, предоставляющего услуги динамического DNS. В данной статье я предлагаю воспользоваться NO-IP.


NO-IP


Для начала работы с NO-IP перейдите на страницу регистрации, создайте Free'шную учетную запись, зарегистрируйте там же домен третьего уровня и активируйте вашу учетную запись. В качестве доменного имени я выбрал denismosolov.ddns.net. Также рассмотрите апгрейд вашего аккаунта с Free до Enhanced, иначе вам потребуется подтверждать ваш домен каждый месяц. (Тем не менее, лично мне цена $24.95 в год за эту услугу показалась слегка завышенной.) После этого я могу получать доступ к сервису, который крутится на моем устройстве, через denismosolov.ddns.net, но проблема с динамическим IP-адресом все еще остается актуальной. Для того чтобы RPi всегда был доступен по зарегистрированному домену, на него необходимо поставить специальное клиентское ПО. Если вы используете Raspbian, Debian, Ubuntu или любой другой дистрибутив GNU/Linux на своем одноплатнике, то я не рекомендую тратить время на официальный клиент от NO-IP под названием DUC (DNS Update Client). Во-первых, он не обновлялся с 2008-го года, а во-вторых, есть универсальное решение – inadyn, которое на данный момент поддерживает 25 сервисов, предоставляющих услуги динамического DNS, в числе которых NO-IP. К сожалению, несмотря на то, что пакет с inadyn есть в Debian и Ubuntu, он недостаточно актуален, хотя и поддерживает NO-IP в полной мере. Я предлагаю воспользоваться подготовленным мною Docker-контейнером с самой свежей версией inadyn или собрать контейнер самостоятельно, воспользовавшись проектом cusdeb-services.

Для того чтобы воспользоваться готовым контейнером, клонируйте проект, перейдите в поддиректорию inadyn этого проекта, раскомментируйте блок default@no-ip.com в конфигурационном файле inadyn.conf, добавьте в него параметры своей учетной записи и выполните docker-compose up.

$ git clone https://github.com/tolstoyevsky/cusdeb-services.git

$ cd cusdeb-services/inadyn

$ nano inadyn.conf

$ docker-compose up


После того как вы убедитесь в том, что клиент нормально стартовал и не жалуется на конфигурационный файл, который вы ему подсунули, убейте текущий интерактивный процесс и перезапустите контейнер командой docker-compose up -d. Теперь ваше устройство будет доступно из любой точки мира через Интернет.


IPv6-туннель


Я попытался сделать статью как можно более универсальной и на любой вкус, поэтому решил не останавливаться на паре описанных выше способах решить проблему доступности устройства через Интернет. Дело в том, что есть еще один способ – сделать свой сервер IPv6-only, но в этом случае у клиентов почти наверняка возникнут проблемы с доступом к нему, т. к. их провайдер до сих пор не сделал и шагу в сторону IPv6. Тем не менее, я расскажу об этом подходе, т. к. считаю, что в некоторых случаях он может оказаться очень полезным. К примеру, если вы поднимаете не массовый сервер и знаете своих клиентов в лицо. В этом случае вы можете раздать им простую инструкцию, которая бы рассказывала, как (бесплатно) воспользоваться услугами туннельного брокера для доступа к вашему и другим IPv6-only сервисам.

Для начала предлагаю убедиться в том, что вы все-таки не можете обращаться к IPv6-only сервисам, иначе все описанное далее будет для вас абсолютно бесполезным. Выполните на своем устройстве ping6 ipv6.test-ipv6.com. Если ответом стало «connect: Network is unreachable», то придется читать дальше. Если ipv6.test-ipv6.com все-таки пингуется, то поздравляю – или ваш провайдер поддерживает IPv6, или вы уже настроили работу с IPv6-only сервисами через туннельного брокера.

Teredo – это один из способов настройки поддержки IPv6 на компьютере, имеющем адрес IPv4. Teredo позволяет получить IPv6-туннель даже тем клиентам, которые выходят в Интернет через провайдерский NAT (т. е. имеют «серый» IP-адрес). Несмотря на то, что Teredo разрабатывался Microsoft только для Windows, существует реализация клиента под названием Miredo для Linux и других Unix-подобных операционных систем. Если вы используете на своем одноплатнике Raspbian, Ubuntu или любой другой Debian-подобный дистрибутив GNU/Linux, то установите Miredo следующей командой.

$ sudo apt-get install miredo

Теперь ping6 ipv6.test-ipv6.com должен возвращать ожидаемый результат. Вот так все просто. IP-адрес, который вы получили, является по определению «белым». Теперь вместо проброса портов нужно только открыть UDP-порт 3544. Дело в том, что Teredo инкапсулирует пакеты IPv6 в заголовках IPv4 и использует UDP-порт 3544 для передачи этих пакетов. Процедура открытия того или иного порта варьируется от маршрутизатора к маршрутизаторы. Вот как она выглядит для моего ZyXEL Keenetic DSL. Сначала переходим на страницу «Безопасность», а затем на вкладке «Межсетевой экран» добавляем новое правило, открывающее UDP-порт 3544.

Как сделать Raspberry Pi доступным из любой точки мира Raspberry pi, Своими руками, Длиннопост, Начинающий

Для того чтобы достучаться до вашего устройства, ваши клиенты могут также установить Miredo в любой Unix-подобной операционной системе (включая macOS) или настроить Teredo в Windows, но сейчас остаются нерешенными две проблемы:

* в данном конкретном случае IPv6-адрес зависит от IPv4-адреса, поэтому является динамическим (если конечно IPv4-адрес динамический)

* IPv6-адреса достаточно трудно запоминать.

Эти две проблемы легко решить посредством сервиса, предоставляющего услуги динамического DNS. Для этих целей предлагаю в этот раз воспользоваться dynv6, который, как и NO-IP, позволяет зарегистрировать домен третьего уровня и привязать его к динамическому IP-адресу. В качестве клиента, который в фоновом режиме будет отслеживать изменение вашего динамического IP-адреса и при необходимости обновлять DNS, предлагаю использовать inadyn, который также упомянуть упомянался в предыдущем разделе. Для того чтобы воспользоваться готовым контейнером с клиентом, клонируйте проект cusdeb-services, перейдите в поддиректорию inadyn этого проекта, раскомментируйте блок default@dynv6.com в конфигурационном файле inadyn.conf и измените в нем параметры username и hostname. Обратите внимание, что в качестве значения username необходимо использовать токен, который можно найти в настройках вашего домена на вкладке Instructions. Для параметра password нужно оставить значение «n/a».

$ git clone https://github.com/tolstoyevsky/cusdeb-services.git

$ cd cusdeb-services/inadyn

$ nano inadyn.conf

$ docker-compose up


Теперь ваше устройство будет доступно из любой точки мира, но для клиентов, у которых настроен IPv6.


Заключение


В этой статье я рассказал как сделать свое устройство, будь то одноплатник, ноутбук или стационарный компьютер, доступным из любой точки мира через Интернет. Также я рассмотрел как решить эту задачу посредством «белого» статического и динамического IP-адреса, и рассказал как сделать сервисы на своем устройстве IPv6-only через туннельного брокера. Не прошли незамеченными и сервисы, предоставляющие услуги динамического DNS, которые предлагаю абсолютно бесплатно регистрировать домены третьего уровня, привязывать их к своему IP-адресу и сохранять устройство доступным по этому домену несмотря на то, что IP-адрес может в любое время измениться.

К сожалению, за бортом осталась важная тема получения сертификата через сервис Let's Encrypt для того, чтобы устанавливать защищенное соединение между вашим сервером и клиентами. Дайте знать в комментариях, если эта тема нуждается в том, чтобы я о ней также написал на Пикабу.

Спасибо!

Arduino & Pi

1.5K постов20.8K подписчиков

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

0
Автор поста оценил этот комментарий

Вопросов тьма, но чую, что сначала надо почитать мануалы.  Всё таки уточню.

Что делает эта команда

docker build -t cusdeb.com:5000/inadyn-armhf .

При её выполнении много чего скачивается, проверяется и т.п. и в коце пишет это


checking for strcasecmp... yes
checking for strdup... yes
checking for strndup... yes
checking for setenv... yes
checking for unsetenv... yes
checking for _putenv... no
checking that generated files are newer than configure...

ну и остаётся


и необходим ли после неё запускать это

$ docker-compose up

как я понимаю, данная команда выполняет что-то запакованное в контейнере

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Эта команда создаёт контейнер. При этом, внтури контейнера выполняются вот эти команды: https://github.com/tolstoyevsky/mmb/blob/master/inadyn/Docke...

0
Автор поста оценил этот комментарий

Отлично, малинка пингуется с интернета, осталось понять, как ей управлять)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Отлично. Если буду еще вопросы, пишите на eugulixes@cusdeb.com.
показать ответы
0
Автор поста оценил этот комментарий
в нашем registry сейчас нет inadyn

Понять бы, что это значит, чего-то нет в каком-то регистре :).


В общем уже такая ошибка

pi@raspberrypi:~/cusdeb-services/inadyn $ docker build -t cusdeb.com:5000/inadyn-armhf .
Sending build context to Docker daemon 8.704kB
Step 1/8 : FROM hypriot/rpi-alpine-scratch
---> f87d69083db4
Step 2/8 : COPY qemu-arm-static /usr/bin/qemu-arm-static
COPY failed: stat /var/lib/docker/tmp/docker-builder132086519/qemu-arm-static: no such file or directory
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Исправил. Выполните

git pull

docker build -t cusdeb.com:5000/inadyn-armhf .

показать ответы
0
Автор поста оценил этот комментарий

Вопрос, при выполнении команды:

$ docker-compose up

выходит следующая ошибка, пробовал прокинуть порт 5000 и даже прямое соединение делал, не решает проблему. (а вообще можно было и написать, что перед этой командой надо поставить (Dokcer compose).

ERROR: Get https://cusdeb.com:5000/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Проблема в том, что в нашем registry сейчас нет inadyn, поэтому соберите его командой

docker build -t cusdeb.com:5000/inadyn-armhf .

(Это предпочтительнее, даже если бы образ был в нашем registry.) После этого выполните $ docker-compose up и вы не получите указанную ошибку.

показать ответы
0
Автор поста оценил этот комментарий

Не понял, что вы хотите исправить, у меня пока всё работает, а как говориться "работает - не тронь" :). С работы удаленно хорошо управляется :).


Команда docker-compose up

Ага, это я понимаю.

позволяет собрать Docker-образ, в котором будет актуальная версия inadyn. При этом в процессе подготовки Docker-образа, inadyn будет собираться из исходных текстов, поэтому

И скачивает и собирает одной командой? Как я понимаю, все инструкции для этого лежат по указанной ссылке?

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
И скачивает и собирает одной командой?

Да.


Как я понимаю, все инструкции для этого лежат по указанной ссылке?

Да. Кстати, там же описан и запуск inadyn. К примеру:

ENTRYPOINT ["/usr/local/sbin/inadyn", "--foreground"]
CMD ["--loglevel=info"]
0
Автор поста оценил этот комментарий

Вопросов тьма, но чую, что сначала надо почитать мануалы.  Всё таки уточню.

Что делает эта команда

docker build -t cusdeb.com:5000/inadyn-armhf .

При её выполнении много чего скачивается, проверяется и т.п. и в коце пишет это


checking for strcasecmp... yes
checking for strdup... yes
checking for strndup... yes
checking for setenv... yes
checking for unsetenv... yes
checking for _putenv... no
checking that generated files are newer than configure...

ну и остаётся


и необходим ли после неё запускать это

$ docker-compose up

как я понимаю, данная команда выполняет что-то запакованное в контейнере

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я хочу исправить свой предыдущий ответ, т. к. мне сейчас сильно не нравится то, что там написано.

Дело в том, что в Raspbian Stretch находится протухшая версия inadyn. Команда


docker build -t cusdeb.com:5000/inadyn-armhf .

позволяет собрать Docker-образ, в котором будет актуальная версия inadyn. При этом в процессе подготовки Docker-образа, inadyn будет собираться из исходных текстов, поэтому


При её выполнении много чего скачивается, проверяется и т.п.

Команда docker-compose up необходима для того, чтобы запустить контейнер, в котором будет запучена inadyn.

показать ответы
1
Автор поста оценил этот комментарий
А почему бы не настроить DDNS на самом кинетике?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Для IPv4 это сработало бы, а для IPv6 (через IPv6-туннель) -- нет. Поправьте, если я ошибаюсь. Клиент inadyn на самом устройстве выглядит как универсальное решение для обоих случаев.

показать ответы
0
Автор поста оценил этот комментарий

Насколько быстро и надежно это всё работает?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Самый надежный и быстрый способ -- купить у провайдера "белый" статический ip'шник. Это не очень дорогое удовольствие. Второй по надежности и быстроте способ -- воспользоваться "белым" динамическим ip'шником и сервисом NO-IP. Но не у всех есть такая возможность. IPv6-туннель, третий способ, я бы отнес к экспериментальным, но по моим наблюдениям это работает досточно стабильно, но не всегда безопасно.

показать ответы