Yana accessible par internet ?

edited août 2013 in Le tuto du poivrot
Bonjour les internautes !

En fait, j'pense pas que ce soit un tutoriel qui va toucher beaucoup de monde mais il se peut en effet que ça en intéresse certains :D
Le but de la manœuvre est de rendre disponible notre petit Yana-Server de n'importe où :)

1- Le mettre sur le Web

Ca parait tout bête mais certains ne savent pas comment s'y prendre.
Tout d'abord, imaginez votre accès vers le net comme un mur sur lequel on trouve de toutes petites interstices. Vous avez l'image à peu près de ce que sont les ports réseau.

Je tiens à préciser tout de même que mettre son Rapsberry Pi sur Internet, et même ouvrir un port réseau comporte des risques de sécurité. A vos risques et périls.

Pour pouvoir mettre votre Raspberry Pi sur Internet, il va falloir ouvrir le port 80 (et 443 si vous utilisez du https) qui est celui dédié aux pages internet. Pour ouvrir ces ports, rendez vous à mon adresse favorite : http://192.168.1.1./ (généralement c'est celle là. Si ça ne marche pas, rendez vous tout simplement sur la page de votre box ^^"). Vous vous trouverez, si vous êtes chez Orange, comme sur cette photo. 
J'ai donc piqué ça sur le net (ouuuups ?)


Loguez vous en administrateur, puis Configuration -> Livebox -> Paramètres avancés > NAT/PAT. Vous vous retrouverez sur une magnifique page avec marquer "Ajouter une nouvelle règle". Eh bien... faites donc ! Choisissez HTTP comme Application/Service et configurez le tout à votre guise, tant que le port 80 est ouvert.
Pour les utilisateurs d'autres box, la manipulation doit être sensiblement pareil? Recherchez sur Google "Comment ouvrir un port" et suivez le tutoriel, en ouvrant bien le 80.

Commentaires

  • Alors, le truc c**, c'est que sur certaines box, vous pourrez pas vérifier s'il est sur le net... (LOL).
    Trouvez votre IP externe ici : http://www.monip.org/
    Demandez à un ami ensuite d'aller sur cette IP pour voir si ça se log bien sur votre RPi (du style "Salut Poto. Tu sais que j'suis un espèce de gros geek ? Bah tu pourrais pas aller sur ce lien pour voir si ça marche : http://85.269.4.52/yana-server/"

    Si ça ne marche pas, vérifiez bien que la configuration de lighttpd ou apache2 écoute le port 80 (listen 80).

    2- J'ai une IP dynamique, patate !

    Bah oui. Ca arrive. C'est chiant hein ? Mais c'est pas si grave :)
    Vous avez un serveur Web ? Si non, trouvez en un gratuit sur Internet, car il va nous servir le bonhomme ! 
    On va dire au RPi d'aller inscrire l'adresse IP de votre réseau dans un fichier .txt
    On a donc besoin d'un serveur fixe, dans lequel on va mettre quelques fichiers :)

    A vrai dire, il va y avoir deux fichiers. Un .txt et un .php. Dans le cas où le fichier texte est IP_RPi.txt, le contenu de la page PHP sera celle ci :

    <?php
    $myFile = "IP_RPi.txt";
    $fh = fopen($myFile, 'w') or die("can't open file");
    $stringData = $_SERVER['REMOTE_ADDR'];
    fwrite($fh, $stringData);
    fclose($fh);
    ?>
    Amicalement,
    Nover
  • Il va donc prendre l'adresse IP externe de la personne qui va aller dessus et l'inscrire dans le fichier texte.
    Encore faudrait-il que le RPi aille l'inscrire régulièrement, cette adresse !
    Et c'est là qu'entre en compte un petit script en pythoooooon :D
    Créez un fichier IP_RPi.py. Editez le et remplissez le de ça :

    import urllib2
    import time
    while 1:
    urllib2.urlopen("http:// Adresse de votre page .php").read()
    time.sleep(1800)

    Respectez bien les tabulations ! Que va faire ce programme ? Il va tout simplement aller sur l'adresse toutes les 30 minutes ( "time.sleep(en seconde)" ).

    Il reste plus qu'à exécuter ce script au démarrage. Créez un fichier .sh, remplissez le de "python adressedevotrefichier.py". Par exemple, moi c'est "python /root/IP_RPi.py". Rendez le exécutable.
    Ensuite, faites dans le terminal "nano /etc/rc.local" et ajoutez y l'adresse de votre fichier .sh (pour moi : /root/command_boot.sh)
    Et voilà ! Votre script s'effectuera à chaque démarrage et toutes les 30 minutes, il ira réinscrire l'adresse IP. Même plus de problèmes !


    3- Y accéder en un lien

    Oui parce que bon, jongler entre deux liens, ça peut être chiant !
    Maiiiiiiiiis vous avez un joli serveur tout frais maintenant. On va r'foutre un fichier PHP là d'dans ! Appelez le index.php, par exemple. Remplissez le de ce code ensuite :

    <?php
    $IP = $_SERVER['REMOTE_ADDR'];
    $string = implode(file("IP_RPi.txt"));
    if($IP == $string){ $url = 'adresse locale de yana-server'; }
    else {  $url = 'http://'.$string.'/yana-server/'; }
    header( "Location: $url" );
    ?>

    Et voilà, le tour est joué. Mettez le tout sur le serveur tout frais, et voilà l'travail. Ce petit code php va simplement vérifier si vous avez la même IP externe que celle inscrit dans le fichier .txt, où se trouve l'IP externe de votre RPi. Si elles sont identiques, et bien c'est que vous êtes en local et vous redirigera vers la page locale. Sinon, il vous dirigera vers la page externe. Bon, ça a plusieurs lacunes hein ? Comme le fait que le serveur peut avoir des ralentissements et il peut être long à afficher la page. Et aussi que c'est pas super subtile comme méthode. Pis aussi que si vous utilisez un VPN ou un proxy, bah ça marchera paaaaaaas ^^" (à tester remarque...)

    Voilà. En espérant que c'était fun pour vous !
    Amicalement,
    Nover
  • Je tiens à re re re préciser que c'est dangereux de faire ça dans le sens où ça ouvre les vannes pour certaines intrusions. Et même, Yana au niveau sécurité, c'est pas infaillible. Donc faites gaffe !

    Désolé pour la séparation entre les post mais le fofo d'Idle tolère que très peu de caractères !
    Amicalement,
    Nover
  • Salut Nover, 

    si si très intéressant ton tuto, je l' essaierais quand j' en serais rendu à ce niveau.
  • Je comprend pas. C'est pas déjà ce qu'on fait avec YANA android accéder à yana depuis le net?
  • Par internet ? Pas forcément. Yana est d'abord prévue pour une utilisation sur réseau local (la preuve en est : Yana for Windows ne prévoit qu'un seul lien).
    L'intérêt est de pouvoir exploiter notre petit chez nous de loin, très loin ^^
    Amicalement,
    Nover
  • Ok mais on peut pas déjà le faire avec yana for android? 
  • C'est une tres mauvaise idée a mon gout, vraiment tres moche!

    Par contre un tunnel vpn ou ssh oui!

    L'objectif est atteind mais de maniere differente: au lieu d'ouvrir le reseau local au monde, on l'etend virtuellement a notre terminal a l'exterieur.

    C'est vraiment les seules vrais solutions, on devrais meme pas avoir cette discution.

    Go > http://openvpn.net/

  • @chep je suis d'accord avec toi j'ai d'ailleurs toujours pour objectif de me servir du pi comme d'un vpn.
  • Hello,

    Je partage l'avis de chep que l'idéal est de passer par un tunnel SSH ou un VPN. C'est ce que je fais ici, mais c'est un peu "galère" de devoir monter le VPN pour çà sur le téléphone lorsque l'on souhaite s'en servir. Rien de bien compliqué mais juste galère si on ne veut pas laisser le VPN en permanence.

    Une alternative - certes moins sécurisée - pourrait être d'ajouter une authentification au niveau du serveur web (en complément de celle déjà existante de YANA). Dans ce cas, on limite la surface d'attaque externe à une éventuelle faille au niveau du serveur web (Apache, Nginx, Lighthttp, ...) - sans s'exposer aux failles de l'application YANA qui tourne dans le serveur web. Comprendo ?

    Pour faire çà, il faudrait néanmoins adapter le client Android pour supporter la méthode d'authentification exigée par le serveur web (genre HTTP Basic déjà pour démarrer même si là encore c'est du statique ... une fois votre compte sniffée, cela fera plouf :p).

    @Nover : penses-tu envisageable de faire évoluer ton appli pour ajouter de manière optionnelle une telle authentification ? Un petit champ login/password dans la configuration qui s'ils sont renseignée pousse le header HTTP ad hoc.

    Côté serveur web :
    Exemple sur Nginx, il suffit d'ajouter les directives suivantes dans la section server ou location

      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/htpass;

    Puis d'ajouter les login/password dans /etc/nginx/htpass avec la commande htpasswd

  • Il existe plein d'appli android et surement ios pour creuser un tunnel d'un clic via un widget.

    Meme si c'est pas evident de monter un serveur vpn pour un debutant, c'est surement plus simple que de securiser apache

    Maintenir la securité sur des serveurs c'est presque un boulot quotidien, patch et mise à jour reguliere meme si on peut estimer qu'on est pas des cibles interessantes.
    Le plus securitaire c'est de limiter yana au reseau local en bloquant toute connection (au moins entrantes) via le routeur/firewall et de s'y connecter par reseau privé virtuel. Le port 80 ouvert c'est publique meme avec authentification. Pour moi (mais ca regarde que moi), la domotique c'est privé.

    une autre solution tres simple est d'utiliser sshtunnel sous android et d'atterir directement sur le rasp. ensuite on accede a yana comme si on etait sur le rasp.

    J'ai meme envie de dire que yana-for-windows et yana-for-android devrais creuser leur propre tunnel par defaut, aussi bien en local qu'a l'exterieur.

    @nover
    https://github.com/shikhar/sshj

    Voila un peu d'info, si tu arrive à integrer ca c'est super. tu securise direct ton appli et on peut meme jouer sur des profils en fonctions des clés dsa et donc de l'utilisateur connecté sur yana-server.

    Ca peu etre chouette par exemple pour donner le plein acces à nos enfants a leur chambre mais pas au reste de la maison.
  • L'idée était de taper dans la fourmilière, et c'est réussi ^^
    En fait, j'avais mis ça sur internet comme ça parce que je suis souvent en déplacement et j'voulais pouvoir bidouiller mon Rasp de n'importe où.
    Hors, on en parlait que vaguement sur certain topic, personne n'avait l'air vraiment motivé à s'intéresser à ça. C'est chose faites.
    Etant une quiche en sécurité toussah toussah, j'ai conscience et j'ai même bien rappelé que c'est dangereux de faire ça. C'était aussi à la population Yanacienne d'apporter ses connaissances.

    En tout cas, merci pour ces infos. Je vais pouvoir synthétiser tout ça mais je ne sais pas si je pourrais réellement l'adapter à Yana For Android, car j'ai plus le temps pour ... :( (A mon très grand regret !)
    Merci de toutes ces réponses, j'vous dis si je m'y mets et si j'affronte des problèmes.
    Amicalement,
    Nover
  • Tu connais ton code mieux que personne, tu va passer une heure la ou on va en passer 10...

    quand tu aura le temps hesite pas, avec sshj ca n'a pas l'air trop compliqué

    un exemple https://github.com/shikhar/sshj/blob/master/src/main/java/examples/Exec.java

    Pour l'instant je me concentre sur mon installation en ethernet pcq de toutes manieres je vie reclu dans les bois loin de la civilisation donc j'ai vraiment pas besoin d'acces depuis l'exterieur autre que mon vpn.
    Mais des que j'aurais plus de temps je jeterais un oeil a ton code pour le comprendre et t'aider.
  • Merci bien ! Je vais essayer d'intégrer ça, mais je promets vraiment rien !
    Je vais surement même ne pas le faire et préférer commenter mon code que la personne reprenant mon travail ne soit pas trop... déboussolée.
    Amicalement,
    Nover
  • ok ca marche commente ton code le plus possible, ca m'arrange! je pourrais le faire moi meme plus tard alors.

    Je commente pas mes propres codes et j'ai du mal a m'y retrouver alors ceux des autres...


  • En tout cas le vpn m'intéresse énormément alors si quelqu'un se sent de faire un petit tuto bien fait pour utiliser le pi comme vpn et pourquoi pas en plus se servir de ça pour contrôler sa domo depuis le net ce serais fantastique.
  • GeoGeo
    edited septembre 2013
    @Flink Jai bientot fini le tuto sur la seedbox, j'y ai intégré un VPN. (avec forçage du client torrent dans le vpn, reconnexion automatique en cas de perte ect ...)

    @Nover Pour l'ip dynamique, moi j'utilise no-ip :http://www.noip.com/
    Comme ça, le logiciel met à jour le domaine avec mon ip tous les 1/4 d'h :)
  • comment fait tu pour ensuite acceder avec no-ip? j'ai fait un compte no-ip et j'ai ensuite installer le client sur mon pi avec un ptit tuto trouvé sur le web! mais ces tout simplment apres tout cela, comment puis-je acceder a mon yana :( quand j'entre mon adress no-ip /yana-server ca ne marche pas tout simplement pas.. j'ai egalement ouvert le port 80 pour mon pi... 
  • GeoGeo
    edited octobre 2013
    @samnup
    Est ce que tu as ouvert le port aussi sur ta box ?
    Souvent faut autoriser l’accès de ta pi par ce port en lui précisant l'ip de la pi.
    genre 192.168.1.2:80
    Le client ne se relance pas tout seul non plus au reboot, tu peux faire ça:
    nano /etc/rc.local
    Et mettre juste avant exit(0):
    /usr/local/bin/noip2
    Cest pas tres propre mais ca fonctionne
  • J'ai besoin d'un coup de main en Python pour un script qui pourrait résoudre nos problèmes de sécurité lors de connexion à distance, en attendant d'avoir un VPN d'implémenté.
    On demanderait au Raspberry de regarder toutes les 30 minutes si son @IP n'a pas changée; Si changement, envoi d'un mail, et enregistrement de la nouvelle IP.
    Je suis parti du script de Nover, mais je n'y connais pas grand chose!
    J'ai donc copié des bouts de scripts deci-delà, et...ben ça marche pas sur l'émulateur Python sous windows que j'ai :-)
    Si quelqu'un s'y connait en Python...j'ai regardé pour le faire en php, et cela m'à l'air encore plus complexe!

    #import des librairies
    import urllib.request #Pour aller récupérer son IP sur un site qui te la donne: http://www.icanhazip.com/
    import time #Pour reprendre le script de Nover ;-)
    import smtplib #C'est la fonction d'envoi d'un mail
    from email.mime.text import MIMEText #c'est le module 'email' dont nous avons besoin

    #on va sur le site 'icanhazip.com' pour récupérer son @IP et la mettre dans une variable 'myIP'
    #bon...le résultat est b'xxx.yyy.zzz.aaa\n' mais ça peut être exploitable
    with urllib.request.urlopen("http://www.icanhazip.com/") as url: myIP = url.read()

    #on fait une boucle pour comparer l'@IP actuelle (newIP) avec celle enregistrée précédemment (myIP)
    while :
    with urllib.request.urlopen("http://www.icanhazip.com/") as url: newIP = url.read()
    if myIP = newIP:
    time.sleep(1800) #c'est ok, on attend 30 minutes, et on recommence
  • else:
    fb = open(newIP, 'rb') #on ouvre 'newIP' en texte brut
    msg = MIMEText (fp.read()) #on rentre l'@IP dans 'msg' (Y a-t-il plus rapide pour le faire?)
    fp.close() #on ferme cette définition
    msg['Subject'] = 'The contents of %s' %newIP #c'est le sujet du mail
    msg['From'] = moi #l'expéditeur sous forme toto@toto.com
    msg['To'] = you #l'@ mail qui reçoit l'infromation sous forme titi@titi.com
    s = smtplib.SMTP('localhost') #et on l'envoie
    s.sendmail(moi, [you], msg.as_string())
    s.quit()

    #Il faudrait également prévoir le cas d'une erreur à l'envoi du mail, dans le cas où la connection ne soit pas revenue... mais là, ce sera pour une 2ème étape ! Qu'en pensez-vous?
  • Salut Elfnoir,

    Documente toi sur le caractères génériques, le module re et le module string.

    Tu pourras parser ton résultat bien plus facilement.

    Je ne pense pas que tu ais besoin d'envoyer un mail pour ton besoin, cherche dans les docs HTTP voir si tu ne peux pas récupérer ton IP après une requète bidon sur un serveur lambda (genre google, le site d'idleman, bonjourmadame.fr ...) ;)

    K-P
  • Bonjour,
    En fait, je cherche à m'envoyer un mail sur mon téléphone portable, dès que mon Raspberry (qui ne part pas en vacances et continue de bosser) détecte un changement d'@IP à mon domicile, ce qui me permet de mettre à jour l' @IP externe de l'appli sur mon Android, pour continuer à communiquer des ordres au RPI...
    Mais je continue mes recherches :-)
  • Si vous voulez rendre YANA accessible par le web : penser à changer le nom de la base de données.

    Vous pouvez le faire en changeant le nom dans constant.php

    define('DB_NAME','');

    Idéalement il faudrait mieux mettre la base de données en dehors du serveur web.
    Par exemple /etc/yana
    mkdir /etc/yana
    cp /var/www/db/database.db /etc/yana
    chmod -R 740 /etc/yana
    chown -R www-data:www-data /etc/yana

    et puis modifier constant.php
    define('DB_NAME','/etc/yana/database.db');



Sign In or Register to comment.