Qnap [ NGrok ] [ 2.3.35.0 ] secure introspectable tunnels to localhost

QoolBox

Représentant QNAP
2 Janvier 2014
10 559
163
153
49
France
www.qnap.com
ngrok.png

Source : https://ngrok.com/

Download

https://www.qnapclub.eu/fr/qpkg/244

Note :

binaries in /opt/NGrok/ and NAS $PATH

About :

Secure tunnels to localhost : ”I want to expose a local server behind a NAT or firewall to the internet.”

demo.png


Build webhook integrations with ease

Building webhook integrations can be a pain: it requires a public address and a lot of set up to trigger hooks. Save yourself time and frustration with ngrok. Inspect the HTTP traffic flowing over your tunnel. Then, replay webhook requests with one click to iterate quickly while staying in context.

Run personal cloud services from your own private network

Own your data. Host personal cloud services on your own private network. Run webmail, file syncing, and more securely on your hardware with full end-to-end encryption.

webhooks.png
 
Merci, Qoolbox, je suis prêt à le tester !

EDIT:

Pour info: Stéphane a préparé une web interface accessible à la porte suivante: 27308

Pour utiliser NGrok il faut aller sur cette page (https://dashboard.ngrok.com) et créer un compte utilisateur.

Une fois crée on aura accès à une page de contrôle interne et on pourra visualiser son propre Tunnel Authtoken qui doit être la première fois installé sur le NAS en SSH avec le commande suivant:

Code:
[~] # cd /opt/NGrok
 [/opt/NGrok] # ./ngrok authtoken [Tunnel Authtoken]
 Authtoken saved to configuration file: /share/homes/admin/.ngrok2/ngrok.yml
Une fois cela fait, on a deux options:

1. passer les commandes directement sur le terminal (SSH or Telnet) avec les commande décrites ci dessous (en tenant compte qu'il faut toujours lancer ces commandes dans le folder /opt/NGrok/ en utilisant ./ngrock):

Code:
usage: 

 ngrok --help
 
NAME:
   ngrok - tunnel local ports to public URLs and inspect traffic

DESCRIPTION:
    ngrok exposes local networked services behinds NATs and firewalls to the
    public internet over a secure tunnel. Share local websites, build/test
    webhook consumers and self-host personal services.
    Detailed help for each command is available with 'ngrok help <command>'.
    Open http://localhost:4040 for ngrok's web interface to inspect traffic.

EXAMPLES:
    ngrok http 80                    # secure public URL for port 80 web server
    ngrok http -subdomain=baz 8080   # port 8080 available at baz.ngrok.io
    ngrok http foo.dev:80            # tunnel to host:port instead of localhost
    ngrok tcp 22                     # tunnel arbitrary TCP traffic to port 22
    ngrok tls -hostname=foo.com 443  # TLS traffic for foo.com to port 443
    ngrok start foo bar baz          # start tunnels from the configuration file

VERSION:
   2.0.19

AUTHOR:
  inconshreveable - <alan@ngrok.com>

COMMANDS:
   authtoken    save authtoken to configuration file
   credits      prints author and licensing information
   http         start an HTTP tunnel
   start        start tunnels by name from the configuration file
   tcp          start a TCP tunnel
   test         test ngrok service end-to-end
   tls          start a TLS tunnel
   update       update to the latest version
   version      print the version string
   help         Shows a list of commands or help for one command
Par exemple, si on veut créer un tunnel pour un service qui marche sur la porte 58000 il suffit de lancer sur SSH:
Code:
[/opt/NGrok] # ./ngrok http 58000

2. aller sur http://[NAS]:27308 et insérer les commandes qui seront lancés au démarrage.

À savoir que NGrok offre différents services, le plus basique est gratuit, mais les autres (bcp plus intéressants, comme le sub-domain reservation, https, etc.) sont payants.

Une option assez important, mas pas décrite dans la décrite dans le bloc avant est la possibilité de créer un accès avec authentication:

By default, ngrok tunnels do not require any username or password to access them. This means anyone who knows or guesses the URL or your tunnel can make requests to it. You can secure your tunnels with a username and password by specifying the -httpauth option when creating your tunnel. This will force HTTP basic authentication on all incoming requests to your tunnels and require that the credentials match those you specify on the command line.

Example: Add a username and password to your tunnel

Code:
$ ngrok -httpauth="helmet:12345" 80
Code:
$ curl -u "helmet:12345" https://3a4bfceb.ngrok.com

giopas
 
thanks Giopass partout :geek:

maintenant tu as accès à tout ...lol

un autre qui va te plaire : https://github.com/jsimonetti/tlstun j’attends le binaire x86 oublié par l'auteur
 
:) merci! Par contre je ne suis pas 100% d'avoir compris comment tlstun marcherait, car je vois une partie serveur et une partie client.. Mais on en parlera encore.

Sent from my A0001 using Tapatalk
 
Binaires x86 ajoutés :)

(En plus j'ai édité les autres posts avant)

Sent from my A0001 using Tapatalk
 
Salut Stéphane,

petite question: est-ce que c'est normale que dans ta Web Interface je lis "Open http://localhost:4040 for ngrok's web interface to inspect traffic." mais si j'essaye de me connecter à cet adresse/porte il n'y a rien (càd que la page ne se charge même pas)? Est-ce que c'est juste un erreur dans le descriptif ou je devrais vraiment trouver quelque chose à cet adresse/porte?

En plus, ainsi comme écrit ici, je n'ai pas compris comment voir le subdomain utilisé si j'envoie ngrok en background. Quelques idées? :D EDIT: apparemment [1] il est possible avec le webservice sur la porte 4040, mais justement je n'arrive pas a y accéder.

Merci!

giopas

[1] http://stackoverflow.com/questions/34322988/view-random-ngrok-url-when-run-in-background

EDIT: ça serait sympa si on pouvait voir directement dans l'interface 27308 que tu as fait, Stéphane, la liste des adresses créés en créant un petit cadre où les sousdomains sont listés en tournant ce script de stackoverflow:

Code:
import json
import os 

os.system("curl  http://localhost:4040/api/tunnels > tunnels.json")

with open('tunnels.json') as data_file:    
    datajson = json.load(data_file)


msg = "ngrok URL's: \n'
for i in datajson['tunnels']:
  msg = msg + i['public_url'] +'\n'

print (msg)
 
Pas de soucis pour cela. Mon problème est juste sur le localhost:4040, mais je vais essayer de nouveau dans les prochains jours.

PS: est-ce qu'il ne serait mieux de créer un lien symbolique au moment de l'installation pour ngrok, ainsi qu'on ne doit pas nécessariement aller dans /etc/NGrok?
 
giopas a dit:
Pas de soucis pour cela. Mon problème est juste sur le localhost:4040, mais je vais essayer de nouveau dans les prochains jours.

PS: est-ce qu'il ne serait mieux de créer un lien symbolique au moment de l'installation pour ngrok, ainsi qu'on ne doit pas nécessariement aller dans /etc/NGrok?

exact, ptet une modif à faire de ce côté...

pour l'interface web en 4040 tu as remplacé le localhost par 0.0.0.0 ?
 
Peut-être, à lire la doc [1], qu'il faudrait utiliser l'option de configuration suivante:

web_addr

Network address to bind on for serving the local web interface and api.

network address -> bind to this network address
127.0.0.1:4040 (default) -> default network address
false -> disable the web UI

Mais je ne suis pas sûr où il faut insérer ce paramètre...

[1] https://ngrok.com/docs

Edit:

Code:
[~] # curl http://127.0.0.1:4040
curl: (7) Failed to connect to 127.0.0.1 port 4040: Connection refused
 
Voilà, j'ai compris: le webserver sur la porte 4040 n'est pas accessible que si un tunnel est ouvert.

Pour accèder à KeyBox depuis ngrok j'ai configuré le suivant script sur le webserver de start/stop créé par Stépane (porte 27308):

Code:
#!/bin/sh

## /opt/NGrok/ngrok (type your command below for automatic exec when NAS/QPKG Start)
/opt/NGrok/ngrok http -bind-tls=false -inspect=false 58000
Le seul problème est que, à moins d'utiliser un reverse proxy vers http://127.0.0.1:4040 (ou peut être en utilisant le script python linké avant, mais que je n'ai pas testé), à ma connaissance ce n'est pas possible (avec un account gratuit) de savoir quel sousdomain a été affecté au tunnel créé.

Pour info, voici le reverse proxy que j'ai ajouté à /etc/config/apache/extra/httpd-vhosts-user.conf:

Code:
<VirtualHost *:80>
        ServerName xxx.mydomain.com
        ProxyRequests Off
<Proxy *>
        Order deny,allow
        Allow from all
</Proxy>
<Location />
        Order allow,deny
        Allow from all
</Location>
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:4040/
        ProxyPassReverse / http://127.0.0.1:4040/
        ProxyStatus On
</VirtualHost>
De cette manière une fois que le tunnel est actif, il est possible de lire et connaître le sous-domaine. Je devrais juste rajouter à ce vhost une authentication afinnde ne pas dévoiler sur le net que j'ai un service ouvert à un certain sous-domaine de ngrok.io
 
Pour info,

j'ai presque finalisé quelque ligne à mettre dans le start.sh script dans /opt/NGrok/ (ou à copier coller dans l'interface de Stéphane à la porte 27308) pour recevoir une notification sur QTS avec l'adresse du tunnel créé:

Code:
#!/bin/sh

## /opt/NGrok/ngrok (type your command below for automatic exec when NAS/QPKG Start)
nohup /opt/NGrok/ngrok http -bind-tls=false -inspect=false 58000 &

# after tunnel creation sleep for 10 seconds to ensure the tunnel is created
sleep 10

# take timestamp for notification
TIMESTAMP=$(date +"%Y-%m-%d %H:%M")

# create temp files and assign variables
CURL_NGROK="/share/Public/curl-ngrok.txt"
TR_NGROK="/share/Public/tr-ngrok.txt"
SERVER="/share/Public/server-ngrok.txt"
PUBLIC_URL="/share/Public/tunnel-ngrok.txt"

# take raw information
curl http://127.0.0.1:4040/api/tunnels > $CURL_NGROK

# put raw information in column (by ")
tr '"' '\n' < $CURL_NGROK > $TR_NGROK

# take 24th line (information on tunneled server)
sed '24q;d' $TR_NGROK > $SERVER

# take 14th line (information on tunneled url)
sed '14q;d' $TR_NGROK > $PUBLIC_URL

# send output to QTS
/sbin/log_tool -a "$TIMESTAMP - Ngrok http tunnel created for `head -n 1 $SERVER` to `head -n 1 $PUBLIC_URL`." -t 1 >&2

Dans le script /opt/NGrok/stop.sh (ou dans la section stop de l'interface 27308) on pourrait donc rajouter:

Code:
killall -9 -f ngrok

# assign variables
CURL_NGROK="/share/Public/curl-ngrok.txt"
TR_NGROK="/share/Public/tr-ngrok.txt"
SERVER="/share/Public/server-ngrok.txt"
PUBLIC_URL="/share/Public/tunnel-ngrok.txt"

# remove temporary files
rm $CURL_NGROK $TR_NGROK $SERVER $PUBLIC_URL

Je dois encore tester ce code, mais il devrait marcher. EDIT: le code marche bien mnt! :)

ps: noter que j'utilise ici nohup pour envoyer proprement la commande en background. Nohup peut être installé avec Entware-ng avec un simple:
Code:
[~] # opkg install coreutils-nohup

EDIT: version finale ici: http://www.forum-nas.fr/viewtopic.php?f=21&t=3382&p=21656#p21656
à noter que en effet nohup va créer un problème au démarrage et pour ce fait il a été supprimé dans la dernière version du script.
 
Stéphane, est-ce que c'est normal que après un rédémarrage ngrok ne démarre pas le script start.sh? Je croyais qu'il se lancait tout seul...