Skip navigation.
Home

Мастерим свой динамический DNS из того, что есть.

Предупреждение:

профессиональным администраторам Linux и Юникс-систем это будет читать неинтересно, а любителям типа меня - вполне себе даже.

Сначала была жаба. Даже нет, не так. Жаба появилась чуть позже. Сначала была необходимость удаленно влезать в некоторые компьютеры под управлением linux. Одним из таких компьютеров является мой домашний сервер, вторым - компьютер моей мамы.

Я зарегистрировался на DynDNS, прописал там два хоста в виде homeserver.dyndns.org и mamapc.dyndns.org, прописал соответствующие правила в свой домашний роутер и в роутер мамы, и было мне счастье: по адресу homeserver.dyndns.org жил мой сервер, а по адресу mamapc.dyndns.org жил компьютер мамы.

Счастье длилось примерно года полтора. Затем вдруг DynDNS сказал, что халявы больше не будет, и начал прислылать письма следующего содержания:


"Дорогой пользователь!
Если вы вот прямо щас не метнетесь мухой подтвердить свой статус пользователя нашего сервиса, то мы обрубим нахрен вам оный сервис. Или платите денег, и тогда обрубать ничего не будем, и присылать письма перестанем"

Т.е. сначала жаба таки прыгнула на грудь владельцам сервиса DynDNS. Секундой позже она прыгнула на грудь мне, и я задумался о том, как бы сделать следующее:

1. Перестать зависеть от сервиса типа DynDNS и ему подобных вообще.
2. Создать механизм, который бы позволил получать доступ к любому количеству компьютеров, а не только к двум, как позволяется в бесплатной версии DynDNS. Кроме того, мне необходимо иметь возможность получать этот доступ не с одного, а с нескольких компьютеров.
3. Сделать это прозрачным и незаметным для пользователей тех компьютеров, где мне необходимо иногда бывать, без всяких "нажми вот эту кнопочку и введи вот эту команду".

в моем распоряжении имелся хостинг с доступом по sftp и этого в принципе более чем достаточно.

Шаг 1:

на всех компьютерах, куда нам надо попадать, при старте и каждый час (*) запускаем вот такой вот скрипт:

#!/bin/bash
#
# скрипт регулярно обновляет данные о внешнем ip-адресе компьютера
#
if [ $# -ne 1 ]
then
echo ""
echo "example: updateipinfo computer_name"
echo ""
exit;
fi
#
RES=$(lynx --dump http://ipecho.net/plain)
#
if [ -n "$RES" ]; then
echo "external ip-adress is:"$RES
else
echo "can not get info about external ip. Stop"
exit;
fi
#
# put ip-address into file
#
echo $RES > ~/$1
#
# transfer it onto home server
#
lftp -e "cd /amironov.com/некий_каталог; put ~/$1; bye" -u myftplogin,myftppassword ftp.amironov.com
#
# remove local file
#
rm ~/$1

(*) обеспечивается cron'ом.

Шаг 2: на всех компьютерах, откуда нам надо входить в сеть, при старте и на второй минуте каждого часа запускаем вот такой вот скрипт:


#!/bin/bash
#
# скрипт показывает ip-адрес компьютера мамы
#
lftp -e "cd /amironov.com/некий_каталог; get имя_с_которым запускался_первый_скрипт; bye" -u myftplogin,myftppassword ftp.amironov.com
#
#
MAMAIP=$(cat имя_с_которым запускался_первый_скрипт)
#
rm имя_с_которым запускался_первый_скрипт
#
echo "-------------------------"
echo "mother ip: "$MAMAIP
echo "-------------------------"
#
# Вот эта строчка будет модифицирована, если добавится еще компьютеров
#
cat /home/alex/.ssh/ssh_config_template | sed "s/MamaIP/$MAMAIP/" > /home/alex/.ssh/ssh.generated
mv /home/alex/.ssh/config /home/alex/.ssh/config_old
mv /home/alex/.ssh/ssh.generated /home/alex/.ssh/config

ну и собственно, кусок файла ssh_config_template:


Host mama
HostName MamaIP
ServerAliveInterval 60
ServerAliveCountMax 120
Port XXX
ForwardX11 yes
ForwardX11Trusted yes

Собственно и все. 30 минут работы, включая проверку, за помощь спасибо lryzhik.
Скрипты далеки от совершенства, я отлично понимаю, что по-хорошему надо бы иметь внешний список, а не зашивать это в виде "MAMAIP=$....", но сделаю это только если у меня будет хотя бы пяток компьютеров, за которые у меня болит голова.

Лирическое отступление для тех, кто совсем не в теме:

Зачем это все надо?

Дело в том, что когда родственники и друзья живут за пару тысяч километров, то объяснять по скайпу или телефону, куда надо ткнуть на компьютере в случае проблемы - процесс ни разу не простой. Linux в этом плане хорош тем, что конечному пользователю вообще не надо понимать, что там "под капотом", все, что ему надо сделать - это попросить о помощи по скайпу, письмом или телефонным звонком. Для обеспечения моего доступа ему не надо ничего запускать, настраивать и вообще знать: все необходимые операции делаются с моего компьютера парой комманд.

Нормально настроенный Linux для конечного неквалифицированного пользователя - идеальное решение: что-либо снести (или поставить) пользователь сам не может, исключены варианты поймать какую-либо гадость на свой компьютер и система работает 100% стабильно и надежно.