Начало
Всё началось с покупки одноплатного компьютера. На нём я поднял облачный сервис 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)
GennPen
12.07.2022 11:51+22Не благодарите.
И да, вы путаете белый/серый с динамическим/постоянным IP-адресом.
dmitryvolochaev
12.07.2022 12:14+6Самое смешное, что все эти сервисы по определению своего айпи в данном случае излишни. Получатель письма узнает ваш внешний айпи, даже если вы сами его не знаете. При отправке через SMTP к письму добавляется заголовок Received: from с вашим IP
GennPen
12.07.2022 12:18Это то понятно. Просто тут письмо отправляется при смене внешнего IP. А чтобы зафиксировать смену IP нужно его знать машине, с которой отправляется письмо, для этого и существуют подобные сервисы чтобы не мучаться с входом на роутер.
slavius
12.07.2022 12:07+22Знание IP не особо поможет если он за NAT. Очень не всё сможет пройти через провайдера на серый IP.
serge-sb
13.07.2022 10:38+1Жил был у меня такой вот домашний роутер-сервер, в админке была встроенная поддержка определения IP и обновления его в (одном-российском-dns-хостере). Потом провайдер (бывшая Корбина) решил, что белые IP давать всем - слишком щедро. И IP
превратился в тыквупосерел. Ну, плюс 100р к абонентке, что ж поделать.А все эти скрипты - мне кажется, отдельной статьи не стоит. Наверняка в гугле превой же ссылкой это есть. Тем более не понятно, к чему этот скрипт: показать, как отправлять письмо с роутера? А для этого точно питон нужен? Если в роутере есть питон, то и sendmail там наверняка тоже есть.
cepera_ang
12.07.2022 12:20+1Tailscale. И будет всегда одинаковый, стабильный, всегда доступный из-за любых натов ip-адрес в собственной меш-сети, зашифрованной wireguard’ом.
dmitryvolochaev
12.07.2022 12:33Есть еще libp2p. И не надо никаких централизованных вещей вроде почты или DNS
saga111a
12.07.2022 13:23+5Как бы статический и динамический IP это пол беды, а вот нахождение за NAT указанный случай не решает совсем. Если очень надо то можно использовать вот такой сервис, для некоторых нужд бывает полезен.
silver47
12.07.2022 13:50+1А почему не воспользовались услугами одного из dyndns? Сам пользуюсь бесплатной учеткой на freedns.afraid.org лет 10 уже.
hollycon
12.07.2022 14:03+5У кинетика собственный Keenetic Cloud есть. Там же, из админки можно прокинуть порт на внутренний сервер. И ходить на него по просто имени.
PaulZi
12.07.2022 21:45Причем в нем можно одной кнопкой поднять https, и будет работать даже за nat, через облака кинетика
denkors
13.07.2022 10:11Немного не пойму как ddns или Keenetic Cloud могут помочь если у человека например серый адрес? Он как не получал доступа из мира так его и не получит пока у него на интерфейсе не будет публичный IP.
Lunti
13.07.2022 10:48туннель поднимет и из мира пакет придет сначала на сервер кинекта, а дальше уже по туннелю на роутер. Есть такое же решение у ngrok, но раньше там были какие-то ограничения в бесплатном варианте, вроде тестовый период 3 месяца (возможно путаю с кем-то другим)
cleverate
12.07.2022 14:36+9Про сетевую состовляющую и целесообразность скрипта уже все высказались, поэтому вставлю пять копеек по другой его части
Теперь в настройках Yandex Почты разрешим способ авторизации через портальный пароль. Это требуется для беспрепятственной авторизации.
Не требуется, есть пароли приложений
13werwolf13
12.07.2022 14:43+2curl -4 "https://DOMAIN:KEY@dyn.dns.he.net/nic/update?hostname=DOMAIN"
раз в 10 минут в crontab, и всё, никаких костылей. чем не решение?
GennPen
12.07.2022 17:46Они же только с доменом пользователя работают, а не как привычные dyndns-сервисы. Или что-то поменялось у них?
ABATAPA
12.07.2022 15:24+9Да... Хороший пример эффекта Даннинга-Крюгера...
Автору на будущее: не спешите выдавать окружающим свои мысли и решения — изучите сперва тему, узнайте, не тривиально ли Ваше решение, не ошибочно ли, изучите другие решения: может статься (как мы видим), что то, что Вам кажется из-за недостатка знаний "прорывом", таковым не является.kvk-2019
12.07.2022 16:07Желанию изучить что-то, наверно, не стоит всё-таки совсем уж мешать. Но, да, выбран совсем небезопасный устаревший и не рекомендуемый к применению протокол. Если уж брать IP, то с веб-морды по протоколу https, за одно парсить сайты может научится, js, а может ещё к веб дизайну потянет, с сертификатами и их проверкой разберётся, безопасное хранение паролей освоит, да мало ли. А так, да, задача типа на пару минут настроить бесплатный ddns на роутере, если не брать в расчёт возможный побочный эффект в виде мотивированного получения новых знаний. Может, почитает отзывы, и как-то это даже потом поможет.
HemulGM
12.07.2022 16:30Не думаю, что здесь кто-то против, что автор изучает что-то новое для себя. Ведь смысл коммента выше был в том, что это "что-то новое" - не всегда уже актуальное.
geekfil
12.07.2022 16:13+3Зачем такие сложности, когда есть Tailscale, Zerotier, Cloudflare Tunnel и прочие альтернативы.
rionnagel
12.07.2022 16:48-7ХавАйте статью у бульбу, пока яйцами не закидали. Слишком единичный юзеркейс, который имеет массу вариантов получше.
maledog
12.07.2022 18:40+4Вот только добрая половина провайдеров использует nat и не выдает белый IP - статья была актуальна лет 10 назад.
kisskin
13.07.2022 00:09О, кому-то ещё бесплатно внешний ip выдают...
eteh
13.07.2022 09:50Ну да, мне повезло с провайдером. Выделяет белый ip 4 и /56 ipv6
InChaos
13.07.2022 13:49Ростелеком, белый динамический IP.
FSA
14.07.2022 10:37Не факт. Уже в 2016 без статического IP можно было получить как белый адрес, так и серый. ddns уже нельзя было использовать. Так что, на сегодняшний день лучше или заказать статический IP у провайдера, или использовать дешёвый VPS с VPN, который, к тому же, позволит получать белый адрес даже там, где его принципиально не предоставляют или если вы часто меняете провайдеров.
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/
nitro80
13.07.2022 10:29Email есть у большинства пользователей смартфонов (но не все о нем знают), а вот телеграм есть далеко не у всех.
serge-sb
13.07.2022 10:48Поделитесь, пожалуйста, где можно найти такие цены? Если не ошибаюсь, продление домена (возьмём зону .ru) на год - что-то порядка 900р (оговорюсь, давно, более года, не проверял цены). Покупку раз в год нового домена (что вполне укладывается в приведённые вами 200р) не рассматриваем.
nevzorofff
13.07.2022 11:14+2Active.domains
serge-sb
13.07.2022 11:47Сошлюсь на хабр, там есть ещё хорошие ссылки (в т.ч. и указанный вами active.domains): https://habr.com/ru/post/338206/
Rasters
13.07.2022 11:26.ru регистрирую на: https://domains.webmoney.ru/services
Первый зарегистрировал где то в 2009-10 году, продление стабильно в пределах 200р.
SharUpOff
13.07.2022 10:43Мой роутер умеет и СМС отправлять через мобильную сеть и сообщения в Телеграм. Вот только толку от этого мало, потому что большинство провайдеров выдающих динамический IP выдают его серым. И тут два выхода: либо облако с белой статикой + VPN + NAT, либо платить провайдеру. Пользуюсь первым.
Rasters
13.07.2022 11:42Не всегда.
Мой провайдер выдаёт серый ip, но со статическим NAT'ом.
Что почти равно белому ip
mracoid
13.07.2022 10:54платить за белый IP адрес и уж тем более покупать доменное имя считаю лишним.
У нас IP стоит 10-20р в месяц + домен .ru 289р в год. Итого 45 р в месяц... Такая себе экономия.
censor2005
13.07.2022 11:45Спасибо за статью, благодаря ей в комментариях узнал массу полезной информации и новых сервисов :)
nevzorofff
13.07.2022 13:11Я для себя проблему динамических, серых и прочих кривых доступов на удалённое оборудование решил подняв Mikrotik CHR на VPS за 80 рублей в месяц, а туда уже все нужные железки поднимают L2TP.
ducemollari
13.07.2022 21:02Это где за 80?
Себе vps с wg сделал, чтобы свой HA видеть. Ну и банеры некоторые не видеть.
nevzorofff
13.07.2022 21:28Изначально был hostvds но он последний месяц чаще лежит, чем работает. Сейчас вот опять лежит. Благо переехать с Mikroltik CHR — это поменять запись в DNS и перекинуть конфиг на другой хостинг )
У firstbyte вообще 55Р/мес, их вот только взял из-за проблем у первых.
Я, честно, не понимаю как эти ребята зарабатывают, мне мой провайдер только статику за 50Р/мес даёт, а тут ещё VDS впридачу.
nitro80
13.07.2022 22:40Аккуратнее с firstbyte, по каким-либо причинам не будет денег на балансе лехко и непринужденно похерят сайт\сервер. Бекапов не делают.
werter_l
13.07.2022 13:14ddns-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
Timertatar
13.07.2022 16:04Если белый, тогда лучше ddns от производителя роутера. В остальных случаях универсальный вариант, это vpn.
kesn
13.07.2022 16:18Мои глаза! Вот ваш код ревью подъехал:
https://breakpoint.black/review/5369fa1b-0375-4bb7-aa8f-e3b1f8c79521/
Lunti
а че ddns уже отменили?
Loxmatiymamont
Слишком просто.
iig
И в большинстве роутеров прямо в веб-морде есть настройка этого самого ddns. Да, это непозволительно просто.
Serge78rus
Чтобы не было слишком уж просто и скучно, можно написать свой клиент обновления DDNS на bash или на том же Питоне. В жизни всегда есть место «подвигу».
HemulGM
Или подключить API провайдера, через которого будешь редактировать DNS зоны)
Главное, не платить целых 100р/мес за белый, статичный ip)
Aleksandr-JS-Developer
Между "бесплатно" и "1 цент" - огромная пропасть
hogstaberg
И не поспоришь. С чисто математической точки зрения одни цент в бесконечное множество раз больше нуля центов.
Mavolio-Bent
С чисто математической точки зрения один цент в неопределенное раз больше нуля центов.
id_potassium_chloride
Тут дело в психологии и нежелании вводить данные своей банковской карты лишний раз
Aleksandr-JS-Developer
Не совсем. К тому-же, это - провайдер, которому вы уже платите Х_денег/мес со своей карты. Ключевой момент в "бесплатно" и "платно".
Есть замечательный эксперимент про шоколадку и трюфель.
Суть в том, что посетителям предлагали к кофе две сладости шоколадку за 1 цент и трюфель за 35 центов.
Все брали трюфель, потому, что разница небольшая, а трюфель вкуснее.
Но потом сделали шоколадку бесплатной, а трюфель за 34 цента.
И посетители стали брать шоколадку, несмотря на туже разницу в 34 цента.
Именно это - один из главных барьеров в системе free2play, к примеру.
Hu3yP7
Я даже больше скажу, у кинетиков есть свой DDNS который поднимается парой кнопок без смс и регистрации.
HemulGM
У D-Link тоже
nitro80
И у mikrotik
InChaos
Да-да и у ASUS тоже
Areek
И они пока что ещё работают в России...
dmitryvolochaev
F0iL
Есть куча DDNS сервисов, не требующих покупки своего домена
DikSoft
Подскажите, если используете, что из них на сегодня более-менее живое есть?
snaiper04ek
duckdns
crawlingroof
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....
TimsTims
На микротике есть свой cloud, который бесплатно выдаёт свой ddns. Правда ip берётся из интерфейса, а не фактический публичный.
TimsTims
update: оказывается он всё-же берёт публичный адрес, но есть возможность форсированно брать локальный адрес (адрес с интерфейса).
yarkovoy
А для чего может понадобится брать локальный адрес? Всегда пользуюсь тот что внешний.
randomsimplenumber
Для использования внутри локальной сети.
TimsTims
Если немного подробнее, то представим, что вы используете городскую локальную сеть, где провайдер каждый раз выдаёт вам рандомный внутренний ip-адрес, и вы хотели бы его знать, чтобы подключаться, скажем, к своим камерам видеонаблюдения, используя ресурсы городской сети, а не через интернет.
Mayurifag
А чем заканчивается команда? Кажется, встроенный редактор съел окончание.
Evengard
Там api-токен для конкретного аккаунта. Ссылку надо просто брать из интерфейса сайта.
crawlingroof
ключом на смену dns, это я порезал
а на микротике мне уже привычней дергать урл, исторически сложилось
nitro80
No-ip
Правда зараза раз в месяц просит подтвердить доменное имя
K0styan
На одном из роутеров была опция - ddns сервис от производителя этого самого роутера (ЕМНИП, Asus) - так там домен 3 уровня был бесплатен.
Sequoza
Да автору просто скучно стало
KeenDNS
patisam
У Keenetic точно так же, совершенно бесплатно.