Afficher/cacher Sommaire
Debian 8
Boot sur “Parted Magic”
- Relever adresse ip : 192.168.0.45
- Changer mot de passe root
- se connecter ssh :
ssh root@192.168.0.45
Partitionnement
Partionnement d’un disque SSD de 120G
root@partedmagic:~# gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.6
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries.
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-234441614, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-234441614, default = 234441614) or {+-}size{KMGTP}: +32M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): ef02
Changed type of partition to 'BIOS boot partition'
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-234441614, default = 67584) or {+-}size{KMGTP}:
Last sector (67584-234441614, default = 234441614) or {+-}size{KMGTP}: +256M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): n
Partition number (3-128, default 3):
First sector (34-234441614, default = 591872) or {+-}size{KMGTP}:
Last sector (591872-234441614, default = 234441614) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'
Command (? for help): p
Disk /dev/sda: 234441648 sectors, 111.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D83D84F4-9955-4C12-8281-55F4D695F1CA
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 234441614
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 67583 32.0 MiB EF02 BIOS boot partition
2 67584 591871 256.0 MiB 8300 Linux filesystem
3 591872 234441614 111.5 GiB 8E00 Linux LVM
Command (? for help):
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.
LVM
Les partitions
Disk /dev/sda: 234441648 sectors, 111.8 GiB
Number Start (sector) End (sector) Size Code Name
1 2048 67583 32.0 MiB EF02 BIOS boot partition
2 67584 591871 256.0 MiB 8300 Linux filesystem
3 591872 234441614 111.5 GiB 8E00 Linux LVM
On utilise LVM pour la gestion du disque SSD
Création volume physique
pvcreate /dev/sda3
Création groupe
vgcreate vg-ssd-one /dev/sda3
Création des volumes logiques
lvcreate -L 20G -n root vg-ssd-one
lvcreate -L 60G -n home vg-ssd-one
lvcreate -L 4G -n swap vg-ssd-one
lvcreate -L 27G -n rootb vg-ssd-one
Boot sur Debian8/USB pour installation de base
Installation debian jessie (clé USB bootable netinst) sur Disque SSD “Sandisk” 120GB partionné par gdisk
On valide ssh et système
machine : shuttle
Utiliser le partitionnement manuel
ip : 192.168.0.45
Connexion SSH
Connexion
ssh yann@192.168.0.45
Màj
apt update && apt upgrade
Installer outils
apt install rsync curl tmux jq figlet git
Visudo pour l’accès root utilisateur yann
apt install sudo
echo "yann ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
Si vous tentez de redémarrer/éteindre une machine distance par ssh, vous pourriez constater que votre session ne se termine pas correctement
sudo apt-get install libpam-systemdh
fstab
Disque Sata 4To sur /dev/sdb
PV VG Fmt Attr PSize PFree
/dev/sda3 vg-ssd-one lvm2 a-- 111,50g 27,50g
/dev/sdb3 vg-nas-one lvm2 a-- 3,64t 2,02t
Toutes les opérations se font en mode su
On va ajouter les montages sur video et yanplus
Création des points de montage
mkdir /media/{video,yanplus}
Ajout des points de montage au fichier /etc/fstab
/dev/mapper/vg--nas--one-yanplus /media/yanplus ext4 defaults 0 2
/dev/mapper/vg--nas--one-video /media/video ext4 defaults 0 2
Remonter le tout
mount -a
Vérifier
ls /media/yanplus
ls /media/video
NFS serveur
Installation
on passe en mode su
sudo -s
Installation
apt install nfs-kernel-server
systemctl start nfs-kernel-server
Sécurisation
Le protocole RPC n’a pas la réputation d’être bien sécurisé, mais la version 4 de NFS entend corriger ce problème, elle est donc à privilégier. Il est déconseillé d’effectuer un partage NFS via internet, ou bien dans ce cas, opter pour un tunnel crypté.
- S’assurer que les partages sont réservés à certaines IP dans /etc/exports
- S’appuyer sur rpcbind (/etc/hosts.deny et /etc/hosts.allow) pour sécuriser l’accès au serveur NFS
- Configurer convenablement iptables
Tout le monde est interdit, puis le LAN est autorisé:
nano /etc/hosts.deny
rpcbind mountd nfsd statd lockd rquotad : ALL
nano /etc/hosts.allow
rpcbind mountd nfsd statd lockd rquotad: 192.168.0.
iptables (NFS)
Par défaut, les différents services NFS (lockd, statd, mountd, etc.) demandent des assignations de ports aléatoires à partir du portmapper (portmap/rpcbind), ce qui signifie que la plupart des administrateurs doivent ouvrir une gamme de ports dans leur base de règles de pare-feu pour que NFS fonctionne.
Il va donc falloir fixer les ports de ces services afin de créer les règles iptables.
nano /etc/default/nfs-common
STATDOPTS=”–port 32765 –outgoing-port 32766”
nano /etc/default/nfs-kernel-server
RPCMOUNTDOPTS=”-p 32767”
nano /etc/default/quota
RPCRQUOTADOPTS=”-p 32769”
sysctl --system
/etc/init.d/nfs-kernel-server restart
Nous pouvons maintenant fixer nos règles iptables:
iptables -A INPUT -s 10.11.12.0/24 -p tcp -m multiport --ports 111,2049,32764:32769 -j ACCEPT
Dans le cas d’une installation Yunohost ,commandes pour établir les règles iptables pour le serveur NFS
yunohost firewall allow TCP 111
yunohost firewall allow TCP 2049
yunohost firewall allow TCP 32764:32769
Configuration du partage
Indiquer au serveur dans le fichier /etc/exports les répertoires qui seront partagés, les machines qui y auront accès et les conditions de ce partage.
nano /etc/exports
# ' exportfs -a' : Met à jour la liste des systèmes de fichiers exportés
#
/media/yanplus/devel 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/yanplus/Musique 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/yanplus/BiblioCalibre 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/yanplus/dplus 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/yanplus/sauvegarde 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/video 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
Relancer le service nfs pour la prise en charge
systemctl restart nfs-kernel-server
NFS Client Archlinux/Manjaro
Installer le paquet nfs-utils
sudo pacman -S nfs-utils
Coté client le service rpcbind est utilisé
systemctl start rpcbind
systemctl status rpcbind
systemctl enable rpcbind
Création des dossiers sur le client
mkdir -p /mnt/devel
Démarrage auto par ajout dans /etc/fstab
192.168.0.45:/media/yanplus/devel /mnt/devel nfs4 noauto,x-systemd.automount 0 0
SSH par clés
Ajout clé publique shuttle.pub depuis poste appelant
scp ~/.ssh/shuttle_ed25519.pub yann@192.168.0.45:/home/yann
Sur le poste distant création en mode utilisateur “yann” du dossier .ssh et des droits
mkdir ~/.ssh
chmod 700 ~/.ssh
Ajout de la clé publique
cat shuttle_ed25519.pub >> ~/.ssh/authorized_keys
#modifier les droits
chmod 600 ~/.ssh/authorized_keys
#Effacer le fichier de la clé
rm shuttle_ed25519.pub.pub
Modification fichier configuration ssh
sudo nano /etc/ssh/sshd_config
Port 55022
PermitRootLogin no
PasswordAuthentication no
#si délai lors d'une connexion ssh sous Linux
UseDNS no
Relancer
sudo systemctl restart ssh
Test depuis un poste sur le réseau
ssh yann@192.168.0.45 -p 55022 -i /home/yannick/.ssh/shuttle_ed25519
Exécution script sur connexion
Exécuter un fichier utilisateur nommé $HOME/.ssh/rc si présent
Pour tous les utilisateurs exécuter un fichier nommé /etc/ssh/sshrc si présent
Installer les utilitaires curl jq figlet
Le batch
nano ~/.ssh/rc
#!/bin/bash
#clear
PROCCOUNT=`ps -Afl | wc -l` # nombre de lignes
PROCCOUNT=`expr $PROCCOUNT - 5` # on ote les non concernées
GROUPZ=`users`
ipinfo=$(curl -s ipinfo.io) # info localisation format json
publicip=$(echo $ipinfo | jq -r '.ip') # extraction des données , installer préalablement "jq"
ville=$(echo $ipinfo | jq -r '.city')
pays=$(echo $ipinfo | jq -r '.country')
cpuname=`cat /proc/cpuinfo |grep 'model name' | cut -d: -f2 | sed -n 1p`
echo "\033[0m\033[1;31m"
figlet "yanspm.com"
echo "\033[0m
\033[1;35m \033[1;37mHostname \033[1;35m= \033[1;32m`hostname`
\033[1;35m \033[1;37mWired Ip \033[1;35m= \033[1;32m`ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1`
\033[1;35m \033[1;37mKernel \033[1;35m= \033[1;32m`uname -r`
\033[1;35m \033[1;37mDebian \033[1;35m= \033[1;32m`cat /etc/debian_version`
\033[1;35m \033[1;37mUptime \033[1;35m= \033[1;32m`uptime | sed 's/.*up ([^,]*), .*/1/' | sed -e 's/^[ \t]*//'`
\033[1;35m \033[1;37mCPU \033[1;35m= \033[1;32m`echo $cpuname`
\033[1;35m \033[1;37mMemory Use \033[1;35m= \033[1;32m`free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'`
\033[1;35m \033[1;37mUsername \033[1;35m= \033[1;32m`whoami`
\033[1;35m \033[1;37mSessions \033[1;35m= \033[1;32m`who | grep $USER | wc -l`
\033[1;35m\033[1;37mPublic Ip V4 \033[1;35m= \033[1;32m`echo $publicip`
\033[1;35m\033[1;37mPublic Ip V6 \033[1;35m= \033[1;32m`ip addr show eth0 | grep -E 'inet6' |grep -E 'global' | awk '{print $2}' | cut -d/ -f1`
\033[0m"
#curl fr.wttr.in/Paris?0
Effacer motd
sudo rm /etc/motd
Déconnexion puis connexion
Màj auto sécurité Debian
Toutes les instructions suivantes sont exécutées après passage en mode su ou sudo
L’automatisation sera pris en charge par l’outil cron-apt. Cron-apt permet de vérifier à intervalle régulier, via le crontab , si des mises à jours sont disponibles et va les installer.
apt install cron-apt
Création du fichier security.sources.list utilisé par cron-apt et qui ne contiendra que le(s) dépôt(s) de sécurité Debian.
grep security /etc/apt/sources.list > /etc/apt/security.sources.list
On édite le fichier de configuration de cron-apt /etc/cron-apt/config
APTCOMMAND=/usr/bin/apt
OPTIONS="-o quiet=1 -o Dir::Etc::SourceList=/etc/apt/security.sources.list"
MAILTO="root"
MAILON="always"
Pour déclencher la mise à jour automatique après téléchargement , supprimer option -d dans le fichier /etc/cron-apt/action.d/3-download
dist-upgrade -y -o APT::Get::Show-Upgraded=true
Test immédiat
cron-apt
Patienter quelques minutes
Par défaut l’exécution est programmée à 4h00 chaque jour, pour spécifier un créneau horaire modifier le fichier /etc/cron.d/cron-apt.
Mémoire cache
Libère la mémoire des données cache et tampon
# sync; echo 3 > /proc/sys/vm/drop_caches
La commande sync permet de s’assurer que toutes les informations en mémoire en attente d’écriture soient bien répercutées sur le disque
Créer une tâche pour vider le cache tous les jours
sudo -s
crontab -e
Ajouter en fin de fichier
0 12 * * * sync; echo 3 > /proc/sys/vm/drop_caches
Yunohost
Installation yunohost
Les DNS sont configurées de base…
Connexion sur “shuttle” en su (par console ou SSH)
Cloner le dépôt du script d’installation de YunoHost
sudo -s
git clone https://github.com/YunoHost/install_script /tmp/install_script
Lancer le script d’installation
cd /tmp/install_script
./install_yunohost
Poursuivre la post-installation :
Domaine par défaut : yanspm.com
Mot de passe administration : xxxxxx
En mode commande
Ajout domaine ouestline.net , devel.ouestline.net et music.ouestline.net
yunohost domain add ouestline.net
yunohost domain add devel.ouestline.net
yunohost domain add musicouestline.net
Certificats letsencrypt pour les domaines yanspm.com et ouestline.net
yunohost domain cert-install
Générer une clé Diffie-Hellman
sudo openssl dhparam -out /etc/ssl/private/dh4096.pem -outform PEM -2 4096
Clé sous /etc/ssl/private ,propriétaire et droits
sudo chown root.ssl-cert /etc/ssl/private/dh4096.pem
sudo chmod 640 /etc/ssl/private/dh4096.pem
Modifier les fichiers de configuration des différents domaines activer Diffie-Hellmann ssl_dhparam /etc/ssl/private/dh4096.pem;
sudo -s
sed -i 's:#ssl_dhparam /etc/ssl/private/dh2048.pem;:ssl_dhparam /etc/ssl/private/dh4096.pem;:g' /etc/nginx/conf.d/yanspm.com.conf
sed -i 's:#ssl_dhparam /etc/ssl/private/dh2048.pem;:ssl_dhparam /etc/ssl/private/dh4096.pem;:g' /etc/nginx/conf.d/ouestline.net.conf
sed -i 's:#ssl_dhparam /etc/ssl/private/dh2048.pem;:ssl_dhparam /etc/ssl/private/dh4096.pem;:g' /etc/nginx/conf.d/devel.ouestline.net.conf
sed -i 's:#ssl_dhparam /etc/ssl/private/dh2048.pem;:ssl_dhparam /etc/ssl/private/dh4096.pem;:g' /etc/nginx/conf.d/music.ouestline.net.conf
exit
Vérifier syntaxe
sudo nginx -t
Recharger nginx
sudo systemctl reload nginx
Activer le port 55022 et désactiver le port 22 sur le parefeu yunohost
sudo yunohost firewall allow TCP 55022
sudo yunohost firewall disallow TCP 22
Yunohost Connexion web admin
Connexion en admin https://yanspm.com
Ajout Utilisateur
Création yanspm
Adresse de messagerie : yanspm@yanspm.com
Domaines
Configuration DNS yanspm.com
# Basic ipv4/ipv6 records
@ 3600 IN A 78.230.171.39
* 3600 IN A 78.230.171.39
@ 3600 IN AAAA 2a01:::b270::1
* 3600 IN AAAA 2a01:::b271::1
# XMPP
_xmpp-client._tcp 3600 IN SRV 0 5 5222 yanspm.com.
_xmpp-server._tcp 3600 IN SRV 0 5 5269 yanspm.com.
muc 3600 IN CNAME @
pubsub 3600 IN CNAME @
vjud 3600 IN CNAME @
# Mail
@ 3600 IN MX 10 yanspm.com.
@ 3600 IN TXT "v=spf1 a mx ip4:78.230.171.39 ip6:2a01:::b270::1 -all"
mail._domainkey 3600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDrSvDcv9COapTGktpTcqIj9XOnUw21PvEPMPQgsKfzEmfyH5PijRD2TLOBzkR9Q0wkn/O0CyEyxQ+wVP1iEDad4q5+sxAutFmZicuwGWQ1qek9blZ4j5UmUAd84N76wd668vX8D0fKjmpqyXPP14+IwZBNGloj5XRMVK5BMNxXjQIDAQAB"
_dmarc 3600 IN TXT "v=DMARC1; p=none"
Configuration DNS ouestline.net
# Basic ipv4/ipv6 records
@ 3600 IN A 78.230.171.39
* 3600 IN A 78.230.171.39
@ 3600 IN AAAA 2a01:::b270::1
* 3600 IN AAAA 2a01:::b270::1
# XMPP
_xmpp-client._tcp 3600 IN SRV 0 5 5222 ouestline.net.
_xmpp-server._tcp 3600 IN SRV 0 5 5269 ouestline.net.
muc 3600 IN CNAME @
pubsub 3600 IN CNAME @
vjud 3600 IN CNAME @
# Mail
@ 3600 IN MX 10 ouestline.net.
@ 3600 IN TXT "v=spf1 a mx ip4:78.230.171.39 ip6:2a01:::b270::1 -all"
mail._domainkey 3600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDr3P7ZWl1NWhflWcU+98wmjz/RA4AXNJryMeUk2azwadVhQuZwpvPtqifS7SuRDluIBZYDv7pPsImgMUoIShlc6nuFaawKQ6AoEZJaOSIL/xRaQmZ2Zfj8daeP8wNkK158NWmRiJE9tgrZzqp8FSp+Ae6bQSv9UUSpw3F0JtXbWQIDAQAB"
_dmarc 3600 IN TXT "v=DMARC1; p=none"
Ces paramètres seront utilisés dans la mise à jour du gestionnaire de domaine (OVH)
Applications
Pour une application web de type sub.modomaine.tld, il faut créer le domaine et lui générer des certificats SSL
Nextcloud
Nextcloud , installation par le web admin
Accéder au dossier personnel des utilisateurs depuis Nextcloud ? Oui (On peut utiliser les dossiers utilisateurs)
QOwnNotesAPI
Connexion ssh sur le serveur
Accès dossier /var/www/nextcloud en mode su
Cloner QOwnNotesAPI
git clone https://github.com/pbek/qownnotesapi.git apps/qownnotesapi -b master
Droits nextcloud
chown nextcloud.nextcloud -R apps/qownnotesapi
Cloner Notes
git clone https://github.com/nextcloud/notes.git apps/notes -b master
Droits nextcloud
chown nextcloud.nextcloud -R apps/notes
Créer le dossier Notes
Activer l’application QOwnNotesAPI et Notes par le web nextcloud (+Applications) , mot de passe pour validation
Clients linux et android
Installer l’application bureau linux QOwnNotes,voir https://www.qownnotes.org/
Installer application android Notes
Développement
Développement
Installer une application personnalisée Multi custom webapp https://github.com/YunoHost-Apps/multi_webapp_ynh
Libellé pour Multi custom webapp : Développement
Choisissez un domaine pour votre Webapp : dev.ouestline.net
Choisissez un chemin pour votre Webapp : / (il ne sera plus possible d’ajouter quoique ce soit à ce domaine)
Choisissez l’utilisateur YunoHost associé : yan spm
Créer une base de données? : Non (ne pas cocher la case)
Est-ce un site public ? : Non (ne pas cocher la case)
Vous ne pourrez pas installer d’autres applications sur dev.ouestline.net. Continuer ? OK
Dossier root web /var/www/webapp_yanspm/devel.ouestline.net/
Supprimer le dossier root
sudo rm -r /var/www/webapp_yanspm/devel.ouestline.net/
Créer un lien avec devel
sudo ln -s /media/yanplus/devel/ouestline /var/www/webapp_yanspm/devel.ouestline.net
Modifier la configuration
sudo nano /etc/nginx/conf.d/devel.ouestline.net.d/webapp_devel.ouestline.net.conf
location / {
alias /var/www/webapp_yanspm/devel.ouestline.net/ ;
if ($scheme = http) {
rewrite ^ https://$server_name$request_uri? permanent;
}
index index.html index.php ;
try_files $uri $uri/ index.php;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_pass unix:/var/run/php5-fpm-webapp_devel.ouestline.net.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
fancyindex on; # Enable fancy indexes.
fancyindex_exact_size off; # Output human-readable file sizes.
# Include SSOWAT user panel.
include conf.d/yunohost_panel.conf.inc;
}
Redémarrer nginx
sudo systemctl restart nginx
Subsonic
Subsonic
Installer une application personnalisée Multi custom webapp https://github.com/YunoHost-Apps/multi_webapp_ynh
Libellé pour Multi custom webapp : Subsonic
Choisissez un domaine pour votre Webapp : music.ouestline.net
Choisissez un chemin pour votre Webapp : / (il ne sera plus possible d’ajouter quoique ce soit à ce domaine)
Choisissez l’utilisateur YunoHost associé : yan spm
Créer une base de données? : Non (ne pas cocher la case)
Est-ce un site public ? : Oui (cocher la case)
Vous ne pourrez pas installer d’autres applications sur music.ouestline.net. Continuer ? OK
Installer jdk
sudo apt-get install openjdk-7-jre
Télécharger le .deb <http://www.subsonic.org/pages/download.jsp>
`wget https://s3-eu-west-1.amazonaws.com/subsonic-public/download/subsonic-6.1.1.deb`
Installer le .deb
`sudo dpkg -i subsonic-6.1.1.deb`
Fichier de configuration **/etc/default/subsonic**
```conf
SUBSONIC_ARGS="--port=8090 --max-memory=200"
SUBSONIC_USER=yann
Redémarrer le service
sudo systemctl restart subsonic
Modifier le fichier de configuration nginx
nano /etc/nginx/conf.d/music.ouestline.net.d/webapp_music.ouestline.net.conf
location / {
proxy_pass http://127.0.0.1:8090;
}
Recharger nginx
sudo systemctl reload nginx
Accès https://music.ouestline./net
NE PAS OUBLIER : admin Autoriser l’accès à ces dossiers de médias Music
Calibre-Web
Calibre Web est une application web fournissant une interface propre pour la navigation, la lecture et le téléchargement de livres électroniques à l’aide d’une base de donnéesCalibre existante.
Installation application **calibre-web** dans le répertoire **/home/yann**
cd /home/yann
git clone https://github.com/janeczku/calibre-web.git
cd calibre-web
# installation des prérequis
pip install --target vendor -r requirements.txt
Pour lancer le serveur calibre-web au démarrage , créer un bash sous /home/yann
nano /home/yann/start_calibre-web.sh
#!/bin/sh
#lancement calibre-web
cd /home/yann/calibre-web/
python cps.py
Propriétaire et droits
sudo chown yann.users /home/yann/start_calibre-web.sh
chmod +x /home/yann/start_calibre-web.sh
Utilisation fichier systemd pour le lancement automatique
sudo nano /etc/systemd/system/calibre-web.service
Contenu du fichier
[Unit]
Description=Service calibre-web
After=network.target
[Service]
Type=simple
User=yann
ExecStart=/bin/sh /home/yann/start_calibre-web.sh
Restart=on-abort
[Install]
WantedBy=multi-user.target
ATTENTION! , User est l’utilisateur connecté
Lancer le service calibre-web :
sudo systemctl start calibre-web
Vérifier:
sudo systemctl status calibre-web
● calibre-web.service - Service calibre-web
Loaded: loaded (/etc/systemd/system/calibre-web.service; disabled)
Active: active (running) since jeu. 2017-11-09 18:14:37 CET; 10s ago
Main PID: 12393 (sh)
CGroup: /system.slice/calibre-web.service
├─12393 /bin/sh /home/yann/start_calibre-web.sh
└─12394 python cps.py
nov. 09 18:14:37 yanspm.com systemd[1]: Started Service calibre-web.
Activation
sudo systemctl enable calibre-web
Yunohost
Calibre-Web
Installer une application personnalisée Multi custom webapp https://github.com/YunoHost-Apps/multi_webapp_ynh
Libellé pour Multi custom webapp : Calibre Web
Choisissez un domaine pour votre Webapp : calibre.ouestline.net
Choisissez un chemin pour votre Webapp : / (il ne sera plus possible d’ajouter quoique ce soit à ce domaine)
Choisissez l’utilisateur YunoHost associé : yan spm
Créer une base de données? : Non (ne pas cocher la case)
Est-ce un site public ? : Non (ne pas cocher la case)
Vous ne pourrez pas installer d’autres applications sur calibre.ouestline.net. Continuer ? OK
Dossier root web /var/www/webapp_yanspm/calibre.ouestline.net/
Modifier la configuration, créer un proxy pour l’application calibre-web
sudo nano /etc/nginx/conf.d/calibre.ouestline.net.d/webapp_calibre.ouestline.net.conf
location / {
proxy_pass http://127.0.0.1:8083;
}
Redémarrer nginx
sudo systemctl restart nginx
Premier lancement ,accès à la configuration https://calibre.ouestline.net/config
Renseigner “Location of Calibre database” : /media/yanplus/BiblioCalibre puis cliquer sur submit
Si le chemin est correct , cliquer sur le bouton login : Username: admin , Password: admin123 et submit
Paramétrage , cliquer sur Admin (pas sur admin avec le a minuscule)
Cliquer sur Add new user
Username : yann
Email address : yann@ouestline.net
Password : xxxxxx
Kindle email:
Language : français
Show books with language : French
Cliquer sur submit
Modifier admin , cliquer sur admin
Email address : admin@ouestline.net
Password : xxxxxx
Kindle email:
Language : français
Show books with language : French
Cliquer sur submit
Onduleur
Matériel
Installation et gestion d’un UPS USB en réseau sous linux
UPS = Uninterruptable Power System
Le périphérique UPS Eaton Protection Station 800 USB à gérer est de type “HID”
Connecter l’onduleur liaison USB sur un port disponible du serveur
#passer en mode su
sudo -s
#dmesg montre que votre UPS est détecté :
dmesg
[...]
[12917.408017] usb 1-2: new low-speed USB device number 3 using uhci_hcd
[12919.500091] usb 1-2: New USB device found, idVendor=0463, idProduct=ffff
[12919.500095] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=4
[12919.500098] usb 1-2: Product: Protection Station
[12919.500100] usb 1-2: Manufacturer: EATON
[12919.500103] usb 1-2: SerialNumber: AN2E49008
[12921.694729] hid-generic 0003:0463:FFFF.000A: hiddev0,hidraw0: USB HID v10.10 Device [EATON Protection Station] on usb-0000:00:1d.0-2/input0
Ok, l’UPS est détecté correctement, mais maintenant il faut encore vérifier son pseudo-fichier dans /dev
ls -l /dev/usb/
total 0
crw------- 1 root root 180, 0 oct. 7 09:30 hiddev0
périphérique en mode caractère /dev/usb/hiddev0 (les données échangées entre l’ups et l’ordinateur sont des codes alphanumériques )
Installation nut
Installer les paquets NUT sous Debian Jessie :
apt install nut
on choisit le mode STANDALONE dans fichier /etc/nut/nut.conf.
MODE=standalone
Il faut ensuite spécifier comment communiquer avec l’UPS, donc choisir le driver et le port , ce qui fait dans le fichier /etc/nut/ups.conf
[eaton]
driver = usbhid-ups
port = auto
desc = "Eaton Protection Station 800"
Configurer le démon réseau au niveau des accès via le fichier /etc/nut/upsd.conf
On écoute en local sur le port 3493
LISTEN 127.0.0.1 3493
LISTEN ::1 3493
MAXCONN 32 #Nombre maximal de connections simultanées
Utilisateurs
Créer les utilisateurs (administrateur et superviseur) fichier /etc/nut/upsd.users
# 1 seul utilisateur "ond" avec tous les droits !
[ond]
password = dfYRtY38
upsmon master
Moniteur de supervision
Le moniteur de supervision va surveiller l’onduleur et lancer différentes actions en fonction des évènements constatés fichier /etc/nut/upsmon.conf
# Notre serveur n'a pas d'alimentation redondante = 1
MINSUPPLIES 1
# Commande d'arrêt du serveur en cas de fin d'autonomie
SHUTDOWNCMD "/sbin/shutdown -h +0"
# Commande lancée quand quelque chose se passe
NOTIFYCMD /sbin/upssched
# Interval entre deux interrogations de upsd
POLLFREQ 5
# Intervalle entre deux interrogations de upsd en mode "batterie"
POLLFREQALERT 5
# Temps d'attente pour la déconnexion des upsmon esclaves
HOSTSYNC 15
# Temps pendant lequel on tolère la non-réponse d'un onduleur, multiple de POLLFREQ
DEADTIME 15
# Fichier d'état
POWERDOWNFLAG /etc/killpower
# Intervalle de 1/2 jour, pour répéter le message de "remplacement de batteries - NOTIFY_REPLBATT"
RBWARNTIME 43200
# Interval de 5 minutes, pour répéter le message de "onduleur injoignable - NOTIFY_NOCOMM"
NOCOMMWARNTIME 300
# Intervalle entre la "notification d'arrêt - NOTIFY_SHUTDOWN" et le lancement de SHUTDOWNCMD
FINALDELAY 5
# On surveille l'onduleur qui est directement relié (master)
MONITOR eaton@localhost 1 ond dfYRtY38 master
# Actions spécifiques autres que par défaut (SYSLOG et WALL) réalisées en fonction de l'état retourné par l'onduleur
NOTIFYFLAG COMMBAD EXEC
NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT EXEC
NOTIFYFLAG REPLBATT SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN EXEC
NOTIFYFLAG COMMOK IGNORE
On remarque que, à part l’arrêt du système sur fin des batteries qui est géré par upsmon, toutes les notifications le sont par upssched.
Distributeur d’évènements
L’utilitaire upssched permet de « temporiser » les actions liées aux évènements générés par upsmon.
C’est surtout intéressant lorsque des évènements furtifs se produisent (microcoupures) fichier /etc/nut/upssched.conf.
# Script lancé par upssched pour gérer les évènements et les timers associés
CMDSCRIPT /etc/nut/upssched-cmd
# Fichier pour noter les états internes de upssched
PIPEFN /var/run/nut/upssched.pipe
# Fichier de lock pour éviter un conflit en cas de notification de deux évènements simultanés
LOCKFN /var/run/nut/upssched.lock
# En cas de perte de communication avec l'onduleur
AT COMMBAD * EXECUTE perte-liaison
# En cas de retour secteur, on stope la minuterie et on notifie
AT ONLINE * CANCEL-TIMER attente-retour-secteur
AT ONLINE * EXECUTE charge-sur-secteur
# En cas de perte de secteur, on se laisse au maximum 20 minutes avant d'agir et on notifie
AT ONBATT * START-TIMER attente-retour-secteur 1200
AT ONBATT * EXECUTE charge-sur-batterie
# En cas de niveau de batteries trop bas
AT LOWBATT * EXECUTE batteries-vides
# En cas de fin de vie des batteries on sera prévenu
AT REPLBATT * EXECUTE batteries-hs
# En cas d'arrêt (fin des 20 minutes ou fin d'autonomie), on notifie.
AT SHUTDOWN * EXECUTE arret-en-cours
Prise en charge des évènements (script)
Fichier /etc/nut/upssched-cmd
#!/usr/bin/perl -w
use Encode;
use utf8;
use strict;
use Switch;
# encodage des données transmises dans l’URL
use URI::Escape;
sub SendEmail
{
my ( $from, $to, $subject, $msg ) = @_;
$from = Encode::encode('MIME-Q', $from);
$to = Encode::encode('MIME-Q', $to);
$subject = Encode::encode('MIME-Q', $subject);
open (SENDMAIL, "| /usr/sbin/sendmail -t") or die("Failed to open pipe to sendmail: $!");
binmode(SENDMAIL, ":utf8");
print SENDMAIL <<"EOF";
Content-Transfer-Encoding: 8bit
Content-type: text/plain; charset=UTF-8
Subject: $subject
From: $from
To: $to
$msg
EOF
close (SENDMAIL);
}
my $orig= 'Onduleur@yanspm.com';
my $dest='yanspm@yanspm.com';
my $sujet="Onduleur - Arrêt en cours";
my $message="Le système est en cours d'arrêt.";
my $comment="";
#
# Début du programme
#
if ($#ARGV == -1) {
print "Saisir argument : "; $comment=<STDIN>; chomp($comment);
}
else {
$comment=$ARGV[0];
}
#
# Analyse argument
#
switch ($comment) {
case "charge-sur-batterie" {
$sujet="Onduleur - Charge sur batteries";
$message="L'onduleur est passé sur batteries ...\nL'arrêt système sera demandé si le secteur ne revient pas." ;
}
case "attente-retour-secteur" {
$sujet="Onduleur - Fin d'attente de retour secteur";
$message="Cela fait trop longtemps que le secteur est absent.\nUn arrêt forcé est en cours !";
# Demande d'arrêt forcé (force shut down)
system "/sbin/upsmon -c fsd";
}
case "charge-sur-secteur" {
$sujet="Onduleur - Charge sur secteur";
$message="L'onduleur est revenu sur secteur.";
}
case "batteries-vide" {
$sujet="Onduleur - Batteries vides";
$message="Les batteries sont vides, l'arrêt est imminent.";
}
case "arret-en-cours" {
$sujet="Onduleur - Arrêt en cours";
$message="Le système est en cours d'arrêt.";
}
case "perte-liaison" {
$sujet="Onduleur - Perte de liaison avec l'onduleur";
$message="La communication avec l'onduleur est interrompue.";
}
case "batteries-hs" {
$sujet="Onduleur - URGENT - batteries HS";
$message="Les batteries sont à remplacer d'urgence.";
}
else {
$sujet="Onduleur - Commande inconnue ...";
$message="Une commande inconnue a été envoyée par l'onduleur.\nLa commande est : $comment";
}
}
# Envoi du message
SendEmail($orig,$dest,$sujet,$message);
Rendre exécutable le script
chmod +x /etc/nut/upssched-cmd
Redémarrer la machine
vérifier si les daemons sont lancés
ps auxf |grep ups
root 1479 0.0 0.0 12748 2232 pts/0 S+ 10:42 0:00 \_ grep ups
nut 1373 0.0 0.0 19140 1668 ? Ss 10:35 0:00 /lib/nut/usbhid-ups -a eaton
nut 1375 0.0 0.0 31864 2112 ? Ss 10:35 0:00 /lib/nut/upsd
root 1377 0.0 0.0 29492 1496 ? Ss 10:35 0:00 /lib/nut/upsmon
nut 1378 0.0 0.0 37668 4892 ? S 10:35 0:00 \_ /lib/nut/upsmon
Onduleur connecté ?
upsc eaton@localhost
[...]
ups.mfr: EATON
ups.model: Protection Station 800
ups.power.nominal: 800
ups.productid: ffff
ups.serial: AN2E49008
ups.status: OL CHRG
ups.timer.shutdown: 0
ups.timer.start: 0
ups.vendorid: 0463
PhpMail
Utilitaire /usr/local/bin/phpmail pour envoi de message
#!/usr/bin/php
<?php
/*
syntaxe:
exemple:
*/
//*** Lecture des arguments ***
foreach ($argv as $arg) {
$e=explode("=",$arg);
if(count($e)==2)
$_GET[$e[0]]=$e[1];
else
$_GET[]=$e[0];
}
//var_dump($_GET);
// Aide
if ($e[0] == "--help" || $e[0] == "-h") {
echo 'syntaxe :'."\n".'phpmail --message="texte du message" --exe="la commande à exécuter (texte)" --subject="objet du message" --from="adresse mail expéditeur" --to="adresse mail destinataire"'."\n";
echo 'Option "--exe" facultative ,commande à exécuter entre 2 "`"'."\n";
exit();
}
//message
$message = '';
// option --exe
if (isset($_GET["--exe"])) {
$message = shell_exec($_GET["--exe"]);
}
// option --message
if (isset($_GET["--message"])) {
if (empty($message)) {
$message = $_GET["--message"];
} else {
$message = $_GET["--message"]."\n".$message;
}
}
// Envoie message uniquement si option "--exe" ou/et "--message"
if (isset($_GET["--exe"]) || isset($_GET["--message"])) {
$headers = 'From: '.$_GET["--from"]."\r\n".'Content-Type: text/plain; charset=utf-8'."\r\n";
mail($_GET["--to"], '=?utf-8?B?'.base64_encode($_GET["--subject"]).'?=', $message, $headers);
}
?>
Sauvegardes
serveur de sauvegarde (shuttle)
Création utilisateur backupuser et jeu de clé ssh
sudo adduser backupuser
#mot de passe à saisir
Cette commande va vous demander plusieurs informations et notamment un mot de passe à noter impérativement.
N’hésitez pas à définir un mot de passe compliqué, d’environ 16 caractères avec des chiffres, des lettres majuscule/minuscule et quelques caractères spéciaux car vous n’aurez à le taper réellement qu’une fois.
On se connecte en backupuser
sudo su backupuser
On va au dossier
cd /home/backupuser
Création dossier .ssh
mkdir /home/backupuser/.ssh/
Générer les clés RSA
ssh-keygen -t rsa
chmod 400 id_rsa* #lecture seule pour utilisateur backupuser
exit # retour sur utilisateur précédent
Supprimer le lien media
sudo rm /home/backupuser/media
Copier la clé publique id_rsa.pub sur l’hôte distant
Sauvegarde des serveurs distants par rsync sur dossier /media/yanplus/sauvegarde/aujourdhui
/home/backupuser/sauvegarde.sh
#!/bin/bash
#
#echo $(date) "Effacement dossier /media/yanplus/sauvegarde/hier/" >> /home/backupuser/sauvegarde.log
#/bin/rm -rf /media/yanplus/sauvegarde/hier/
#echo $(date) "Copie dossier /media/yanplus/sauvegarde/aujourdhui dans /media/yanplus/sauvegarde/hier" >> /home/backupuser/sauvegarde.log
#/bin/cp -al /media/yanplus/sauvegarde/aujourdhui /media/yanplus/sauvegarde/hier
# serveur de sauvegarde
echo $(date) "Sauvegarde locale shuttle" >> /home/backupuser/sauvegarde.log
/usr/bin/rsync -a --delete --exclude-from '/home/backupuser/exclude.txt' / /media/yanplus/sauvegarde/aujourdhui/shuttle &>> /home/backupuser/sauvegarde.log
echo $(date) "Fin sauvegarde locale shuttle" >> /home/backupuser/sauvegarde.log
# hôtes distants
echo $(date) "Sauvegarde hôte distant yanfi.net" >> /home/backupuser/sauvegarde.log
/usr/bin/rsync -aev --delete --rsync-path=/home/backupuser/rsync-wrapper.sh --exclude-from '/home/backupuser/exclude.txt' --rsh="/usr/bin/ssh -p 49022 -i /home/backupuser/.ssh/id_rsa" backupuser@yanfi.net:/ /media/yanplus/sauvegarde/aujourdhui/yanfi &>> /home/backupuser/sauvegarde.log
echo $(date) "Fin sauvegarde hôte distant yanfi.net" >> /home/backupuser/sauvegarde.log
echo $(date) "Sauvegarde hôte distant cinay.pw" >> /home/backupuser/sauvegarde.log
/usr/bin/rsync -aev --delete --rsync-path=/home/backupuser/rsync-wrapper.sh --exclude-from '/home/backupuser/exclude.txt' --rsh="/usr/bin/ssh -p 55027 -i /home/backupuser/.ssh/id_rsa" backupuser@cinay.pw:/ /media/yanplus/sauvegarde/aujourdhui/cinay.pw &>> /home/backupuser/sauvegarde.log
echo $(date) "Fin sauvegarde hôte distant cinay.pw" >> /home/backupuser/sauvegarde.log
/usr/local/bin/phpmail --exe="`echo "grep -A 20 '$(date +"%-d %B %Y")' /home/backupuser/sauvegarde.log"`" --subject="Sauvegarde du $(date +"%d %B %Y")" --from="shuttle" --to="yanspm@yanspm.com"
Le fichier d’exclusion rsync pour la sauvegarde des installations linux debian
/home/backupuser/exclude.txt
dev/*
proc/*
sys/*
tmp/*
run/*
mnt/*
media/*
lost+found
Avant de lancer la première sauvegarde il faut initialiser la session SSH des distants
ssh -p 49022 -i /home/backupuser/.ssh/id_rsa backupuser@yanfi.net # Are you sure you want to continue connecting (yes/no)? yes ,exit
ssh -p 55027 -i /home/backupuser/.ssh/id_rsa backupuser@cinay.pw # Are you sure you want to continue connecting (yes/no)? yes ,exit
Lancement manuel
sudo -s && cd /home/backupuser && ./sauvegarde.sh
Sauvegarde locale
Sauvegarde yunohost /home/backupuser/savyuno.sh
#!/bin/bash
DOMAINE="yanspm.com"
rm /home/backupuser/$DOMAINE.info.json
rm /home/backupuser/$DOMAINE.tar.gz
/usr/bin/yunohost backup create -n $DOMAINE
mv /home/yunohost.backup/archives/$DOMAINE.info.json /home/backupuser/
mv /home/yunohost.backup/archives/$DOMAINE.tar.gz /home/backupuser/
Aperçu du résultat sur un lancement manuel
sudo -s && cd /home/backupuser && ./savyuno
Succès ! Sauvegarde terminée
name: yanspm.com
results:
apps:
multi_webapp: Success
multi_webapp__2: Success
nextcloud: Success
system:
conf_cron: Success
conf_ldap: Success
conf_nginx: Success
conf_ssh: Success
conf_ssowat: Success
conf_xmpp: Success
conf_ynh_certs: Success
conf_ynh_currenthost: Success
conf_ynh_firewall: Success
conf_ynh_mysql: Success
data_home: Success
data_mail: Success
size: 498806502
Sauvegardes programmées
Modifier le “scheduler”
sudo crontab -e
Ajouter en fin de fichier
30 1 * * * /home/backupuser/savyuno.sh
15 3 * * * /home/backupuser/sauvegarde.sh
La sauvegarde locale savyuno.sh démarre à 1h30m
La sauvegarde sauvegarde.sh de shuttle et des distants (yanfi.net et cinay.pw) démarre à 3h15
NFS et NAS
/etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/vg--ssd--one-rootb / ext4 errors=remount-ro 0 1
# /boot was on /dev/sda2 during installation
UUID=6b76631b-a7c1-41a7-8af2-bdfffa099a62 /boot ext2 defaults 0 2
/dev/mapper/vg--ssd--one-home /home ext4 defaults 0 2
/dev/mapper/vg--ssd--one-swap none swap sw 0 0
/dev/mapper/vg--nas--one-yanplus /media/yanplus ext4 defaults 0 2
/dev/mapper/vg--nas--one-video /media/video ext4 defaults 0 2
/dev/mapper/vg--nas--one-serie /media/serie ext4 defaults 0 2
/etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
# ' exportfs -a' : Met à jour la liste des systèmes de fichiers exportés
#
/media/yanplus/devel 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/yanplus/Musique 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/yanplus/BiblioCalibre 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/yanplus/dplus 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/yanplus/sauvegarde 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/video 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
/media/serie 192.168.0.0/24(rw,no_subtree_check,no_root_squash)
IPV6
Depuis Freebox OS 2.0, la configuration IPv6 permet de configurer des “next hops” pour 8 prefixes /64 (Autrement dit, chaque abonné Freebox dispose d’un /61).
Modifier la configuration IPV6 de la freebox
Adresse IPV6 lien local : fe80:::::aa20
Délégation de prefixe
Attention si vous configurez un Next Hop pour le premier subnet, il ne sera plus annoncé par la Freebox sur votre réseau
Prefixe : 2a01:::b270::/64
Next hop :
Prefixe : 2a01:::b271::/64
Next hop : fe80:::::150c
Configurer le réseau IPV6 /etc/network/interfaces ,ajouter
iface eth0 inet6 static
address 2a01:::b271::1
netmask 64
post-up ip -6 route add default via fe80:::::aa20 dev eth0
Point d’accès WIFI
Utilisation dongle USB/Wifi Ralink RT5370 (AP)
Ralink RT2070, RT2770, RT2870, RT3070, RT3071, RT3072, RT3370, RT3572, RT5370, RT5372, RT5572 devices (rt2800usb)
1 Ajoutez la source “non-free” à votre fichier /etc/apt/sources.list, par exemple :
# Debian 8 "Jessie"
deb http://httpredir.debian.org/debian/ jessie main contrib non-free
# Debian 9 "Stretch"
deb http://http.debian.net/debian/ stretch main contrib non-free
2 Mettez à jour la liste des paquets disponibles:
# apt-get update
3 Debian 8: Installer le paquet firmware-ralink:
# apt-get install firmware-ralink
Debian 9: Installer le paquet firmware-misc-nonfree:
# apt-get install firmware-misc-nonfree
4 Insérer le dongle USB/wifi Ralink RT5370
Le module noyau rt2800usb est automatiquement chargé pour les périphériques pris en charge.
5 Configurez une interface WiFi
Installer les paquets wifi
sudo apt install iw wireless-tools
Interface réseau
ip a
3: wlan2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 7c:dd:90:5f:68:7b brd ff:ff:ff:ff:ff:ff
iwconfig
wlan2 IEEE 802.11bgn Mode:Master Tx-Power=20 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
Activation
ip link set wlan2 up
Vérification
iwlist scan # affiche les réseau wifi
Application HotSpot wifi
Application wifi hotspot pour yunohost : https://github.com/labriqueinternet/hotspot_ynh
Interface : wlan2
Wifi
Canal : 6
SSID : YanHotSpot
Sécurité : WPA2/PSK
IPV6
Préfixe délégué : 2a01:::b271::
Pare-feu : on
Résolveur DNS 1 : 2001:913::8
Résolveur DNS 2 : 2001:910:800::12
IPV4
Préfixe NAT (/24) : 10.0.242
Résolveur DNS 1 : 80.67.188.188
Résolveur DNS 2 : 80.67.169.12
Détails de l’initialisation
[INFO] Autodetected internet interface: eth0 (last start: eth0)
[OK] IPv4 NAT set
[OK] IPv6/IPv4 forwarding set
[OK] Hostapd is running
[INFO] hotspot0: IPv6 delegated prefix found
[INFO] hotspot0: IPv6 address computed from the delegated prefix: 2a01:::b271::42
[OK] hotspot0: IPv6 address set
[OK] hotspot0: IPv6 firewalling set
[OK] hotspot0: NDP and DHCPv6 server (dnsmasq) are running
[OK] hotspot0: DHCPv4 server (dnsmasq) is running
[OK] hotspot0: IPv4 NAT address set