Родился я в одном городе, позже переехал жить в другой. В родном городе остался ПК, который стоит без дела. В один прекрасный день решил я из него сделать многофункциональную удаленную машину: чтобы и кодить, и файлы хранить, и сайты/ботов хостить. Идея мне понравилась, я накатил на машину линукс, поставил все валявшиеся без дела диски и начал все это проверять. Но тут оказалось, что в родительском доме интернет тариф не поддерживает возможность установки статического IP адреса по умолчанию - адрес выдается провайдером в случайные моменты времени. Это означало, что я не мог, например, хостить какой-нибудь сервер на этой машине. Более того, я даже банально не мог к ней по SSH подключиться после смены ее адреса.

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

В голову пришла идея...

Я думал над неким механизмом, который позволил бы мне узнать внешний IP адрес машины, не заставляя родителей учиться пользоваться командой ifconfig. И тогда в голову пришла идея написать телеграм-бота, который бы хостился на моей машине. Ведь к его интерфейсу доступ есть всегда, независимо от адреса ПК.

Итак, перейдем к боту. Мой основной язык на работе и для пет-проектов - C++. Поэтому для написания бота я взял библиотеку tgbot-cpp. Логика бота проста: получаем внешний адрес и отправляем его пользователю.

void OnGetIPCommandAction(TgBot::Message::Ptr message) const noexcept
try
{
    std::cerr << "[DEBUG] Processing getip command..." << std::endl;

    if (!IsUserLegal(message->from))
    {
        return;
    }

    const auto ip{GetExternalIP()};

    m_bot.getApi().sendMessage(message->chat->id, ip ? ip.value() : "Could not get IP");
}
catch (const std::exception& e)
{
    std::cerr << "[ERROR] " << __func__ << " failed: " << e.what() << std::endl;
}

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

Метод GetExternalIP отвечает за получение внешнего адреса. Для этого он идет в интернет и получает содержимое страницы http://myexternalip.com/raw, которая этот адрес содержит.

static 
std::optional<std::string> GetExternalIP()
{
    constexpr std::string_view URL = "http://myexternalip.com/raw";

    CURL* curlHandle{curl_easy_init()};
    if (!curlHandle)
    {
        return std::nullopt;
    }

    const static auto downloadFunc = [](char* ptr, size_t size, size_t nmemb, std::string* data) -> size_t
    {
        assert(data);
        auto& str = *data;

        try
        {
            str.append(ptr, size * nmemb);
        }
        catch(const std::exception& e)
        {
            std::cerr << "[ERROR] downloadFunc failed: " << e.what() << std::endl;
            return 0;
        }

        return size * nmemb;
    };

    std::string ipStr;
    curl_easy_setopt(curlHandle, CURLOPT_URL, URL.data());
    curl_easy_setopt(curlHandle, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curlHandle, CURLOPT_WRITEFUNCTION, (size_t(*)(char*, size_t, size_t, std::string*))downloadFunc);
    curl_easy_setopt(curlHandle, CURLOPT_WRITEDATA, &ipStr);

    if (const auto retcode{curl_easy_perform(curlHandle)}; retcode != CURLE_OK)
    {
        std::cerr << "[ERROR] " << "curl_easy_perform() failed: " << curl_easy_strerror(retcode) << std::endl;
    }

    curl_easy_cleanup(curlHandle);

    return ipStr;
}

Итак, бот написан, можно проверять.

Чат с ботом
Чат с ботом

Отлично, работает, как и было задумано. Осталось решить последнюю проблему. Бот должен запускаться вместе с компьютером, иначе толку от него ноль. Решение напрашивается само собой - сделаем бота системным демоном. Тут я не буду рассказывать про процесс их настройки, а лишь покажу содержимое минимального конфигурационного файла.

[Unit]
Description=MyPc Telegram Bot
Requires=network.target
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/pcbot
Restart=always

[Install]
WantedBy=multi-user.target

Готово. Теперь бот запускается вместе с компьютером, перезапускается в случае падения и по запросу сообщает его адрес. Теперь я могу использовать компьютер так, как изначально хотел.

Вывод

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

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

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


  1. Ivanii
    06.01.2024 19:30
    +57

    Dyn DNS?


    1. phaggi
      06.01.2024 19:30
      +3

      Так-то да… но если выбранный сервис ddns сломается/откажется работать со страной/захочет денег и т.п., то параллельный канал не помешает.

      Но так-то городить телеграм бота, когда можно просто сделать почтовый автоответчик… а можно и то и другое…


      1. vvzvlad
        06.01.2024 19:30
        +5

        когда можно просто сделать почтовый автоответчик… а можно и то и другое…

        Зачем городить почтовый автоответчик, когда можно позвонить жене и спросить IP-адрес?


    1. sedyh
      06.01.2024 19:30

      Скорее обычный STUN сервер.


      1. qw1
        06.01.2024 19:30
        +2

        Нет, STUN сервер не позволит узнать текущий ip-адрес машины, которая где-то там включилась и мы не знаем её ip-адрес, и она не знает наш ip-адрес.


    1. boba_boba
      06.01.2024 19:30

      Провайдеры блокируют доступк серверу через серый IP. Без туннеля здесь не обойтись. И знание текущего IP, и dyn dns здесь не помогают.


      1. Aelliari
        06.01.2024 19:30

        Не в случае автора, иначе бот в телеге ему бы никак не помог


  1. Zex0n
    06.01.2024 19:30
    +21

    Вы не знали про DDNS или сознательно его почему-то не используете?


    1. BerserkZak
      06.01.2024 19:30

      Не берусь утверждать, что такое решение является наиболее простым и адекватным. Вероятно, есть более прямолинейный путь достижения моей цели

      Человек так и написал, или вы сознательно почему-то не читали статью?


    1. qw1
      06.01.2024 19:30

      У DDNS тоже есть свои подводные камни. Например, сервис может демонстративно отказаться работать в РФ. Телеграм тут предсказуемее.


      1. Antra
        06.01.2024 19:30

        Десяток (тки?) DDNSов vs 1 Телеграм?

        Тем более, что буржуйский серис скорее всего, заранее предупредит. А вот блокировочка от РКН внезапно может настигнуть.

        Да и для супер надежности можно сразу несколько доменных имени иметь.


        1. qw1
          06.01.2024 19:30

          Так у них у всех API разный ))
          Что +1 DDNS, что +1 телеграм бот, это всё равно разбираться.


  1. vk6677
    06.01.2024 19:30
    +15

    DDNS. Есть бесплатные сервера. Технология не новая. Появилась ещё во времена модемного интернета.


  1. WondeRu
    06.01.2024 19:30
    +6

    duckdns.org - бесплатный


  1. ivankudryavtsev
    06.01.2024 19:30
    +10

    Ngrok.com тоже может помочь.


    1. AnthonyAxenov
      06.01.2024 19:30
      -1

      Не могу не упомянуть telebit.cloud в качестве чуть более интересной альтернативы, мне зашло лучше нгрока. Хотя вроде много ещё таких.


    1. kenoma
      06.01.2024 19:30

      zrok тогда уж


      1. Ratenti
        06.01.2024 19:30

        Чем лучше?


  1. greg-zamza
    06.01.2024 19:30
    -11

    Как получается так, что любая мысль или проблема, которая беспокоит меня, спустя день воплощается в чьей-то статье на хабре?

    жёстко плюсую


  1. PwrUsr
    06.01.2024 19:30
    +12

    реально в 2024м году не найти информацию про DynDNS сотоварищи ?

    или там НАТ за НАТом и НАТом погоняет типа CGNAT и через бота тунель делается ?


    1. soymiguel
      06.01.2024 19:30
      +4

      1. withkittens
        06.01.2024 19:30

        И Tailscale. Pick your poison, как говорится.


      1. MoonArsenii
        06.01.2024 19:30

        Или если у вас уже есть сервер с белым ip, можно использовать древнее заклинание:

        ssh -R cat@example.com


    1. ValdikSS
      06.01.2024 19:30
      +26

      реально в 2024м году не найти информацию про DynDNS сотоварищи ?

      Не удивлюсь. Поисковики в 2024 едва ли ищут что-либо релевантное.


      1. entze
        06.01.2024 19:30
        +1

        Но можно спросить LLM, либо локальную либо он-лайн осилив многочисленные статьй про ###.


        1. Lexicon
          06.01.2024 19:30
          +1

          Не удивлюсь, если сейчас ряд авторов делает

          • как сделать Х

          • напиши статью на эту тему, вставив 3 деепричастных оборота и развязку с оборотнями


      1. Joyz
        06.01.2024 19:30

        Ещё тогда можно использовать новомодный ChatGPT


      1. vsatd
        06.01.2024 19:30

        Уважаемый ValdikSS, как выходите из ситуации?


  1. RichardBlanck
    06.01.2024 19:30
    +3

    Есть русская поговорка про дурную голову.

    А если бы автор умел читать, он легко решил бы проблему обычными средствами, не прибегая к страшному программированию. Да и программированию вообще.
    Вот у меня есть машина. У которой нет реального ip адреса вообще никогда, не то, что он есть, но меняется. Единственная моя проблема в доступе на эту машину откуда угодно -- это отсутствие WatchDog на древнем ADSL модеме.


    1. HardWrMan
      06.01.2024 19:30
      +2

      О, да, когда-то на ADSL у прова сессия висла после аптайма больше, чем 23:59:59. Приходилось писать детектор интернета (банальные пинги на несколько гаратнтированно отвечающих адресов + анализ статистики ответов) и перезагружатор роутера через автологин и команду "kill 0" (использовал порт expect на домашнем шлюзе, который и выступал сервером в мир и был на FreeBSD). Эх, молодость.


  1. jackcrane
    06.01.2024 19:30
    +3

    интернет тариф не поддерживает возможность установки статического IP адреса по умолчанию

    1) если доплатить провайдеру, то он может выдать статический IPv4 или даже IPv6.

    2) #!/bin/sh

    MYIP4a=`curl ifconfig.me`

    MYIP4b=`curl -4 icanhazip.com`

    MYIP6b=`curl -6 icanhazip.com`

    я даже банально не мог к ней по SSH подключиться после смены ее адреса.

    3) три слова: tor hidden service.

    4) можно аналог в i2p, но я не пробовал.

    5) можно через anydesk, но я не рекомендую по соображения безопастности.

    6) https://unix.stackexchange.com/questions/46235/how-does-reverse-ssh-tunneling-work

    Hidden text

    ps: телеграм сотрудничает.


    1. Aelliari
      06.01.2024 19:30
      +1

      три слова: tor hidden service.

      можно аналог в i2p

      Или другие оверлейные сети, например Yggdrasil, или что нибудь ещё…

      Или cloudflare teams/warp/ZeroTrust, черт его знает как оно сейчас называется, позволяющие «внутри команды» гонять tcp-трафик (если нужно вывешивать веб-сервисы наружу - можно просто tunnel)

      Или оверлейные решения с прицелом на меш-сети SD-WAN типа ZeroTier/tailscale/netbird/netmaker/и прочие… при наличии сервера - можно и свой координирующий сервер поднять…

      P.S. Это кроме многократно упомянутого тут ddns


      1. jackcrane
        06.01.2024 19:30
        -3

        Yggdrasil

        мой опыт с ним негативный. контента нет, против РосВПНнадзора не поможет, ценность сомнительна.

        остальное для меня сложно.


        1. Aelliari
          06.01.2024 19:30
          +4

          контента нет

          Мы все ещё про доступ к устройству?

          остальное для меня сложно

          Tailscale - сложно? А вы точно пробовали? Да, чуть больше телодвижений, чем скачать «tor-браузер», но уровень сложности там околонулевой, а на выходе (если не будет проблем с проблем NAT) - соединение точка-точка с каждой нодой в твоей собственной сети. В случае проблем с NAT - да, будет задействован релей

          P.S. Я не ваш ответ критикую, я его дополнял


          1. jackcrane
            06.01.2024 19:30

            Мы все ещё про доступ к устройству?

            для доступа я описал более простые средства в своем исходном комменте.

            согласитесь что простой IPv6 или простой обратный тоннель проще чем наворачивать IPv6 внутри IPv6.


            1. Aelliari
              06.01.2024 19:30

              согласитесь что простой IPv6

              Только если он есть. Не преувеличивайте сложность использования Tailscale и его «родственников», скачать клиент на нужную платформу и залогиниться через условную гугловскую SSO и… всё.

              P.S. Правда конкретно tailscale относительно недавно с IP РФ стали блокировать доступ к скачиванию клиентов


        1. pvsur
          06.01.2024 19:30

          При конфигурации пиру можно указать sni = cremlin.ru, и любой ркн пропустит...наверное.

          Точное описание - в доке


          1. 3ycb
            06.01.2024 19:30

            указать sni = cremlin.ru

            cremlin.ru точно не пропустит, а вот kremlin.ru может быть


    1. ValdikSS
      06.01.2024 19:30
      +7

      я даже банально не мог к ней по SSH подключиться после смены ее адреса.

      https://ssh-j.com


    1. Metotron0
      06.01.2024 19:30

      После введения пакета Яровой у нашего провайдера услуга статического адреса выросла с 50 до 350 рублей в месяц :(


      1. sermart1234
        06.01.2024 19:30
        +1

        Я полагаю дело не в законе Яровой (хотя и это тоже), а в том что IPv4 адресов маловато. У меня, кстати, статика стоит 0 рублей в месяц, но первое подключение 400р


        1. HardWrMan
          06.01.2024 19:30

          Везёт. У нас долго запускали статику физикам и в итоге я почти 6 лет сидел на ней за 6к денег в месяц (это примерно 1200 ваших рупий!). А потом пришёл 2020 и все статические IP у физиков отобрали в пользу юриков, которые платят сильно больше...


          1. sermart1234
            06.01.2024 19:30

            Ну, я живу в Поволжье. У меня 500 мбит/с за 800р. Так что если 1200р был гигабитник со статикой или около того, то вполне себе цена. Правда 4 года назад цены другие, но тогда и гигабитников я не вспомню.

            В деревнях хуже, 450р за 9мбит/с). В более отдалённых может быть и несколько тысяч за меньшую скорость


            1. HardWrMan
              06.01.2024 19:30

              Ты не понял. 6к были в + к тарифу, который тоже около 6к был. Сейчас 5900 денег за 500Мбит оптика у меня. Скорость по РК вот такая:

              Hidden text

              Ну а на внешние ресурсы зависит от времени суток и загруженности внешних каналов. Напомню, 17 лет назад, в 2006м я подключил ADSL 128к на 7Гбайт, а потом шейпер до 32к за те же 5980 денег в месяц. Но с тех пор скорость выросла до 500мбит/с а сам деньге судя по курсам доллара просел со 115 до 460 денег за 1 вечнозелёный.


    1. nevzorofff
      06.01.2024 19:30

      Некоторым провайдерам придется оплатить модернизацию ядра, чтобы они смогли ipv6 вообще.


  1. chnav
    06.01.2024 19:30
    +7

    В подобных рассказах всегда смущает художественная преамбула. Ни у кого не возникло бы сарказма, если бы автор написал прямо первичную цель разработки: "моё хобби - телеграм-боты, я придумал себе новую задачу" (и проверил её на старом компе в удалёнке), и в теги к статье добавил #ненормальное_программирование. Но выдумывается история с каким-то компьютером в другом городе, жалко его бросать, родители (которые не против шума компа 24/7) и пр.


    1. lgorSL
      06.01.2024 19:30
      -1

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

      Добавить команду боту, чтобы он сообщал ip адрес, было совсем не сложно.


  1. Dan_Hummer
    06.01.2024 19:30
    +4

    На подвиг китайского комсомольца очень похоже...
    Сам себе нагеморроил, сам себе преодолел!


    ---START---
    sudo apt-get install ddclient
    sudo nano /etc/ddclient.conf
    ---FINISH---
    Ну ведь Убунта же? Убунта? Как "нет"? А что тогда? :)


  1. a0fs
    06.01.2024 19:30
    +9

    Горе от ума. Ленивые люди берут базовый тариф на лоукостере, там где почти нет диска, почти нет процессора, но есть безлимитная полоса в 100 Мбит/с и поднимают там OpenVPN. Остальное описано в книжках по сетям и NAT. В таком конфиге оно может даже быть вполне полезным. DDoS-ы не переживёт, а для добросовестного использования вполне хватит.

    Там можно даже сайтики почти нормально хостить, выбросив на этот недохост на VDS провайдере nginx, а всё мясо развернув на узле дома....

    Но нет, нужен телега-бот написанный на С++ который по curl-у с другого ресурса запрашивает IP и отдаёт его в телеге. Вся надежда на телегу, сайтик с определением IP и вот это вот всё....

    Да, для других извращенцев, которым тоже простые решения как серпом по телу: как-то делал на bash раскривушку. Она получала IP из переменной окружения и регистрировала его на ns сервере. В том случае был BIND, но собрать такое на NSD нет проблем, даже проще. А дальше прописываем этот сервер 3-м уровнем (на второй нужна пара серверов), и конектимся по SSH. Всё нужное openssh положит в переменные окружения, останется только прописать команду на подключение по определённому ключу (в авторизованные ssh-ключ можно прописывать команды, стартующие при использовании этих ключей), откуда эта груда костылей получает имя (его прописываем в эту самую команду для ключа), регистрирует IP с которого проведено подключение и завершает сеанс. Конектится можно хоть раз в минуту, NSD переживёт.... Вот и халявный свой DynDNS с блек-джеком и всем, что развёртывающий вздумает на него навесить.... Можно даже узлы c NS и терминальный для соединений разнести по разным виртуалкам или контейнерам, если очень нужно.... У меня загнулось на этапе прототипа. Тесты прошло и было похерено, как рабочий концепт на случай атомной войны, поскольку решение с калиткой (точкой входа на дешёвой VDS) имеет больше перспектив и более управляемо и предсказуемо.


    1. pavel_pimenov
      06.01.2024 19:30

      " Мой основной язык на работе и для пет-проектов - C++ " у автора основная цель прокачать С++ и он молодец!


      1. jimquery
        06.01.2024 19:30
        +1

        Неплохо бы автору ещё кругозор прокачать. Иначе вся жизнь уйдёт на написание "велосипедов".


        1. jackcrane
          06.01.2024 19:30
          +2

          Неплохо бы автору ещё кругозор прокачать.

          типичному программисту это не нужно. у них нет времени даже читать документацию.


          1. NutsUnderline
            06.01.2024 19:30

            ага а потом у них программа выдает незадокументированную ошибку


    1. rostislav-zp
      06.01.2024 19:30

      Сам к такому решению пришел.но как вариант на подключаемой машине можно поднять softether vpn server при загрузке.он через все пробивался у меня

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


      1. nevzorofff
        06.01.2024 19:30

        Все понятно. Если автору достаточно адреса из ifconfig, то и dyndns будет прекрасно работать.


  1. 19Zb84
    06.01.2024 19:30

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

    Есть ли возможность узнать и использовать ip адрес телефона ?


    1. Aelliari
      06.01.2024 19:30
      +2

      Любой сервис типа ifconfig.co, с v6 бывает можно прямо на телефоне посмотреть. По поводу использовать - тут сложнее, почти всегда v4 за CG-NAT и опубликовать сервисы не выйдет без дополнительной услуги со статическим IP (если опсос её предоставляет), v6 - по разному, могут фильтроваться входящие соединения, могут - нет. Опять же, публиковать сервисы с телефона - не особо удобное занятие, но принципиально через мобильную сеть - это возможно. Лучше сразу озвучить цель, может быть кто-то предложит альтернативное решение


      1. 19Zb84
        06.01.2024 19:30

        Я на телефоне свой проект поднимал.

        Телефон всега с собой и включен.

        Пробовал сервис ngrok и другие со статическими адресами. Так можно настроить.

        Нашев в интпрнете провайдеров, которые позволяют раздавать данные, но они не в России.


  1. PsihXMak
    06.01.2024 19:30

    А есть возможность избавиться от этого костыля в виде телеграмма? Было бы не плохо иметь удобный веб-интерфейс или приложение, через которое можно работать с веб-сервером. Типа консоли, но более юзер-френдли.


    1. JerzyEx
      06.01.2024 19:30
      +2

      Я делал подобное. Поднял на бесплатном сервере от Оракл nginx который имеет одну html страницу со ссылкой на нужный адрес. Железка, к которой нужен доступ, при включении запускала скрипт, который заходил на арендованный сервак и генерировал упомянутую html страницу.

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


  1. ner0
    06.01.2024 19:30
    +2

    Я сначала подумал провайдер не даёт белый IP, и автор сделал обратный прокси. А тут просто курл... Кто такие статьи вообще аппрувит, и главное зачем?


  1. Lainhard
    06.01.2024 19:30

    Была как-то похожая задача. Поднял TOR и пробросил ssh. Плюсы - достаточно знать onion адрес. Минусы - пинг.


  1. uhf
    06.01.2024 19:30
    +2

    В роутерах же есть DDNS, зачем все делать через ... бота?


  1. HardWrMan
    06.01.2024 19:30

    А мог бы просто зарегаться на урагане электриков и поиметь себе статический IPv6.

    Что касается DDNS, то я до сих пор использую freedns. И когда была статика и когда её не стало - работает полностью одинаково.


    1. Antra
      06.01.2024 19:30

      Это как? Там же нужно указывать свой IPv4. Причем чтобы он извне был доступен (пусть меняется периодически, но все-таки не за Hide NAT).

      У меня именно так и сделано - проверяю периодически свой домашний IPv4 и в случае его изменения через API апдейчу HE, чтобы туннель восстановился и IPv6 опять стал доступным. И DDNS имя там не указать, только IP. Что-то изменилось?

      Но это чисто ради с IPv6 поиграть. В реальности-то WG до VPSки небольшой с NGINX reverse proxy и прочими полезностями типа VLESS-XRAY...


      1. Aelliari
        06.01.2024 19:30

        Это как? Там же нужно указывать свой IPv4. Причем чтобы он извне был доступен

        У автора он доступен, так как было бы иначе - толку бы от его бота было бы ровно 0.

        И DDNS имя там не указать, только IP

        Сам же пишешь что меняешь через их API, есть ряд готовый скриптов в интернете по аналогии с DDNS которые это могут. Но скорее всего человек имел в виду, DDNS для того чтобы обращаться по домену без знания текущего значения динамического IP. Это не относилось к HE, просто упоминание одного старого сервиса

        P.S. После смерти route48, сейчас ещё есть route64 который тоже туннельный брокер, и тоже даёт ipv6 по wireguard но «белый IP» - не нужен. Вроде бы ещё был один который так умеет, но он требовал свою ASN


        1. Antra
          06.01.2024 19:30

          Ну т.е. все-таки тоже со скриптами (а-ля DynDNS). Но тогда получается, что усложнение есть, а выгода по сравнению с обычным DynDNS не особо ясна. Скорее наоборот - пинги (время отклика) существенно (в несколько раз) вырастут.

          Поэтому и решил уточнить, вдруг нарисовалось более красивое решение.


          1. Aelliari
            06.01.2024 19:30
            +1

            Самое красивое сейчас, имхо, меш-впн если не нужно публиковать ресурс в интернете, и старый добрый DDNS - если нужно. Если за NAT и у тебя веб-сервис с постоянным доступом из вне - можно воткнуть MITM в виде реверс-прокси от cloudflare, ну или ngrok и аналоги


  1. CryInt
    06.01.2024 19:30

    Ну про dyndns уже сказали.

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

    Вообще задача сводиться к более простой - сервер дёргает специальный скрипт на хостинге, в скрипте смотрится адрес с какого дёрнули, и меняет А запись у домена через АПИ. ТТЛ ставим минимальный и сервер всегда доступен с актуальным IP.


    1. qw1
      06.01.2024 19:30

      Хостинг надо оплачивать, а телеграм бесплатен.


      1. CryInt
        06.01.2024 19:30
        +1

        Ну хорошо дёргает курлом https://api.myip.com получаем актуальный внешний IP. Через API меняем А запись у домена на актуальную. Зачем городить прослойку в ручную через телеграмм?


        1. qw1
          06.01.2024 19:30

          Разницы большой нет. И там, и там "дёргаем некий внешний сервис неким сетевым клиентом". Сложностью клиента можно пренебречь, пишется 1 раз. Важна лишь надёжность/доступность сервиса.


    1. Aelliari
      06.01.2024 19:30

      телеграм в нормальном виде работает через webhook

      Там два режима, в одном случае webhook, а в другом - бот отпрашивает сервер, выбирай нужный


  1. VasilievVictor
    06.01.2024 19:30
    +2

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

    1. Берем дешевый vps сервер и на нем поднимаем сервер wireguard(поднимал в докере), прописываем проброс нужных портов.

    1. На кинетике настраиваем автоматическое подключение wireguard до vps, и проброс нужных портов до своего домашнего сервера.

    2. Профит, появляется домашний сервер или сервера с реальным ip(и кстати ну очень недорогим), а там доступ к камерам, Homeassistant или серверу майнкрафт, ну или более «специфичным» проектам.

      такой vpn наоборот ))


    1. Gillette
      06.01.2024 19:30

      Если уж на кинетике, там есть бесплатный keendns, работает через облако, никакие nat ему не помеха, скорость позволяет стримы с камер смотреть.


  1. afarber
    06.01.2024 19:30
    -4

    Хорошая статья, а ответы про DynDNS и др - бестолковые


  1. NutsUnderline
    06.01.2024 19:30

    если роутер на OpenWrt то там есть пакет ddns который позволяет иметь адрес хоть у 10ка dyndns провайдеров одновременно

    Но есть нюанс. Провайдер может выдать ip адрес со своего внутреннего диапазона - nat в нужном режиме просто не работает. Причем выдается то нормальный динамический ip то серый - и например сперва работает, а после реконнекта - не работает. ну сервисы dyndns на такие адреса сразу уже пишут отлуп "внутренний адрес". Видел даже специальные скрипты которые позволяют играть в ipадресную рулетку с провайдером - долбать реконекты пока не выпадет "правильный" адрес. Ну или вручную реконектить


  1. AleksUb
    06.01.2024 19:30
    +1

    Подключил нужные мне сервера и ПК к yggdrasil и не надо не только реальник выставлять, но и каждый раз запрашивать адреса. Слишком сложный вариант, на мой взгляд.


    1. qw1
      06.01.2024 19:30
      +1

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


  1. madwtj
    06.01.2024 19:30

    Можно купить роутер типа - keenetic или asus. Там есть свои стабильные ddns сервера настраивается в один клик. Ну ещё NASы умеют, типа Synology, но это сильно дороже.


  1. VadimGus
    06.01.2024 19:30
    +1

    Спасибо. Я сделал так:

    1. Купил доменное имя;

    2. Выбрал DNS-сервис с API Amazon Route53;

    3. Написал скрипт, который определяет внешний ip-адрес и обновляет A запись этого DNS;

    4. Настроил запуск этого скрипта на сервере Cron'ом каждую минуту.


  1. 13werwolf13
    06.01.2024 19:30

    просто вешаем домен на dns.he.net и добавляем в крон раз в час выполняться

    curl -4 "https://НУЖНЫЙПОДДОМЕНВАШЕГОДОМЕНА:СЕКРЕТНЫЙПАРОЛЬ@dyn.dns.he.net/nic/update?hostname=НУЖНЫЙПОДДОМЕНВАШЕГОДОМЕНА"

    всё, dyndns на ваш полноценный домен за бесплатно. и не надо каждый раз новый ip вбивать


  1. stopsp
    06.01.2024 19:30
    -1

    А у меня вообще нет компьютера (полтора года назад продал последний игровой ноут и перекрестился). Всем спокойной ночи )))


  1. mikryukovsl
    06.01.2024 19:30
    -1

    Отпад! Давай больше халявы разной! Мне давно уже не по нутру их IP адреса, эти твари специально сделали так чтобы их на всех не хватало.


  1. CadaVez
    06.01.2024 19:30

    Подключиться по ssh ? Оставлять ssh доступный снаружи всем - такое себе удовольствие. ВПН поднял, на него машину клиентом. Дальше по ВПН сети ssh, понимание ip внешнего и т.д.

    Больше тебе скажу - никто не останавливает поднять у себя на стороне " яумамыпрограмист" внешний интерфейс сайта и публичного сервиса, а по тому же ВПН сайты и т.д...

    Выводы - молодец, научился писать код, возьми с полки пирожок и будь скромнее. Статья из серии зырьте как я умею, хвалите меня.


  1. 1e100
    06.01.2024 19:30
    +1

    А мне надоело беспатное продление по несколько раз в год, отреверсил как работает служба в keenetic и сделал свой на go. Повесил на свой сервер, пока работает стабильно
    https://pastebin.com/cr9wArjh


  1. georgiy08
    06.01.2024 19:30

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


  1. Rumbis
    06.01.2024 19:30

    Tailscale поможет даже с серой за-NATовой динамикой. DDNS- с белой динамикой.

    Первый, конечно, зависим от внешних иностранных сервисов (это, по сути, приватная VPN-точка).


  1. gadyapetrovichhrenova
    06.01.2024 19:30
    -1

    Трындец, домашний интернет такая стабильная вещь, uptime 99.9999999999%. Я лично пока не сумосшедший хостить сайты дома. Сейчас хостинга за доллар валом.


  1. ssolder
    06.01.2024 19:30

    Ну да ну да проброс порта по ssh можно сделать даже на серый ip (за провайдерский nat) и легко управлять компом по рдп или использовать веб диск по ssh просто пробросить порт 22 ... Нужен любой VPS с него проброс на локальную машину... А чтобы вообще по красоте делаем это на роутере с openwrt и получаем Профит vps брал в США вы можете где ближе хоть в РФ


  1. Tamashii
    06.01.2024 19:30

    Одно слово - NAT.

    И идём дружно менять провайдера/тариф/подключать услугу "Постоянный IP"...


  1. AbdulKus
    06.01.2024 19:30

    Я для таких целей использовал сеть yggdrasil. Там выдаётся статический ipv6 к которому легко можно подключиться с любого устройства. Довольно удобно. Единственное, пришлось пару раз пробрасывать туннели, ТК не весь софт работал с ipv6