Начало

Всё началось с покупки одноплатного компьютера. На нём я поднял облачный сервис Seafile, медиа-сервер Jellyfin и вики-движок Wiki.js. Потребляет такой компьютер с подключенным внешним жёстким диском крайне мало. Всё это добро я использую в одном лице для личных нужд. Поэтому платить за белый IP адрес и уж тем более покупать доменное имя считаю лишним. Вот только провайдер постоянно меняет мне внешний IP, а доступ хотелось бы всегда иметь и за пределами домашней сети.

Идея

Создать задание Cron, которое периодически будет запускать сценарий, проверяющий, не поменялся ли IP на роутере. В случае изменения отправить его в письме на Yandex Почту.

Роутер

  • Zyxel Keenetic Viva

Реализация

Нам понадобится куда-то сохранять старый и новый IP. Я создал 2 текстовых файла: old_ip.txt и new_ip.txt.

Далее для работы скрипта требуется установить telnet:

sudo apt update
sudo apt install telnet

Создадим следующий shell сценарий telnet.sh:

#!/bin/sh

HOST='192.168.1.1'
USER='Your user'
PASSWD='Your password'
CMD='show interface PPPoE0'

(
echo open "$HOST"
sleep 2
echo "$USER"
sleep 2
echo "$PASSWD"
sleep 2
echo "$CMD"
sleep 2
echo "exit"
) | telnet | grep -oP 'address: \K.*' >> ./new_ip.txt

HOST - адрес роутера. USER и PASSWD - это логин и пароль администратора роутера. В CMD вместо PPPoE0 следует вписать название вашего настроенного интерфейса. У меня это PPPoE0. Сценарий получает текущий внешний IP роутера и сохраняет его в файл new_ip.txt.

Дальнейшую логику я реализовал на Python. Создадим следующий сценарий script.py:

#!/usr/bin/python

import subprocess
import smtplib


def CheckFile():
    file = open('old_ip.txt', 'r')
    if ip != file.readline().strip():
        file.close()
        open('old_ip.txt', 'w').close()
        file = open('old_ip.txt', 'w')
        file.write(ip)
        file.close()
        return True
    return False


def SendMail():
    content = ip
    mail = smtplib.SMTP('smtp.yandex.ru', 587)
    mail.ehlo()
    mail.starttls()
    mail.login('Your Yandex mail login', 'Your Yandex mail password')
    mail.sendmail('Your Yandex mail login', 'Your Yandex mail login', content)


def GetIp():
    open('new_ip.txt', 'w').close()
    subprocess.Popen('./telnet.sh').wait()


GetIp()
ip = open('new_ip.txt', 'r').readline().strip()

if CheckFile() == True:
    SendMail()

В функции SendMail указываем ваш логин и пароль от Yandex Почты. Т.е. мы проходим авторизацию в своём ящике и отправляем письмо сами себе.

Теперь в настройках Yandex Почты разрешим способ авторизации через портальный пароль. Это требуется для беспрепятственной авторизации.

Так же незабываем дать права на запуск нашим скриптам!

Я создал задание Cron, которое запускает скрипт каждые полчаса:

*/30 * * * * python3 script.py

Надеюсь, статья оказалась полезной. Спасибо за внимание.

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


  1. Lunti
    12.07.2022 11:40
    +47

    а че ddns уже отменили?


    1. Loxmatiymamont
      12.07.2022 11:56
      +16

      Слишком просто.


      1. iig
        12.07.2022 12:03
        +14

        И в большинстве роутеров прямо в веб-морде есть настройка этого самого ddns. Да, это непозволительно просто.


        1. Serge78rus
          12.07.2022 12:16
          +3

          Чтобы не было слишком уж просто и скучно, можно написать свой клиент обновления DDNS на bash или на том же Питоне. В жизни всегда есть место «подвигу».


          1. HemulGM
            12.07.2022 15:14
            +2

            Или подключить API провайдера, через которого будешь редактировать DNS зоны)

            Главное, не платить целых 100р/мес за белый, статичный ip)


            1. Aleksandr-JS-Developer
              12.07.2022 16:49
              +5

              Между "бесплатно" и "1 цент" - огромная пропасть


              1. hogstaberg
                12.07.2022 17:59

                И не поспоришь. С чисто математической точки зрения одни цент в бесконечное множество раз больше нуля центов.


                1. Mavolio-Bent
                  12.07.2022 21:25
                  +1

                  С чисто математической точки зрения один цент в неопределенное раз больше нуля центов.


                1. id_potassium_chloride
                  13.07.2022 02:33

                  Тут дело в психологии и нежелании вводить данные своей банковской карты лишний раз


                  1. Aleksandr-JS-Developer
                    14.07.2022 14:37
                    +1

                    Не совсем. К тому-же, это - провайдер, которому вы уже платите Х_денег/мес со своей карты. Ключевой момент в "бесплатно" и "платно".

                    Есть замечательный эксперимент про шоколадку и трюфель.

                    Суть в том, что посетителям предлагали к кофе две сладости шоколадку за 1 цент и трюфель за 35 центов.

                    Все брали трюфель, потому, что разница небольшая, а трюфель вкуснее.

                    Но потом сделали шоколадку бесплатной, а трюфель за 34 цента.

                    И посетители стали брать шоколадку, несмотря на туже разницу в 34 цента.

                    Именно это - один из главных барьеров в системе free2play, к примеру.


        1. Hu3yP7
          12.07.2022 15:31
          +4

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


          1. HemulGM
            12.07.2022 16:28
            +1

            У D-Link тоже


            1. nitro80
              13.07.2022 10:24
              +1

              И у mikrotik


              1. InChaos
                13.07.2022 13:41
                +2

                Да-да и у ASUS тоже


                1. Areek
                  13.07.2022 13:57
                  +1

                  И они пока что ещё работают в России...


    1. dmitryvolochaev
      12.07.2022 12:07

      и уж тем более покупать доменное имя считаю лишним


      1. F0iL
        12.07.2022 12:45
        +6

        Есть куча DDNS сервисов, не требующих покупки своего домена


        1. DikSoft
          12.07.2022 13:30

          Подскажите, если используете, что из них на сегодня более-менее живое есть?


          1. snaiper04ek
            12.07.2022 13:48
            +5

            duckdns


          1. crawlingroof
            12.07.2022 14:02
            +4

            http://freedns.afraid.org/
            100к лет пользуюсь, да, некоторые домены могут пропадать.
            Есть ссылки для скриптов, даже на микротике работает.

            в vpsках так работает
            0 */3 * * * /usr/bin/wget -q --read-timeout=0.0 --waitretry=5 --tries=400 --delete-after --background "https://freedns.afraid.org/dynamic/update.php?V....


            1. TimsTims
              12.07.2022 14:39

              даже на микротике работает

              На микротике есть свой cloud, который бесплатно выдаёт свой ddns. Правда ip берётся из интерфейса, а не фактический публичный.


              1. TimsTims
                12.07.2022 22:36

                update: оказывается он всё-же берёт публичный адрес, но есть возможность форсированно брать локальный адрес (адрес с интерфейса).


                1. yarkovoy
                  13.07.2022 03:37

                  А для чего может понадобится брать локальный адрес? Всегда пользуюсь тот что внешний.


                  1. randomsimplenumber
                    13.07.2022 07:22

                    Для использования внутри локальной сети.


                    1. TimsTims
                      13.07.2022 17:21

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


            1. Mayurifag
              12.07.2022 16:13

              А чем заканчивается команда? Кажется, встроенный редактор съел окончание.


              1. Evengard
                12.07.2022 17:22
                +1

                Там api-токен для конкретного аккаунта. Ссылку надо просто брать из интерфейса сайта.


              1. crawlingroof
                12.07.2022 17:31

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


          1. nitro80
            13.07.2022 10:24

            No-ip

            Правда зараза раз в месяц просит подтвердить доменное имя


      1. K0styan
        12.07.2022 13:44

        На одном из роутеров была опция - ddns сервис от производителя этого самого роутера (ЕМНИП, Asus) - так там домен 3 уровня был бесплатен.


        1. Sequoza
          12.07.2022 15:35
          +3

          Да автору просто скучно стало

          Zyxel Keenetic Viva

          KeenDNS


        1. patisam
          12.07.2022 16:12

          У Keenetic точно так же, совершенно бесплатно.


  1. Hisoka
    12.07.2022 11:42
    +14

    curl http://ifconfig.co


    1. Voenniy
      12.07.2022 17:45
      +1

      Аналог (полный вывод)
      curl ipinfo.io

      Либо сокращенный
      curl ipinfo.io/ip


      1. Tuxozaur
        13.07.2022 14:06

        curl eth0.me - ничего лишнего!


        1. MaxKozlov
          13.07.2022 15:08

    1. sdore
      14.07.2022 14:32

      curl 2ip.ru — импортозамещение!


  1. GennPen
    12.07.2022 11:51
    +22

    Не благодарите.

    И да, вы путаете белый/серый с динамическим/постоянным IP-адресом.


    1. dmitryvolochaev
      12.07.2022 12:14
      +6

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


      1. GennPen
        12.07.2022 12:18

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


  1. E_STRICT
    12.07.2022 11:56
    +17

    Мне кажется вы путаете понятия "Белый IP" и "Динамический IP".


    1. Habetdin
      12.07.2022 12:52
      +2

      Вот да, как есть «белые» и «серые» IP, так и те и другие могут быть как статистическими, так и динамическими.


  1. slavius
    12.07.2022 12:07
    +22

    Знание IP не особо поможет если он за NAT. Очень не всё сможет пройти через провайдера на серый IP.


    1. serge-sb
      13.07.2022 10:38
      +1

      Жил был у меня такой вот домашний роутер-сервер, в админке была встроенная поддержка определения IP и обновления его в (одном-российском-dns-хостере). Потом провайдер (бывшая Корбина) решил, что белые IP давать всем - слишком щедро. И IP превратился в тыкву посерел. Ну, плюс 100р к абонентке, что ж поделать.

      А все эти скрипты - мне кажется, отдельной статьи не стоит. Наверняка в гугле превой же ссылкой это есть. Тем более не понятно, к чему этот скрипт: показать, как отправлять письмо с роутера? А для этого точно питон нужен? Если в роутере есть питон, то и sendmail там наверняка тоже есть.


  1. cepera_ang
    12.07.2022 12:20
    +1

    Tailscale. И будет всегда одинаковый, стабильный, всегда доступный из-за любых натов ip-адрес в собственной меш-сети, зашифрованной wireguard’ом.


  1. dmitryvolochaev
    12.07.2022 12:33

    Есть еще libp2p. И не надо никаких централизованных вещей вроде почты или DNS


  1. saga111a
    12.07.2022 13:23
    +5

    Как бы статический и динамический IP это пол беды, а вот нахождение за NAT указанный случай не решает совсем. Если очень надо то можно использовать вот такой сервис, для некоторых нужд бывает полезен.

    https://ngrok.com/


  1. silver47
    12.07.2022 13:50
    +1

    А почему не воспользовались услугами одного из dyndns? Сам пользуюсь бесплатной учеткой на freedns.afraid.org лет 10 уже.


  1. CarrolCox
    12.07.2022 13:58
    +1

    ddns вроде https://www.nsupdate.info/ и portforward


  1. hollycon
    12.07.2022 14:03
    +5

    У кинетика собственный Keenetic Cloud есть. Там же, из админки можно прокинуть порт на внутренний сервер. И ходить на него по просто имени.


    1. PaulZi
      12.07.2022 21:45

      Причем в нем можно одной кнопкой поднять https, и будет работать даже за nat, через облака кинетика


    1. denkors
      13.07.2022 10:11

      Немного не пойму как ddns или Keenetic Cloud могут помочь если у человека например серый адрес? Он как не получал доступа из мира так его и не получит пока у него на интерфейсе не будет публичный IP.


      1. Lunti
        13.07.2022 10:48

        туннель поднимет и из мира пакет придет сначала на сервер кинекта, а дальше уже по туннелю на роутер. Есть такое же решение у ngrok, но раньше там были какие-то ограничения в бесплатном варианте, вроде тестовый период 3 месяца (возможно путаю с кем-то другим)


  1. cleverate
    12.07.2022 14:36
    +9

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

    Теперь в настройках Yandex Почты разрешим способ авторизации через портальный пароль. Это требуется для беспрепятственной авторизации.

    Не требуется, есть пароли приложений


  1. 13werwolf13
    12.07.2022 14:43
    +2

    curl -4 "https://DOMAIN:KEY@dyn.dns.he.net/nic/update?hostname=DOMAIN"

    раз в 10 минут в crontab, и всё, никаких костылей. чем не решение?


    1. GennPen
      12.07.2022 17:46

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


      1. 13werwolf13
        12.07.2022 21:46

        только на своём, одни плюсы


  1. ABATAPA
    12.07.2022 15:24
    +9

    Да... Хороший пример эффекта Даннинга-Крюгера...
    Автору на будущее: не спешите выдавать окружающим свои мысли и решения — изучите сперва тему, узнайте, не тривиально ли Ваше решение, не ошибочно ли, изучите другие решения: может статься (как мы видим), что то, что Вам кажется из-за недостатка знаний "прорывом", таковым не является.


    1. kvk-2019
      12.07.2022 16:07

      Желанию изучить что-то, наверно, не стоит всё-таки совсем уж мешать. Но, да, выбран совсем небезопасный устаревший и не рекомендуемый к применению протокол. Если уж брать IP, то с веб-морды по протоколу https, за одно парсить сайты может научится, js, а может ещё к веб дизайну потянет, с сертификатами и их проверкой разберётся, безопасное хранение паролей освоит, да мало ли. А так, да, задача типа на пару минут настроить бесплатный ddns на роутере, если не брать в расчёт возможный побочный эффект в виде мотивированного получения новых знаний. Может, почитает отзывы, и как-то это даже потом поможет.


      1. HemulGM
        12.07.2022 16:30

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


  1. geekfil
    12.07.2022 16:13
    +3

    Зачем такие сложности, когда есть Tailscale, Zerotier, Cloudflare Tunnel и прочие альтернативы.


  1. rionnagel
    12.07.2022 16:48
    -7

    ХавАйте статью у бульбу, пока яйцами не закидали. Слишком единичный юзеркейс, который имеет массу вариантов получше.


  1. maledog
    12.07.2022 18:40
    +4

    Вот только добрая половина провайдеров использует nat и не выдает белый IP - статья была актуальна лет 10 назад.


  1. thegriglat
    12.07.2022 22:44

    Yggdrassil. Знаешь свой ip и он белый.

    Условия выполнены)


  1. kisskin
    13.07.2022 00:09

    О, кому-то ещё бесплатно внешний ip выдают...


    1. eteh
      13.07.2022 09:50

      Ну да, мне повезло с провайдером. Выделяет белый ip 4 и /56 ipv6


      1. InChaos
        13.07.2022 13:49

        Ростелеком, белый динамический IP.


        1. FSA
          14.07.2022 10:37

          Не факт. Уже в 2016 без статического IP можно было получить как белый адрес, так и серый. ddns уже нельзя было использовать. Так что, на сегодняшний день лучше или заказать статический IP у провайдера, или использовать дешёвый VPS с VPN, который, к тому же, позволит получать белый адрес даже там, где его принципиально не предоставляют или если вы часто меняете провайдеров.


  1. Rasters
    13.07.2022 10:03
    +1

    уж тем более покупать доменное имя считаю лишним

    это что то порядка 200руб. в год?

    Отправлять email в 2022 году? Есть тот же телеграм и на том же shell достаточно curl'а, настроить бота/канал и сходить по ссылке:

    https://api.telegram.org/bot[ТОКЕН_БОТА]/sendMessage?chat_id=@[ID_КАНАЛА]&text=тест

    p.s. у меня настроено по этой схеме: https://habr.com/ru/post/185886/


    1. nitro80
      13.07.2022 10:29

      Email есть у большинства пользователей смартфонов (но не все о нем знают), а вот телеграм есть далеко не у всех.


      1. ducemollari
        13.07.2022 20:57

        Какие сложности в установке ТГ?


        1. nitro80
          13.07.2022 22:41

          Никаких. Не всем он нужен.


    1. serge-sb
      13.07.2022 10:48

      Поделитесь, пожалуйста, где можно найти такие цены? Если не ошибаюсь, продление домена (возьмём зону .ru) на год - что-то порядка 900р (оговорюсь, давно, более года, не проверял цены). Покупку раз в год нового домена (что вполне укладывается в приведённые вами 200р) не рассматриваем.


      1. nevzorofff
        13.07.2022 11:14
        +2

        Active.domains


        1. serge-sb
          13.07.2022 11:32

          Спасибо!


        1. serge-sb
          13.07.2022 11:47

          Сошлюсь на хабр, там есть ещё хорошие ссылки (в т.ч. и указанный вами active.domains): https://habr.com/ru/post/338206/


      1. Rasters
        13.07.2022 11:26

        .ru регистрирую на: https://domains.webmoney.ru/services
        Первый зарегистрировал где то в 2009-10 году, продление стабильно в пределах 200р.


      1. nitro80
        13.07.2022 22:36

        https://optimizator.ru/


  1. SharUpOff
    13.07.2022 10:43

    Мой роутер умеет и СМС отправлять через мобильную сеть и сообщения в Телеграм. Вот только толку от этого мало, потому что большинство провайдеров выдающих динамический IP выдают его серым. И тут два выхода: либо облако с белой статикой + VPN + NAT, либо платить провайдеру. Пользуюсь первым.


    1. Rasters
      13.07.2022 11:42

      Не всегда.
      Мой провайдер выдаёт серый ip, но со статическим NAT'ом.
      Что почти равно белому ip


  1. mracoid
    13.07.2022 10:54

    платить за белый IP адрес и уж тем более покупать доменное имя считаю лишним.

    У нас IP стоит 10-20р в месяц + домен .ru 289р в год. Итого 45 р в месяц... Такая себе экономия.


  1. censor2005
    13.07.2022 11:45

    Спасибо за статью, благодаря ей в комментариях узнал массу полезной информации и новых сервисов :)


  1. nevzorofff
    13.07.2022 13:11

    Я для себя проблему динамических, серых и прочих кривых доступов на удалённое оборудование решил подняв Mikrotik CHR на VPS за 80 рублей в месяц, а туда уже все нужные железки поднимают L2TP.


    1. ducemollari
      13.07.2022 21:02

      Это где за 80?

      Себе vps с wg сделал, чтобы свой HA видеть. Ну и банеры некоторые не видеть.


      1. nevzorofff
        13.07.2022 21:28

        Изначально был hostvds но он последний месяц чаще лежит, чем работает. Сейчас вот опять лежит. Благо переехать с Mikroltik CHR — это поменять запись в DNS и перекинуть конфиг на другой хостинг )

        У firstbyte вообще 55Р/мес, их вот только взял из-за проблем у первых.

        Я, честно, не понимаю как эти ребята зарабатывают, мне мой провайдер только статику за 50Р/мес даёт, а тут ещё VDS впридачу.


        1. nitro80
          13.07.2022 22:40

          Аккуратнее с firstbyte, по каким-либо причинам не будет денег на балансе лехко и непринужденно похерят сайт\сервер. Бекапов не делают.


      1. nitro80
        13.07.2022 22:38

        invs.ru, тариф Luna например.

        А вообще, poiskvps.ru


  1. werter_l
    13.07.2022 13:14

    ddns-updater - container to update dns records periodically with webui for many dns providers https://github.com/qdm12/ddns-updater

    Для постоянного белого ip:

    Vps за 100-200-300 руб\мес + wireguard (pivpn в помощь - 10 мин на все про все) + port forward с vps к себе https://github.com/mochman/Bypass_CGNAT

    Можно и собственный ddns https://limbomedia.net/etc/limbodns


  1. Timertatar
    13.07.2022 16:04

    Если белый, тогда лучше ddns от производителя роутера. В остальных случаях универсальный вариант, это vpn.


  1. kesn
    13.07.2022 16:18

    Мои глаза! Вот ваш код ревью подъехал:
    https://breakpoint.black/review/5369fa1b-0375-4bb7-aa8f-e3b1f8c79521/