Как-то раз, в блоге у Сергея Полякова я увидел рубрику Coding for fun. Поэтому, ту нехитрую работу, которую я проделал можно охарактеризовать как Administering for fun and profit. Начну сначала: в славном городе Самара широкополосный интернет (для домашнего использования) появился не так давно  и сразу начал активно развиваться. На настоящий момент доразвивался он до того, что безлимитный тариф со скорость 5Мбит стал вполне доступным. И все бы хорошо, но провайдер ни при каких условиях не согласен выделять статические интернет IP-адреса пользователям безлимитного тарифа. В силу того, что большую часть жизни я провожу на работе меня это не сильно напрягало, а вот моя вторая половинка, подловив меня на фразой «Кто в доме айтишник?» заставила задуматься о следующей проблеме: ей необходим доступ к домашнему компьютеру через интернет. Ситуацию значительно осложняло то, что домашний компьютер находится за роутером, который в свою очередь выходит в интернет через pppoe соединение. План был придуман сразу, а вот реализация затянулась…
Первым делом пришлось повозиться с роутером. Настоящий айтишник всегда готов к масштабированию своей домашней сети, поэтому роутер является также и DHCP-сервером. Вкратце настройка роутера свелась к нескольких шагам:
1) Настройка DHCP резервации для домашнего компьютера по его MAC-адресу
2) Настройка встроенного firewall’a для проброса необходимых портов.
Хочу отдельно отметить, что после того, как я поделился своими скоромными успехами в работе с встроенным firewall’ом мне пришлось выслушать очень длительную лекцию от Артема Синицына о различии в пробросе портов и публикации служб. Чтобы не приводить ее здесь целиком – резюмирую главное: проброс портов является серьезной потенциальной уязвимостью в вашей домашней машине. Прежде чем решиться на такой шаг – тщательно продумайте все аспекты безопасности.
Далее началась самая интересная для меня часть. При каждом переподключении к провайдеру, мой и без того нестатичный внешний IP-адрес менялся. Задача заключалась в том, чтобы всегда знать, какой IP-адрес в данный момент имеет роутер. Быстренько пробежав по интернет, я не нашел ничего, что бы на 100% подходило как решение моей задачи, поэтому было решено изобрести колесо и проделать некоторую работу по автоматизации оповещения. Хотелось чтобы рабочая станция автоматически узнавала внешний IP адрес и если бы он изменился, то присылала новый адрес на электронную почту или смс-сообщением. Честно сказать, первую часть задачи я уже решал в пору своей грасноглазой юности, для этого была использована кросс-платформенная утилита wget, которая и ныне доступна всем желающим. Источником внешнего адреса послужил ресурс whatismyip.com, который без лишней скромности отвечает на вопрос в собственном названии. Выполнив команду
wget -qO- www.whatismyip.com/automation/n09230945.asp получаем наш внешний адрес в чистом, текстовом виде. Заранее озаботимся о Command-Line SMTP клиенте. Я использую bmail.
Ну, а дальше в ход вступает старая школа, поскольку я так и не выучил PowerShell пришлось в очередной раз обратиться к старым добрым batch-скриптам:
C:\ip\wget -qO- www.whatismyip.com/automation/n09230945.asp > c:\ip\possible.txt
SET /P IP= < c:\ip\possible.txt
find "%IP%" "c:\ip\current.txt" > nul &if errorlevel 1 goto changed
goto end
:changed
type c:\ip\possible.txt > c:\ip\current.txt
c:\ip\bmail -s smtp.email.serv -t to@email.serv -f from@email.serv -h -a "home ip" -m c:\ip\current.txt -c
:end

Этот скрипт при первом запуске создаст 2 текстовых файла: possible.txt, который будет содержать адрес, полученный из сети Интернет. И current.txt в котором будет содержаться текущий (или прошлый в зависимости от того сменился ли он) IP-адрес. При каждом последующем запуске, скрипт записывает IP адрес в файл possible.txt и сверяет его с файлом current.txt. Если файлы сходятся (IP-адрес не изменился), то не происходит ничего, а если файлы не сходятся (IP-адрес изменился), то в файл current.txt записывается его обновленное значение и этот файл отправляется на электронную почту. Последним шагом мы добавляем полученный скрипт в планировщик заданий Windows и выставляем запуск каждые N минут/часов/дней. Я проверяю адрес каждый час, но можно это делать как чаще, так и реже.
Хочу заметить, что я создал папку в корне диска C:\ с названием IP. Я это сделал для того, чтобы в скрипте использовать статические пути к командам и файлам, если вы будете использовать другой путь, то не забудьте сменить его в командном файле.

9 Comments

  1. blog.alexm.ru says:

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

    Сам им пользуюсь, чтобы заходить через Стрим домой.

  2. Maxim Efremov says:

    Спасибо за коммент.
    Обязательно изучу.

  3. oji says:

    спасибо за ссылку на automation. А так да, для этой цели лучше подходит dyndns.org, тем более его поддержка есть во многих роутерах даже через веб-интерфейс.

    А подобный скрипт, на PowerShell (по-немногу изучаю, наконец-то) у меня выполняет другую задачу — есть два прова, лимитный и безлимитный. Скрипт проверяет, на каком висим сейчас и, если это лимит, убивает торрент, а если наоборот, запускает:

    Clear-Host
    $clnt = new-object System.Net.WebClient
    $url = «http://www.myip.ru/get_ip.php»
    $file = «$env:temp\mycurip.txt»
    $process = «utorrent»
    $program = «c:\temp\uTorrent\uTorrent.exe»
    $pattern=»ip.he.re.1″
    $clnt.DownloadFile($url,$file)
    If (Select-String -path $file -Pattern $pattern -quiet) {
    Get-Process $process | Stop-Process -Force
    } Else { if (@(Get-Process $process).count -eq 0) {Start-Process $program}
    }
    Remove-Item $file -Force

  4. Artyom Sinitsyn says:

    Мда, дружисче, Макс. Ты совсем не устаешь меня удивлять!
    Человек, плотно и грамотно сидящий в свое время на Slackware, сдавший затем все экзамены трека MCSE и MCITP, признанный сообществом MVP, не знает про DynDNS:
    http://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_DNS
    Во, сюжееет =)

  5. Aleksey Burov says:

    Добавлю занудности.
    Dynamic DNS – номер 1
    Hamachi Virtual Network – номер 2

  6. Maxim Efremov says:

    Hamachi я пробовал – он меня не порадовал. Очень громоздкое на мой взгляд решение. А про DynDNS.org я не слышал. Поставил себе в план на ознакомление =).

  7. what says:

    3. http://www.mesh.com
    4. http://www.teamviewer.com
    5. ipv6 – http://gogonet.gogo6.com/page/freenet6-services

  8. Maxim Efremov says:

    Решения подобные Hamachi & LiveMESH слишком «тяжелые» для такой задачи. Про Teamviewer и отстальные – не слышал, но подозреваю, что работают они схоже. А вот DynDNS – действительно подходящее решение. После свежей прошивки роутера, обнаружил, что добавилась поддержка 4х различных подобных сервисов. И если исключить тот факт, что так или инче приходится платить за подобный сервис (я имею ввиду постоянные сообщения от DynDNS с требованием подтвердить валидность использования) – подобное решение полностью устраняет проблему.

  9. begoeshitsuji1972 says:

Leave a Reply