Nginx me sert de reverse proxy pour accéder à ma machine depuis le web. Le but : que toutes les requêtes http qui arrivent sur le port 443 (https donc) de ma freebox asoient forwardées au serveur picuntu. La configuration de la freebox est très facile, je ne m'attarde pas sur ce point.

Sur le serveur picuntu, lancer la commande suivante pour installer nginx :

sudo apt-get install nginx

Configuration

Modifier le fichier de configuration par défaut :

sudo nano /etc/nginx/nginx.conf

Voici ma configuration :

user www-data;
worker_processes 1;
pid /run/nginx.pid;
events {
    worker_connections 768;
}
http {
    server {
        listen 443 default_server ssl;
        ssl_certificate server.crt;
        ssl_certificate_key server.key;
        auth_basic "Restricted to operators";
        auth_basic_user_file .htpasswd;

        location /shell/ {
            proxy_pass http://localhost:4200;
        } 
    }
}

Le fichier

Quelques commentaires :

  • worker_processes est limité à 1 pour ne pas surcharger le CPU avec des tâches de crypto (https)
  • nous écoutons sur le port https 443
  • nginx s'attend à trouver 3 fichiers : server.crt (le certificat https), server.key (la clé privée du certificat) et .htpasswd (authentification basique)
  • toutes les requêtes qui arrivent sur la route /shell/ sont redirigées vers le port 4200 : c'est ShellInABox

Génération de la clé privée et du certificat

Cette étape est expliquée dans la doc Nginx :

sudo -i
cd /etc/nginx
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
exit

Génération du fichier d'authentification

Cette étape est expliquée dans la FAQ Nginx

sudo -i
cd /etc/nginx
printf "LOGIN:$(openssl passwd -crypt PASSWORD)\n" >> .htpasswd
exit

Remplacer LOGIN et PASSWORD par le login et le password que vous allez devoir rentrer pour authentifier votre session http. Cela ne vous prémunis pas de devoir vous logger ensuite avec un vrai compte linux dans ShellInABox. C'est surtout pour cacher par défaut au monde extérieur l'ensemble des services présents sur votre machine.

Recharger les paramètres

Pour informer Nginx que la configuration a changé, et pour qu'il la recharge

sudo nginx -s reload

Tester

Voilà. Nginx transfère maintenant vos requêtes vers le bon service. Exemple : https://mafreebox.fr/shell. Depuis le monde extérieur, remplacer mafreebox.fr par votre adresse ip (par exemple).