{"id":2121,"date":"2021-02-10T23:10:45","date_gmt":"2021-02-10T23:10:45","guid":{"rendered":"http:\/\/blog.rastersoft.com\/?p=2121"},"modified":"2021-02-10T23:10:47","modified_gmt":"2021-02-10T23:10:47","slug":"acceso-remoto-con-ip-dinamica","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=2121","title":{"rendered":"Acceso remoto con IP din\u00e1mica"},"content":{"rendered":"<p>Poder acceder a tus datos en cualquier momento, aunque no est\u00e9s es casa, es una maravilla: abrir un FTP y poder copiar cualquier cosa desde tu ordenador siempre es muy pr\u00e1ctico. Por desgracia, en la pr\u00e1ctica suele haber dos problemas:<\/p>\n<ul>\n<li>Si tu ordenador est\u00e1 apagado y no hay nadie en casa, no puedes acceder<\/li>\n<li>Si tienes IP din\u00e1mica es probable que no sepas cual tienes en un momento determinado<\/li>\n<\/ul>\n<p>Hay gente que nunca apaga su PC, pero ese no es mi caso: prefiero tenerlo apagado cuando no lo utilizo. Por otro lado, aunque mi proveedor de internet es bastante razonable en cuanto a las IPs din\u00e1micas (intenta darte siempre la misma), alguna que otra vez cambia. Por eso quer\u00eda encontrar una soluci\u00f3n que me permitiese acceder de manera c\u00f3moda a mi equipo siempre que quiera. Y la encontr\u00e9 en Telegram.<\/p>\n<p>B\u00e1sicamente se me ocurri\u00f3 crear un peque\u00f1o <a href=\"https:\/\/core.telegram.org\/bots\"><em>bot de Telegram<\/em><\/a> que corre en una <a href=\"https:\/\/www.raspberrypi.org\/\">Raspberry Pi<\/a> que utilizo como servidor multimedia en casa y que, por tanto, siempre est\u00e1 encendida. Este <em>bot<\/em> acepta dos comandos:<\/p>\n<ul>\n<li>\u00bfCual es la IP externa? Para ello el bot, que corre en local, utiliza <a href=\"https:\/\/en.wikipedia.org\/wiki\/Universal_Plug_and_Play\">uPnP<\/a> para preguntar al router cual es la direcci\u00f3n IP actual, y responde con un mensaje indic\u00e1ndola.<\/li>\n<li>Encender ordenador principal, cosa que hace mediante <a href=\"https:\/\/en.wikipedia.org\/wiki\/Wake-on-LAN\">WakeOnLan<\/a>.<\/li>\n<\/ul>\n<p>Con estas dos opciones ya tengo acceso constante a mi ordenador desde el exterior sin necesidad de tenerlo encendido todo el rato ni de jugar a la ruleta para ver si conservo la misma IP que la \u00faltima vez que me conect\u00e9. Este es el c\u00f3digo:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">#!\/usr\/bin\/env python3\n\nimport telegram\nfrom telegram.ext import Updater, CommandHandler\nimport miniupnpc\nfrom wakeonlan import send_magic_packet\n\n# la MAC del equipo a encender\nmad_addr = 'XX:XX:XX:XX:XX:XX'\n\n# El token de nuestro bot\nupdater = Updater(\"XXXXXXX:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY\")\n\n# Solo nos autorizamos a nosotros, para evitar que se nos cuelen hasta la cocina\ndef check_id(update):\n    \"\"\" Incluir comprobaci\u00f3n de identidad. Si es correcta, devolver TRUE;\n        si no, devolver FALSE \"\"\"\n    if update.message.from_user.id != \"XXXXXXXXXXX\":\n        return False\n    return True\n\n\n# Devuelve un mensaje de Telegram con la IP actual\ndef get_ip(bot, update):\n\n    if check_id(update):\n        u = miniupnpc.UPnP()\n        u.discoverdelay = 200\n        u.discover()\n        u.selectigd()\n        update.message.reply_text(\"IP externa: {:s}\".format(u.externalipaddress()))\n    else:\n        update.message.reply_text(\"Acceso denegado\")\n\n\n# Utiliza WakeOnLan para encender el equipo\ndef encender(bot, update):\n    if check_id(update):\n        send_magic_packet(mac_addr)\n        update.message.reply_text(\"Encendiendo\")\n    else:\n        update.message.reply_text(\"Acceso denegado\")\n\n\n# Configuramos nuestro bot con los comandos nuevos\nupdater.dispatcher.add_handler(CommandHandler('ip', get_ip))\nupdater.dispatcher.add_handler(CommandHandler('encender', encender))\n\n# y lo lanzamos\nupdater.start_polling()\nupdater.idle()\n<\/pre>\n<\/div>\n<p>Utiliza los m\u00f3dulos <em>python-telegram-bot<\/em>, <em>wakeonlan<\/em> y <em>miniupnpc<\/em>. Como vemos, se definen dos comandos,<em> ip<\/em> y <em>encender<\/em>. Eso s\u00ed, hay que configurar algunas cosas:<\/p>\n<ul>\n<li>En primer lugar, necesitamos obtener un <a href=\"https:\/\/www.siteguarding.com\/en\/how-to-get-telegram-bot-api-token\"><em>token<\/em><\/a> de Telegram para nuestro <em>bot<\/em>.<\/li>\n<li>En segundo lugar, hay que poner la <a href=\"https:\/\/en.wikipedia.org\/wiki\/MAC_address\">direcci\u00f3n MAC<\/a> del equipo que queremos encender.<\/li>\n<li>En tercer lugar, hay que configurar qu\u00e9 usuario tiene derecho a ejecutar los comandos, en la funci\u00f3n <em>check_id()<\/em>. Esto es necesario para evitar que cualquiera se pueda abrir una conversaci\u00f3n con nuestro <em>bot<\/em> y \u00abtocarnos las narices\u00bb.<\/li>\n<\/ul>\n<p>Por motivos obvios he eliminado los valores de mi token, direcci\u00f3n MAC, y los par\u00e1metros que compruebo para certificar la validez del usuario. Cada uno debe poner los suyos propios.<\/p>\n<p>Una vez hecho esto queda la segunda parte: garantizar que se lance siempre que se arranque la placa. En teor\u00eda parecer\u00eda que no ser\u00eda necesario si siempre va a estar encendida, pero ya sabemos que, a veces, se va la luz, o hay que reiniciarla para instalar actualizaciones&#8230; por eso hay que a\u00f1adir un fichero para convertirlo en un servicio <a href=\"https:\/\/en.wikipedia.org\/wiki\/Systemd\">systemd<\/a>, de manera que se arranque siempre autom\u00e1ticamente. Este es el fichero que utilizo yo:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">[Unit]\nDescription = Lanzar telegrambot\nAfter = network.target\n[Service]\nRestart = always\nRestartSec = 1\nExecStart = \/usr\/bin\/encenderbot.py\n[Install]\nWantedBy = multi-user.target<\/pre>\n<\/div>\n<p>El cual, obviamente, asume que he copiado el c\u00f3digo anterior en <em>\/usr\/bin\/encenderbot.py<\/em>. Este fichero se llamar\u00e1 <em>encenderbot.service<\/em> y se copiar\u00e1 en <em>\/etc\/systemd\/system<\/em>. Una vez copiados los ficheros basta con ejecutar:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">systemctl start encenderbot.service<\/pre>\n<\/div>\n<p>para lanzarlo, y<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">systemctl enable encenderbot.service<\/pre>\n<\/div>\n<p>para que se lance autom\u00e1ticamente en cada arranque.<\/p>\n<p>Por \u00faltimo, queda un detalle importante por resolver, y es que<a href=\"https:\/\/en.wikipedia.org\/wiki\/GNOME_Display_Manager\"> GMD3<\/a>, por defecto, tiene activado el ahorro de energ\u00eda, lo que significa que si encendemos el ordenador pero no nos identificamos, al cabo de unos minutos (en torno a 20) el ordenador <a href=\"https:\/\/en.wikipedia.org\/wiki\/PC_power_management\">entrar\u00e1 en suspensi\u00f3n<\/a>. Esto es un problema, pues nos obligar\u00eda a enviar de vez en cuando la se\u00f1al de WakeOnLan, adem\u00e1s de cortar cualquier conexi\u00f3n que tengamos si dura m\u00e1s de 20 minutos. Para resolverlo tenemos que desactivar dicha suspensi\u00f3n. Sin embargo, no basta con quitarla en nuestro panel de configuraci\u00f3n, porque eso s\u00f3lo influye en nuestra sesi\u00f3n. Tenemos que hacerlo para GDM3, que se ejecuta como un usuario diferente, y para ello utilizaremos estos comandos:<\/p>\n<div class=\"mycode\">\n<pre class=\"mycode\">xhost +\nsudo -u gdm dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'\nsudo -u gdm dbus-launch gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'nothing'\nxhost -<\/pre>\n<\/div>\n<p>El primer comando desactiva la seguridad en X11 y es necesario si estamos en Wayland, fundamentalmente. El segundo configura GDM3 para que no entre en suspensi\u00f3n cuando el equipo est\u00e1 conectado a la corriente, y el tercero para lo mismo pero cuando est\u00e1 alimentado con bater\u00edas. El cuarto reactiva la seguridad en X11. Un detalle importante es que, en Debian, el usuario no es <em>gdm<\/em>, sino <em>Debian-gdm<\/em>, por lo que si utilizamos ese sistema operativo o uno derivado, lo m\u00e1s probable es que haga falta que los comandos empiecen con <em>sudo -u Debian-gdm dbus-launch&#8230;<\/em><\/p>\n<p>Y con esto ya tenemos una manera de conocer en todo momento nuestra IP externa y de encender nuestro ordenador de manera remota. Ahora s\u00f3lo nos queda ir a nuestro Telegram, buscar a nuestro <em>bot<\/em> con el nombre que le dimos al crearlo, e iniciar un chat con \u00e9l para poder enviarle los comandos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Poder acceder a tus datos en cualquier momento, aunque no est\u00e9s es casa, es una maravilla: abrir un FTP y poder copiar cualquier cosa desde tu ordenador siempre es muy pr\u00e1ctico. Por desgracia, en la pr\u00e1ctica suele haber dos problemas: Si tu ordenador est\u00e1 apagado y no hay nadie en casa, no puedes acceder Si &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=2121\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Acceso remoto con IP din\u00e1mica<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,6],"tags":[],"class_list":["post-2121","post","type-post","status-publish","format-standard","hentry","category-programacion","category-trucos"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/2121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2121"}],"version-history":[{"count":16,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/2121\/revisions"}],"predecessor-version":[{"id":2137,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/2121\/revisions\/2137"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}