Hello,
Voici ma méthode pour configurer son routeur Ubiquiti UniFi Cloud Gateway Ultra pour bypasser la box SFR (Box SFR Plus dans mon cas).
Pré-requis:Il faut également récupérer les fichiers XML suivants:
Configuration réseau:Au niveau des interfaces, on branche simplement l'ONT sur l'interface WAN de l'UCG Ultra.
Se rendre dans Settings > Internet et sélectionner l'interface WAN 1. Configurer l'interface comme suit:
A partir de là vous avez normalement accès à Internet en IPv4.
Configuration TV:Cette étape est nécessaire si vous utiliser le décodeur Plus de SFR (pas besoin pour le SFR Connect TV).
Pour la partie TV, il faut se rendre dans la partie OS Settings > Console Settings et activer le SSH.
Se connecter en SSH sur le routeur, l'utilisateur est root.
Dans un premier temps on installe php-fpm, cela permettra d'interpréter le fichier index.php qui sera requêté par le décodeur Plus:
# apt update && apt install php-fpm
Ensuite on va paramétrer les bons droits sur la socket de php-fpm:
# vi /etc/php/7.4/fpm/pool.d/www.conf
On modifie listen.owner et listen.group comme suit:
listen.owner = nginx
listen.group = nginx
Maintenant on copie dans /root le fichier de configuration nginx en charge de l'écoute sur le port 80 (le décodeur requête en HTTP, pas en HTTPS):
# cp /data/unifi-core/config/http/site-local-ip.conf /root
On édite le fichier pour qu'il ressemble à ça:
# vi /root/site-local-ip.conf
server {
listen 443 ssl http2 default_server;
server_name _;
include /data/unifi-core/config/http/local-certs.conf;
include /usr/share/unifi-core/http/errors.conf;
include /usr/share/unifi-core/http/shared-server-defaults.conf;
include /usr/share/unifi-core/http/shared-post-setup-server.conf;
}
server {
listen 80 default_server;
index index.php;
server_name _;
root /var/www;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
include /etc/nginx/snippets/fastcgi-php.conf;
}
location /api/1.0/ {
rewrite ^(\?(.*)) index.php?$1 last;
}
location / {
try_files $uri $uri/ =404;
}
# return 301 https://$host$request_uri;
}
Cela permettra de désactiver la redirection HTTP vers HTTPS (pas de souci, l'interface de configuration UniFi n'est de toute façon pas publiée en HTTP), et de faire la réécriture d'URL nécessaire au décodeur.
Ensuite on créé le dossier /etc/nginx/snippets et le fichier /etc/nginx/snippets/fastcgi-php.conf:
# mkdir /etc/nginx/snippets && vi /etc/nginx/snippets/fastcgi-php.conf
On place ça dans le fichier:
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;
On crée aussi /etc/nginx/fastcgi.conf:
# vi /etc/nginx/fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
On n'oublie pas de créer le dossier /var/www/api/1.0:
# mkdir -p /var/www/api/1.0
Dans /var/www/api/1.0 on place les fichiers XML récupérés de la box SFR, à transférer en SCP.
On crée le fichier /var/www/api/1.0/index.php:
# vi /var/www/api/1.0/index.php
On met ce contenu dedans:
<?php
header('Content-Type: application/xml; charset=utf-8');
if (isset($_GET['method'])){
$method = $_GET['method'];
switch ($method) {
case "system.getInfo":
echo file_get_contents('system.getInfo.xml');
break;
case 'lan.getHostsList':
echo file_get_contents('lan.getHostsList.xml');
break;
case 'wan.getInfo':
echo file_get_contents('wan.getInfo.xml');
break;
case 'ftth.getInfo':
echo file_get_contents('ftth.getInfo.xml');
break;
case 'usb.getInfo':
echo file_get_contents('usb.getInfo.xml');
break;
case 'tv.getInfo':
echo file_get_contents('tv.getInfo.xml');
break;
}
return;
}
?>
Et enfin on place les bons droits:
# chown -R www-data:www-data /var/www
L'OS va écraser le fichier /data/unifi-core/config/http/site-local-ip.conf à chaque boot, il faut donc mettre en place un script pour mettre le bon contenu.
On crée le script /root/restore_nginx_conf.sh
# vi /root/restore_nginx_conf.sh
#!/bin/bash
/bin/sleep 120
/bin/cp /root/site-local-ip.conf /data/unifi-core/config/http/site-local-ip.conf
/bin/systemctl restart nginx
exit 0
Le sleep 120 est là pour être sûr d'écraser le contenu du fichier après les routines de démarrage de l'UCG Ultra.
On ajoute les droits d'exécution au script:
# chmod +x /root/restore_nginx_conf.sh
Et on ajoute le script dans la crontab à chaque redémarrage:
# crontab -e
@reboot /root/restore_nginx_conf.sh
Enfin on peut redémarrer le routeur, attendre 5 minutes et tester le bon fonctionnement en tentant d'accéder aux pages suivantes avec son navigateur (remplacer l'IP par celle du routeur):
http://192.168.1.1/api/1.0/?method=system.getInfo