Как всегда знать свой адрес в сети и не платить за белый IP

от автора

Начало

Всё началось с покупки одноплатного компьютера. На нём я поднял облачный сервис 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

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


ссылка на оригинал статьи https://habr.com/ru/post/676454/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *