Сам себе DynDNS или реализация Managed DNS посредством PowerShell

в 7:05, , рубрики: DNS, powershell, динамический ip, системное администрирование, удалённый доступ, метки: , ,

На улице сейчас прекрасные солнечные дни, так что большую часть своего времени я стал проводить вне своего дома с широким каналом, а где-нибудь в парке с нетбуком и 4g модемом. Это несомненно лучше для моего здоровья, но, тем не менее, большие файлы скачивать все-таки хочется, так что пришлось искать варианты способов для организации доступа в мою домашнюю сеть извне. Замечу сразу, что мой провайдер выдает своим пользователям динамические белые IPv4 адреса (к счастью, при вводе в эксплуатацию IPv6 необходимость в такого рода извращениях автоматически пропадет).

Задачи, стоявшие передо мной:

  1. Доступ ко всем компьютерам в сети
  2. Поддержка всех протоколов
  3. Легкость использования

Слово о структуре моей домашней сети:
Компьютеры (Win 7 + Win XP) -> Роутер (ZyXEL Keenetic 4G (прошивка v2.00)) -> L2TP VPN -> Интернет.

Для организации доступа такого рода доступны несколько вариантов:

  1. VPN по типу LogMeIn Hamachi
  2. Сервисы динамического DNS + проброс портов на роутере
  3. Велосипед: передача внешнего IP вовне + проброс портов на роутере

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

Второй вариант отпал уже после более долгого рассмотрения, в ходе которого проявились некоторые недостатки:

  • Доступ только к одному копьютеру
  • Доступ обеспечивается не обрашением к IP, а через фрейм, что сильно урезает возможности использования
  • Возможно перенаправление только HTTP, что не есть хорошо

Остается только третий вариант, значит мы будем городить свое решение для своих задач.

Для их выполнения нужно: во-первых, узнать текущий внешний IP, во-вторых передать его куда-нибудь вовне, и наконец — передать пакеты через домашний NAT. Если с последней задачей можно справиться средствами, которые есть у каждого роутера, то вот с первыми двумя разобраться уже посложнее.

Итак, после коротких раздумий для создания скрипта было решено использовать PowerShell, который является встроенным в Windows 7/8 инструментом, в XP или Vista его можно доустановить.

Для получения внешнего адреса использовался сайт myip.ru, вывод которого разбирался регекспом:

$ipsite = (new-object net.webclient).DownloadString("http://myip.ru")
е
if ($ipsite -cmatch '(?s)([0-9]{1,3}?.[0-9]{1,3}?.[0-9]{1,3}?.[0-9]{1,3}?)') {
$ip = $matches[1]
} else {о
Write-Error "Cannot get ip!"; return
}

Теперь, когда мы знаем наш IP адрес, нам нужно передать его вовне. Для этого, после недолгих раздумий, я решил использовать Dropbox. Но с его использованием есть одна проблема: я хотел создать файл html, содержаший ссылки к нужным мне ресурсам домашней сети, но Dropbox не показывает html, созданные из России (с российских IP). После некоторого поиска выяснилось, что он вполне себе отдает файлы xhtml, так что оставалось лишь переверстать шаблон и добавить его в скрипт.

Финальная версия скрипта представлена по ссылке.

Для автоматического запуска скрипта используется стандартный планировщик задач, запускающий скрипт раз в 10 минут. Сохраняться файл должен в папку Public или ее подпапки.

Для того, чтобы упростить доступ к этому файлу, и не выучивать наизусть длинную ссылку на него, я воспользовался bit.ly и создал там bitmark с запоминающимся адресом.

Автор: x0wl

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js