Как-то раз, в блоге у Сергея Полякова я увидел рубрику 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. Я это сделал для того, чтобы в скрипте использовать статические пути к командам и файлам, если вы будете использовать другой путь, то не забудьте сменить его в командном файле.
blog.alexm.ru says:
Есть замечательный сайт, который поможет тебе без всяких шаманств dyndns.org
Сам им пользуюсь, чтобы заходить через Стрим домой.
8 Декабрь 2009, 4:42 ппMaxim Efremov says:
Спасибо за коммент.
8 Декабрь 2009, 5:31 ппОбязательно изучу.
oji says:
спасибо за ссылку на automation. А так да, для этой цели лучше подходит dyndns.org, тем более его поддержка есть во многих роутерах даже через веб-интерфейс.
А подобный скрипт, на PowerShell (по-немногу изучаю, наконец-то) у меня выполняет другую задачу — есть два прова, лимитный и безлимитный. Скрипт проверяет, на каком висим сейчас и, если это лимит, убивает торрент, а если наоборот, запускает:
Clear-Host
8 Декабрь 2009, 5:43 пп$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
Artyom Sinitsyn says:
Мда, дружисче, Макс. Ты совсем не устаешь меня удивлять!
8 Декабрь 2009, 10:48 ппЧеловек, плотно и грамотно сидящий в свое время на 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
Во, сюжееет =)
Aleksey Burov says:
Добавлю занудности.
9 Декабрь 2009, 9:24 дпDynamic DNS – номер 1
Hamachi Virtual Network – номер 2
Maxim Efremov says:
Hamachi я пробовал – он меня не порадовал. Очень громоздкое на мой взгляд решение. А про DynDNS.org я не слышал. Поставил себе в план на ознакомление =).
9 Декабрь 2009, 10:06 дпwhat says:
3. http://www.mesh.com
10 Декабрь 2009, 1:15 дп4. http://www.teamviewer.com
5. ipv6 – http://gogonet.gogo6.com/page/freenet6-services
Maxim Efremov says:
Решения подобные Hamachi & LiveMESH слишком «тяжелые» для такой задачи. Про Teamviewer и отстальные – не слышал, но подозреваю, что работают они схоже. А вот DynDNS – действительно подходящее решение. После свежей прошивки роутера, обнаружил, что добавилась поддержка 4х различных подобных сервисов. И если исключить тот факт, что так или инче приходится платить за подобный сервис (я имею ввиду постоянные сообщения от DynDNS с требованием подтвердить валидность использования) – подобное решение полностью устраняет проблему.
10 Декабрь 2009, 11:24 дпbegoeshitsuji1972 says:
24 Январь 2010, 2:07 пп