duckdns: адресація віддаленої машини з динамічним ip

попри чималий вже досвід використання linux, я майже чайник у багатьох питаннях, що стосуються налаштування серверних функцій. аж ось виникло бажання навчитися деяких фокусів — приміром, підключатися по ssh до віддаленого комп'ютера (я в канаді, комп'ютер — в україні), дистанційно налаштувати там vpn і зробити собі зашифроване вікно у світ.

після закриття fs.to і ex.ua задача трохи втратила свою актуальність, але не зовсім: лишаються торенти, за які тут можуть надавати по руцях. ну і взагалі — чи не сором цього не вміти, користуючись linux'ом? отож.

наразі на віддаленій машині працює teamviewer — чудовий інструмент, але не  «канонічний»: не вільний і працює над wine'ом, що прийнятно для запуску забавок, але не для більш чи менш серйозних задач.

duckdns: як «пробити» динамічний ip

отже, задача — «пробити» динамічний ip (себто, задача не в самім ip, зрозуміло, а в тому, щоби адресувати віддалену машинку, яка отримує динамічний ip від свого провайдера). найвідоміший сервіс — dyndns, але він віднедавна недоступний задурно. з чималої кількости альтернатив зупинився на duckdns. сервіс прекрасний своїм мінімалізмом.

переглянув інструкцію на duckdns.org та ще одну покрокову підказку в тенетах. зареєструвався через twitter (можна facebook чи google plus), отримав свій унікальний ідентифікатор (token в термінах duckdns); зареєстрував два домени — один для віддаленої машини (умовно tivasyk_ukraine), а другий — суто для тестування на локальному ноутбуці (tivasyk_test).

простий варіант команди для поновлення запису ip на duckdns для певного домену:

/usr/local/bin/curl "https://www.duckdns.org/update?domains=tivasyk_test&token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx&ip="

перевірив на локальній машині — ip на сайті поновився на мій поточний, і тепер машинка пінгується за доменним іменем:

ping tivasyk_test.duckdns.org

пробую те саме на віддаленій машині, підключившись через teamviewer:

/usr/local/bin/curl "https://www.duckdns.org/update?domains=tivasyk_ukraine&token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx&ip="
ping tivasyk_ukraine.duckdns.org

працює!  

cron: періодичне виконання

налаштувати періодичне виконання цієї команди, щоби віддалена машина самотужки звітувала про свій ip на duckdns.

як я зрозумів, є принаймні два варінати рішень: ddclient або cron. перший автоматизує процес за допомогою perl-скрипта, другий — змушує системний планувальник запускати періодично вказану вище команду.

cron канонічніший. за підказкою duckdns треба за допомогою crontab -e додати рядок до списку задач cron у хитромудрому форматі:

*/5 * * * * /usr/local/bin/curl 
"https://www.duckdns.org/update?domains=tivasyk_ukraine&token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx&ip="

(насправді ducksdns радить трохи інакше, але щоби не морочитися з окремим файлом скрипта, можна й так). але я трохи чітер, тож встановив собі gnome scheduler і скористався графічним інтерфейсом для цього.

на віддаленій машині (elementary os на базі ubuntu) сервіс cron, здається, працює «з коробки», принаймні пошук демона повертає номер відповідного процесу:

pidof crond

якщо не працює, то:

sudo service cron start

а от на моєму ноутбуці (manjaro на базі arch linux) довелося спершу запустити cronie, і тоді перевірка статусу сервіса показує, що задача виконується:

systemctl enable cronie
systemctl start cronie
systemctl status cronie


наче працює. але тут мені захтілося спробувати ще й ddclient. отже…

ddclient: альтернативний спосіб

ddclient — це perl-скрипт, що сам опікується поновленням інформації про поточний ip на онлайнових сервісах на кшалт dyndns, при цьому підтримує їх цілу купу включно з duckdns. встановлюється з репозиторіїв; для debian/ubuntu та похідних:

sudo apt-get install ddclient

для arch та похідних:

sudo pacman -S ddclient

перед першим запуском… стривайте, треба ж прибрати задачу cron, створену раніше. отже, перед запуском сервіса роблю бекап файлу конфігурації /etc/ddclient/ddclient.conf і редагую, як пише книжка — потрібно просто розкоментувати (або додати, якщо не було в шаблоні) розділ для duckdns:

##
## Duckdns (http://www.duckdns.org/)
##
password=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
protocol=duckdns tivasyk_test

за пароль слугує ідентифікатор (token), призначений duckdns. далі вмикаю і запускаю сервіс:

sudo systemctl enable ddclient.service
sudo systemctl start ddclient.service

і можна перевірити, чи працює:

sudo systemctl status ddclient.service

здається, працює. складно сказати, бо рутер не відключався, нову адресу для нього провайдер не видавав, відповідно на сайті duckdns.org мій айпішник не мінявся.

результат: адресація машини з динамічним ip

ну і, власне, результат — заради чого все робилося. я не знаю ip віддаленої машини, але повинна працювати адресація за доменним іменем (пінгую обидва комп'ютери по черзі):

ping tivasyk_ukraine.duckdns.org
ping tivasyk_test.duckdns.org

звісно, поки що пінгуються зовсім не комп'ютери, а рутери. до речі, пінг на рутер в мережі freenet — близько 140-150 мс зараз.

досвіченим користувача linux все це нецікаво, але я занотовую собі на згадку, і хто зна, може ще для когось це правитиме за підказку. наразі все, далі буде: встановлення openssh, налаштування (якщо знадобиться) форвардингу ssh на рутері, ну і далі дослідження на тему практичного використання ssh в побуті =)