Pull to refresh

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

Reading time2 min
Views49K

Начало

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

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

Tags:
Hubs:
Total votes 69: ↑21 and ↓48-27
Comments95

Articles