Serveur debian 11
VPS vpsg1btm3e
- 1 GB RAM
- 25GB NVMe SSD DISK
- 1TB TRANSFER(tx+rx)
- 1 x vCPU Core
- 1 x IPv4 Address 185.112.146.46
- Debian bullseye
- Connexion serveur
- Utilisateur
- OpenSSH, clé et script
- Utilitaires et historique
- Hostname
- Parefeu
- OVH DNS icebull.xyz
- Dns DoT DoH
- Résolveur (Unbound)
- Frontal DNS (dnsdist)
- Gestion des certificats
- Test résolveur DNS depuis un client (homer)
- Postfix messagerie
- Renouvellement certificats LetsEncrypt
- Ajout liste de blocage (unbound)
- Métamoteur
- Serveur Wireguard
Debian bullseye
Connexion serveur
Connexion ssh
ssh root@185.112.146.46
Mise à jour
apt update && apt -y upgrade
Installer sudo
apt install sudo
Versions noyau et debian
uname -a && cat /etc/debian_version
Linux vpsg1btm3e 5.10.0-19-amd64 #1 SMP Debian 5.10.149-2 (2022-10-21) x86_64 GNU/Linux 11.6
Adressage : ip -a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:b9:70:92:2e brd ff:ff:ff:ff:ff:ff
altname enp0s3
inet 185.112.146.46/24 brd 185.112.146.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::5054:b9ff:fe70:922e/64 scope link
valid_lft forever preferred_lft forever
Modifier ou créer /etc/hostname
: icebull.xyz
Ajouter 185.112.146.46 icebull.xyz
au fichier /etc/hosts
Utilisateur
Créer un utilisateur icevps avec shell par défaut et son mot de passe
useradd --create-home --user-group icevps
passwd icevps
Shell par défaut
usermod -s /bin/bash icevps
Autoriser sudo pour utilisateur
echo "icevps ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
OpenSSH, clé et script
connexion avec clé
sur l'ordinateur de bureau
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) pour une liaison SSH avec le serveur.
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/iceland-vps
Envoyer les clés publiques sur le serveur KVM
ssh-copy-id -i ~/.ssh/iceland-vps.pub icevps@185.112.146.46
sur le serveur KVM
On se connecte
ssh icevps@185.112.146.46
Modifier la configuration serveur SSH
sudo nano /etc/ssh/sshd_config
Modifier
Port = 55046
PermitRootLogin no
PasswordAuthentication no
Relancer le serveur
sudo systemctl restart sshd
Test connexion
ssh -p 55046 -i ~/.ssh/iceland-vps icevps@185.112.146.46
Utilitaires et historique
Installer utilitaires
sudo apt install rsync curl tmux jq figlet git dnsutils tree -y
Motd
sudo rm /etc/motd && sudo nano /etc/motd
_ _ _ _
(_) __ ___ | |__ _ _ | || | __ __ _ _ ___
| |/ _|/ -_)| '_ \| || || || | _ \ \ /| || ||_ /
|_|\__|\___||_.__/ \_,_||_||_|(_)/_\_\ \_, |/__|
|__/
_ ___ ___ _ _ ___ _ _ _ __ _ _ __
/ |( _ )| __| / |/ ||_ ) / || | | / / | | | / /
| |/ _ \|__ \ _ | || | / / _ | ||_ _|/ _ \ _|_ _|/ _ \
|_|\___/|___/(_)|_||_|/___|(_)|_| |_| \___/(_) |_| \___/
_ _ _ _ ___ _ _ ___
__| | ___ | |_ __| | ___ | |_ | \ | \| |/ __|
/ _` |/ _ \| ' \ / _` |/ _ \| _| | |) || .` |\__ \
\__,_|\___/|_||_| \__,_|\___/ \__| |___/ |_|\_||___/
Script ssh_rc_bash
ATTENTION!!! Les scripts sur connexion peuvent poser des problèmes pour des appels externes autres que ssh
sudo apt install wget
wget https://static.xoyaz.xyz/files/ssh_rc_bash
chmod +x ssh_rc_bash # rendre le bash exécutable
./ssh_rc_bash # exécution
Prise en charge historique, modification bashrc et inputrc
POUR tous les utilisateurs ,y compris root et avec touche SHIFT
echo "
# appel alphabétique commandes
shopt -s histappend
PROMPT_COMMAND='history -a'" | tee -a $HOME/.bashrc
echo "
# appel alphabétique commandes
shopt -s histappend
PROMPT_COMMAND='history -a'" | sudo tee -a /root/.bashrc
echo '
# AVEC la touche SHIFT
"\e[1;2A": history-search-backward
"\e[1;2B": history-search-forward
' | sudo tee -a /etc/inputrc
Redémarrer le terminal la prise en compte
Hostname
Domaine icebull.xyz
hostnamectl set-hostname icebull.xyz
Static hostname: icebull.xyz
Icon name: computer-vm
Chassis: vm
Machine ID: 75971165a9bd46a6814eeb1061620d63
Boot ID: d377ca9f9c4c4c6f82badfc196172438
Virtualization: kvm
Operating System: Debian GNU/Linux 11 (bullseye)
Kernel: Linux 5.10.0-19-amd64
Architecture: x86-64
Parefeu
UFW, ou pare - feu simple , est une interface pour gérer les règles de pare-feu dans Arch Linux, Debian ou Ubuntu. UFW est utilisé via la ligne de commande (bien qu’il dispose d’interfaces graphiques disponibles), et vise à rendre la configuration du pare-feu facile (ou simple).
Installer ufw
sudo apt install ufw
Les règles par défaut
sudo ufw default allow outgoing
sudo ufw default deny incoming
Ajout des règles spécifiques
sudo ufw allow 55046/tcp # Port ssh
sudo ufw allow 80/tcp # http
sudo ufw allow 443/tcp # https
sudo ufw allow dns # DNS port 53
sudo ufw allow 853 # DNS over TLS
OVH DNS icebull.xyz
OVH: Domaine icebull.xyz , DNSSEC Actif
$TTL 3600
@ IN SOA dns11.ovh.net. tech.ovh.net. (2023021400 86400 3600 3600000 60)
IN NS dns11.ovh.net.
IN NS ns11.ovh.net.
IN MX 10 icebull.xyz.
IN A 185.112.146.46
* IN A 185.112.146.46
Dns DoT DoH
Le DNS
Les requêtes DNS sont envoyées en texte brut, ce qui signifie que tout le monde peut les lire. Le DNS sur HTTPS et le DNS sur TLS chiffrent les requêtes et les réponses du DNS pour que la navigation des utilisateurs reste sécurisée et privée. Cependant, les deux approches ont leurs avantages et leurs inconvénients.
Le DNS sur HTTPS et le DNS sur TLS
Le DNS sur TLS et le DNS sur HTTPS sont deux normes développées pour le chiffrement du trafic DNS en texte brut afin d'empêcher les parties malveillantes, les annonceurs, les FAI et autres de pouvoir interpréter les données. Pour poursuivre l'analogie, ces normes visent à enfermer les cartes postales envoyées par courrier dans une enveloppe, pour que quiconque puisse envoyer une carte postale sans craindre les indiscrétions d'un tiers.
DoH vs DoT
<Outre DNS sur HTTPS, il existe un autre protocole qui vise également à chiffrer les requêtes DNS. C'est ce qu'on appelle DNS sur TLS (DoT). Pour les personnes vivant dans des pays où la censure d'Internet est sévère, il est plus avantageux d'utiliser DoH.
- Le DoT fonctionne sur le port TCP 853 , qui peut être facilement bloqué par un pare-feu national.
- DoH fonctionne sur le port TCP 443 , qui est le port standard pour les sites Web HTTPS, ce qui rend DoH très difficile à bloquer, car si le port TCP 443 est bloqué, alors presque tous les sites Web HTTPS seront également bloqués.
- DoH permet aux applications Web d'accéder aux informations DNS via les API de navigateur existants, de sorte qu'aucun résolveur de stub n'est nécessaire.
DNS over TLS (DoT) et DNS over HTTPS (DoH) sont deux protocoles standardisés par l’IETF dans les RFC 7858 et RFC 8484 respectivement. Ces deux protocoles ont pour but de sécuriser les requêtes DNS entre un client et le résolveur (encapsulation du protocole DNS dans une session TLS pour DoT ou HTTPS pour DoH.)
Résolveur (Unbound)
Commençons par installer et configurer le résolveur DNS. Il existe plusieurs
logiciels pour faire de la résolution comme BIND 9,
Knot Resolver ou encore
Unbound. Nous avons choisi
d’utiliser Unbound et cette partie documente comment installer et configuer ce
résolveur.
En règle général Unbound est disponible dans les dépôts des distributions, l’installer depuis le gestionnaire de paquet de votre machine.
sudo apt install unbound
Maintenant que Unbound est installé, il ne reste plus qu’à le configurer avant de démarrer le service.
Il s’agit du résolveur DNS, celui ci n’est accessible que depuis la machine locale via le port 53.
Créer le fichier de configuration /etc/unbound/unbound.conf.d/unbound-icebull.conf
avec le contenu suivant :
server:
# ne rien enregistrer dans les journaux hormis les erreurs
verbosity: 0
# n'écouter que sur l'interface locale en IPv4
# unbound nécessite d'être relancé si modifié
interface: 127.0.0.1
port: 53
# refuser tout le monde sauf les connexions locales (pas forcément
# nécessaire vu que le serveur n'écoute que sur la boucle locale en IPv4)
access-control: 0.0.0.0/0 refuse
access-control: 127.0.0.1/32 allow
# par défaut, unbound ne log pas les requêtes ni les réponses
# on peut le rappeler au cas où
log-queries: no
log-replies: no
# imposer la QNAME minimisation (RFC 7816)
# Pour mieux protéger la vie privée
qname-minimisation: yes
# même si le serveur faisant autorité ne le veut pas
# après discussion, il est possible que cette option ne soit
# pas recommandée dans le cadre d'un résolveur ouvert
qname-minimisation-strict: yes
Vérifier la validité du fichier de configuration avec la commande suivante :
sudo unbound-checkconf /etc/unbound/unbound.conf.d/unbound-icebull.conf
unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/unbound-icebull.conf
Toutes les règles disponibles sont détaillées dans le manuel man 5 unbound.conf
ou dans le manuel en ligne.
Démarrer le résolveur.
sudo systemctl start unbound.service
S’assurer que tout fonctionne bien à l’aide de la commande
dig
disponible dans le paquet bind9-dnsutils
ou dnsutils
. Pour cela il
suffit de spécifier l’adresse de notre résolveur, ici 127.0.0.1
ou ::1
et
d’effectuer une requête DNS. Ici on demande à Unbound de récupérer
l’enregistrement AAAA
associé au nom de domaine afnic.fr
.
dig @127.0.0.1 AAAA afnic.fr
Résultat commande
; <<>> DiG 9.16.37-Debian <<>> @127.0.0.1 AAAA afnic.fr
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52335
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;afnic.fr. IN AAAA
;; ANSWER SECTION:
afnic.fr. 599 IN AAAA 2001:67c:2218:302::51:231
;; Query time: 332 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Feb 13 12:48:45 GMT 2023
;; MSG SIZE rcvd: 65
Une réponse est bien renvoyée. Le résolveur fonctionne.Vérifier que tout est opérationnel en IPv4, et en utilisant UDP et TCP.
$ dig +notcp @127.0.0.1 AAAA afnic.fr # connexion UDP en IPv4 au résolveur
$ dig +tcp @127.0.0.1 AAAA afnic.fr # connexion TCP en IPv4 au résolveur
À ce stade, un résolveur Unbound est configuré en local et écoute sur le port
53
. Il peut donc être utilisé pour résoudre toutes les requêtes en provenance
de la machine.
Frontal DNS (dnsdist)
dnsdist est un répartiteur de charge pour serveurs DNS avec la particularité de gérer DoH et DoT. Le but est donc de l’installer sur la même machine qu’Unbound et de le mettre devant : Unbound n’écoutera que localement et dnsdist, lui, sera ouvert au public
- POWERDNS - dnsdist documentation
- Documentation technique de mon résolveur DoH (bortzmeyer)
- Documentation technique du service dns.shaftinc.fr
Prérequis
sudo apt install gnupg git
Cette section s’attarde sur l’installation et la configuration d’un frontal
DoT/DoH qui transmettra les requêtes DNS à un résolveur local écoutant sur le
port 53 de l’interface local 127.0.0.1
(IPv4).
Ici dnsdist
se trouve être une très bonne solution pour remplir ce rôle.
Installation version courante
depuis juin 2023 pour debian bullseye
sudo apt install dnsdist
Installer la dernière version dnsdist
Erreur depuis juin 2023 pour debian bullseye
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://repo.powerdns.com/debian bullseye-dnsdist-16 InRelease: The following signatures were invalid: EXPKEYSIG 1B0C6205FD380FBB PowerDNS Release Signing Key powerdns.support@powerdns.com W: Failed to fetch http://repo.powerdns.com/debian/dists/bullseye-dnsdist-16/InRelease The following signatures were invalid: EXPKEYSIG 1B0C6205FD380FBB PowerDNS Release Signing Key powerdns.support@powerdns.com W: Some index files failed to download. They have been ignored, or old ones used instead.
Si vous désiriez utiliser la dernière version de dnsdist, PowerDNS qui développpe le logiciel propose et maintient ses propres dépôts pour Debian, Raspbian, Ubuntu et CentOS.
Ainsi, voici comment installer la dernière version de dnsdist, actuellement
1.6.0
, tel que défini sur le site de PowerDNS
Exécuter ce qui suit
# récupération du nom de la distribution et de son ID
# ATTENTION: le fichier /etc/os-release peut être différent selon la distribution
export D_NAME=$(. /etc/os-release; echo ${VERSION_CODENAME})
export D_ID=$(. /etc/os-release; echo ${ID})
# ajout du dépôt aux sources
# Debian / Ubuntu
echo "deb [arch=amd64] http://repo.powerdns.com/${D_ID} ${D_NAME}-dnsdist-16 main" | sudo tee /etc/apt/sources.list.d/pdns.list
# gestion de l'étiquette et de la priorité du nouveau dépôt
sudo tee /etc/apt/preferences.d/dnsdist << EOF
Package: dnsdist*
Pin: origin repo.powerdns.com
Pin-Priority: 600
EOF
# ajout de la clé publique de PowerDNS
curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -
# mise à jour des dépôts
sudo apt update
# installation de dnsdist
sudo apt install dnsdist
Configurer dnsdist
Créer le fichier de configuration IPV4 /etc/dnsdist/dnsdist.conf
pour une utilisation avec les certificats qui seront générés par acme dans le dossier /etc/dnsdist
-- le résolveur DoT/DoH est public, on accepte tout le monde en IPv4
setACL({'0.0.0.0/0'})
-- serveur DNS où transférer les requêtes entrantes
newServer({address='127.0.0.1:53', name='Unbound (local)'})
-- configuration de DoT
-- modifier l'IPv4 en conséquence
addTLSLocal('185.112.146.46:853', '/etc/dnsdist/dns-server.crt', '/etc/dnsdist/dns-server.key', {minTLSVersion='tls1.2'})
-- configuration de DoH
-- modifier l'IPv4 en conséquence
addDOHLocal('185.112.146.46:443', '/etc/dnsdist/dns-server.crt', '/etc/dnsdist/dns-server.key', '/', {minTLSVersion='tls1.2'})
-- limitation du trafic à 100 requêtes par seconde
-- plus d'info en <https://dnsdist.org/advanced/qpslimits.html>
addAction(MaxQPSIPRule(100), DropAction())
-- disable security status polling via DNS
setSecurityPollSuffix("")
L’ensemble des options de configuration est détaillé sur le site de dnsdist.
L’option setSecurityPollSuffix("")
a été ajoutée pour contourner l’erreur suivante :
Error while retrieving the security update for version dnsdist-1.6.1: Unable to get a valid Security Status update
Explication : Le paquet Debian pour dnsdist désactive l’interrogation de sécurité en lui attribuant une chaîne vide dans le fichier de configuration par défaut. Nous devons faire de même pour le fichier dnsdist.conf afin que l’interrogation de sécurité soit désactivée et que le journal systemd de dnsdist reste propre.
Vérifier que le fichier de configuration est valide avec la commande :
sudo dnsdist --check-config
# Configuration '/etc/dnsdist/dnsdist.conf' OK!
dnsdist est donc configuré pour écouter sur l’interface publique de la machine sur les ports 443 (DoH) et 853 (DoT). Toutes les requêtes sont ensuite relayées à un serveur écoutant le port 53 sur l’interface locale.
Pour l’instant les fichiers dot-server.crt
, dot-server.key
,
doh-server.crt
et doh-server.key
n’existent pas. Il est nécessaire de les
générer. Cela peut se faire avec openssl
dans le cas de certificats
auto-signés. Il est aussi possible de passer par une autorité de certification,
ceci est le but de la prochaine partie.
Remarque: attention aux droits des fichiers du certificat et de la clé, l’utilisateur ou le groupe
dnsdist
(parfois_dnsdist
, vérifier le contenu du fichier/etc/group
avec la commande
grep dnsdist /etc/group
_dnsdist:x:113:
Avec le protocole de création des certificats Acme
Les droits en écriture à l’utilisateur sur le dossier /etc/dnsdist
sudo chown $USER -R /etc/dnsdist
Gestion des certificats
Afin de pouvoir proposer une connexion sécurisée au résolveur, il est
nécessaire de posséder au moins un certificat par service. On peut générer ses propres certificats auto-signés. Cependant pour
augmenter la confiance dans le service proposé, il est intéressant de s’appuyer
sur un tiers de confiance, l’autorité de
certification.
Nous allons utiliser Let’s Encrypt comme autorité
de certification.
Installation client acme.sh
cd ~
sudo apt install socat -y # prérequis
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install
Fermer le terminal, puis le réouvrir et vérifier
acme.sh -h
Création des certificats
export OVH_AK="xxxxxxxxxxxxxx"
export OVH_AS="yyyyyyyyyyyyyyyyyyyyyyyy"
Génération des certificats dans le dossier /etc/dndist
avec une chaîne préférentielle pour android
acme.sh --dns dns_ovh --server letsencrypt --issue --keylength ec-384 -d 'doh.icebull.xyz' -d 'dot.icebull.xyz' -d 'searx.icebull.xyz' -d 'wg.icebull.xyz' --preferred-chain 'ISRG Root X1' --key-file /etc/dnsdist/dns-server.key --fullchain-file /etc/dnsdist/dns-server.crt
[Mon 13 Feb 2023 01:08:35 PM GMT] Your cert is in: /home/icevps/.acme.sh/doh.icebull.xyz_ecc/doh.icebull.xyz.cer
[Mon 13 Feb 2023 01:08:35 PM GMT] Your cert key is in: /home/icevps/.acme.sh/doh.icebull.xyz_ecc/doh.icebull.xyz.key
[Mon 13 Feb 2023 01:08:35 PM GMT] The intermediate CA cert is in: /home/icevps/.acme.sh/doh.icebull.xyz_ecc/ca.cer
[Mon 13 Feb 2023 01:08:35 PM GMT] And the full chain certs is there: /home/icevps/.acme.sh/doh.icebull.xyz_ecc/fullchain.cer
[Mon 13 Feb 2023 01:08:35 PM GMT] Installing key to: /etc/dnsdist/dns-server.key
[Mon 13 Feb 2023 01:08:35 PM GMT] Installing full chain to: /etc/dnsdist/dns-server.crt
A la première création des certificats
sudo chmod 644 /etc/dnsdist/dns-*
Relancer manuellement le service dnsdist
sudo systemctl restart dnsdist
Status
systemctl status dnsdist
● dnsdist.service - DNS Loadbalancer
Loaded: loaded (/lib/systemd/system/dnsdist.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-02-13 13:09:19 GMT; 10s ago
Docs: man:dnsdist(1)
https://dnsdist.org
Process: 17119 ExecStartPre=/usr/bin/dnsdist --check-config (code=exited, status=0/SUCCESS)
Main PID: 17120 (dnsdist)
Tasks: 21 (limit: 8192)
Memory: 26.2M
CPU: 64ms
CGroup: /system.slice/dnsdist.service
└─17120 /usr/bin/dnsdist --supervised --disable-syslog
Vérification expiration certificat et mise à jour automatique dans le dossier /etc/dndist
+ relance service dnsdist
Remplacer la tâche utilisateur (prompt $
)
crontab -e # edite tous les jobs de l’utilisateur en cours
18 0 * * * "$HOME/.acme.sh"/acme.sh --cron --home "$HOME/.acme.sh" --renew-hook "$HOME/.acme.sh/acme.sh --ecc --install-cert -d 'doh.icebull.xyz' -d 'dot.icebull.xyz' -d 'searx.icebull.xyz' -d 'wg.icebull.xyz' --preferred-chain 'ISRG Root X1' --key-file /etc/dnsdist/dns-server.key --fullchain-file /etc/dnsdist/dns-server.crt --reloadcmd 'sudo systemctl restart dnsdist'" &>/dev/null
Test résolveur DNS depuis un client (homer)
Pour s’assurer que le résolveur fonctionne de manière nominal, on va utiliser Homer.
Homer est un outil développé par l’Afnic, qui permet de tester et débugger un résolveur DoT/DoH en ligne de commande.
Homer est un logiciel libre et le code est disponible sur la forge logicielle Framagit.
L’outil nécessite python3, et certains modules associés :
sudo apt-get install python3 python3-pycurl python3-dnspython python3-openssl python3-netaddr # debian
yay -S python-pycurl python-dnspython python-pyopenssl python-netaddr # archlinux
Il ne reste plus qu’à récupérer Homer
git clone https://framagit.org/bortzmeyer/homer
cd homer
et à le lancer
./remoh.py https://doh.icebull.xyz afnic.fr
id 0
opcode QUERY
rcode NOERROR
flags QR RD RA AD
edns 0
payload 1232
option ECS 0.0.0.0/0 scope/0
;QUESTION
afnic.fr. IN AAAA
;ANSWER
afnic.fr. 600 IN AAAA 2001:67c:2218:302::51:231
;AUTHORITY
;ADDITIONAL
Total elapsed time: 0.46 seconds
./remoh.py --dot dot.icebull.xyz framagit.org
id 11221
opcode QUERY
rcode NOERROR
flags QR RD RA AD
edns 0
payload 1232
option ECS 0.0.0.0/0 scope/0
;QUESTION
framagit.org. IN AAAA
;ANSWER
framagit.org. 3600 IN AAAA 2a01:4f8:231:4c99::75
;AUTHORITY
;ADDITIONAL
Total elapsed time: 0.66 seconds
Homer peut aussi être utilisé pour tester la bonne configuration du résolveur :
$ ./remoh.py --check --dot dot.icebull.xyz framasoft.org
OK
$ ./remoh.py --check https://doh.icebull.xyz chatons.org
OK
Dans le cas où votre résolveur est mal configuré, Homer s’arrête est affiche l’erreur rencontrée. Par exemple pour un certificat non configuré :
$ ./remoh.py --dot 198.51.100.19 framasoft.org
198.51.100.19: Certificate error: "198.51.100.19 is not in the certificate
Could not connect to "198.51.100.19"
On peut demander à Homer de ne pas vérifier le certificat
avec l’option -k | --insecure
:
$ ./remoh.py --insecure --dot 198.51.100.19 framasoft.org
id 35430
opcode QUERY
rcode NOERROR
flags QR RD RA
edns 0
payload 4096
option ECS ::/0 scope/0
;QUESTION
framasoft.org. IN AAAA
;ANSWER
framasoft.org. 3600 IN AAAA 2a01:4f8:141:3421::212
;AUTHORITY
;ADDITIONAL
Total elapsed time: 0.04 seconds (41.83 ms/request)
Postfix messagerie
On va configurer Postfix afin qu’il puisse être utilisé pour envoyer des notifications par e-mail uniquement par les applications locales installées sur le même serveur que Postfix
Installation outils
sudo apt install mailutils
Installation postfix, répondre aux questions :
Internet site → OK
icebull.xyz → OK
Configurer Postfix pour qu’il traite les demandes d’envoi d’e-mails uniquement à partir du serveur sur lequel il s’exécute, c’est-à-dire à partir de localhost.
Postfix doit être configuré pour n’écouter que sur l’ interface loopback , l’interface réseau virtuelle que le serveur utilise pour communiquer en interne.
Modifier les lignes suivantes dans le fichier de configutration /etc/postfix/main.cf
mydestination = $myhostname, localhost.$mydomain, $mydomain
inet_interfaces = loopback-only
Redémarrez Postfix.
sudo systemctl restart postfix
Test envoi message
echo "Test envoi via postfix smtp" | mail -s "serveur debian icebull.xyz" vpn@cinay.eu
Renouvellement certificats LetsEncrypt
Modification : crontab -e
18 0 * * * "$HOME/.acme.sh"/acme.sh --cron --home "$HOME/.acme.sh" --renew-hook "$HOME/.acme.sh/acme.sh --ecc --install-cert -d 'doh.icebull.xyz' -d 'dot.icebull.xyz' -d 'searx.icebull.xyz' --preferred-chain 'ISRG Root X1' --key-file /etc/dnsdist/dns-server.key --fullchain-file /etc/dnsdist/dns-server.crt --reloadcmd 'sudo systemctl restart dnsdist'"
Configurer la notification par email de Let’s Encrypt lorsqu’un certificat est ignoré, renouvelé ou erroné
On utilise la méthode SMTP pour obtenir une notification par email
export SMTP_FROM="icevps@icebull.xyz"
export SMTP_TO="vpn@cinay.eu"
export SMTP_HOST="127.0.0.1" # même serveur sans authentification
export SMTP_SECURE="none"
export SMTP_BIN="/usr/bin/python3"
export SMTP_TIMEOUT="30"
Enfin, exécutez la commande suivante pour activer la notification smtp pour votre Let’s Encrypt lorsqu’un certificat est ignoré, renouvelé ou erroné.
acme.sh --set-notify --notify-hook smtp
Vous obtiendrez des informations d’erreur ou de succès à l’écran comme suit :
[Mon 03 Apr 2023 11:35:55 AM GMT] Set notify hook to: smtp
[Mon 03 Apr 2023 11:35:55 AM GMT] Sending via: smtp
[Mon 03 Apr 2023 11:35:56 AM GMT] smtp Success
Et voici l’email de test :
IL faut modifier le cron (crontab -e
) pour y ajouter la notification --set-notify --notify-hook smtp
18 0 * * * "$HOME/.acme.sh"/acme.sh --cron --home "$HOME/.acme.sh" --renew-hook "$HOME/.acme.sh/acme.sh --ecc --install-cert -d 'doh.icebull.xyz' -d 'dot.icebull.xyz' -d 'searx.icebull.xyz' --preferred-chain 'ISRG Root X1' --key-file /etc/dnsdist/dns-server.key --fullchain-file /etc/dnsdist/dns-server.crt --set-notify --notify-hook smtp --reloadcmd 'sudo systemctl restart dnsdist'" &>/dev/null
Maintenant que le hook SMTP est configuré, vous recevrez une notification par email en cas de succès ou d’échec ou si le certificat est ignoré en masse. Voici ce que cela donne lorsque je renouvelle mon certificat TLS avec un job cron :
PROBLEME
Lors du renouvellement "--reloadcmd 'sudo systemctl restart dnsdist'" n'est pas exécuté
La tâche cron
18 0 * * * "$HOME/.acme.sh"/acme.sh --cron --home "$HOME/.acme.sh" --renew-hook "$HOME/.acme.sh/acme.sh --ecc --install-cert -d 'doh.icebull.xyz' -d 'dot.icebull.xyz' -d 'searx.icebull.xyz' -d 'wg.icebull.xyz' --preferred-chain 'ISRG Root X1' --key-file /etc/dnsdist/dns-server.key --fullchain-file /etc/dnsdist/dns-server.crt --set-notify --notify-hook smtp --reloadcmd 'sudo systemctl restart dnsdist'" &>/dev/null
Le script certificat_expire.sh
qui exécute toutes les commandes , y compris celles du --reloadcmd
, lors du renouvellement
#!/usr/bin/sh
# Domaine
_domain="icebull.xyz"
# Test expiration certificats
PEM="/etc/dnsdist/dns-server.crt"
# 7 jours en secondes
DAYS="604800"
# OpenSSL
_openssl="/usr/bin/openssl"
# Date expiration dans 7 jours ?
$_openssl x509 -enddate -noout -in "$PEM" -checkend "$DAYS" | grep -q 'Certificate will expire'
if [ $? -eq 0 -o ! -z "$1" ]
then
# certificat expire dans 7 jours , on renouvelle
echo "Force renouvellement des certificats Lets Encrypt"
"$HOME/.acme.sh"/acme.sh --cron --home "$HOME/.acme.sh" --renew-hook "$HOME/.acme.sh/acme.sh --ecc --install-cert -d 'doh.icebull.xyz' -d 'dot.icebull.xyz' -d 'searx.icebull.xyz' -d 'wg.icebull.xyz' --preferred-chain 'ISRG Root X1' --key-file /etc/dnsdist/dns-server.key --fullchain-file /etc/dnsdist/dns-server.crt --set-notify --notify-hook smtp"
# Les autres commandes à exécuter
echo "Recharge service nginx"
sudo systemctl reload nginx
else
echo "Certificat Valide"
$_openssl x509 -enddate -noout -in "$PEM"
fi
Rendre le script exécutable
chmod +x $HOME/certificat_expire.sh
Modifier la tâche cron
crontab -e
18 0 * * * "$HOME/certificat_expire.sh" &>/dev/null
Ajout liste de blocage (unbound)
Références
Que bloque cette liste ?
- Publicités web (smartadserver.com, doubleclick.net, googleadservices.com, googlesyndication.com, tradedoubler.com, adbrite.com, yimg.com(YahooAds)…), y compris les domaines spécifiques à certains sites (ad.paypal.com, ad.foxnetworks.com, ads.sun.com…), ainsi que la publicité et trackers first-party.
- Malvertising (réseaux publicitaires connus pour distribuer des vers, chevaux de Troie…) (adshufffle.com, conduit.com…)
- Publicité dans les applications mobiles (admob.com, inmobi.com, mopub.com, adinfuse.com…)
- Analytics/statistiques/marketting/tendances web (google-analytics.com, scorecardresearch.com, quantserve.com…)
- Analytics/statistiques d’applications mobiles (suivi des applications, statistiques utilisateur, rapports de plantage…) (crashlytics.com, applovin.com, flurry.com…)
- Analytics/tracking des fabricants de téléphone (nmetrics.samsung.com, sdkconfig.ad.xiaomi.com, tracking.intl.miui.com…)
- Services de tracking (canvas fingerprinting, evercookies…).
- Trackers first-party.
- Badges et boutons sociaux (addthis.com, badges.instagram.com, badge.stumbleupon.com…)
- Compteurs de sites web (sitemeter.com, free-counter.co.uk, webcounter.com, statcounter.com…)
- Sites frauduleux ou distribuant des malwares (goggle.com, googfle.com, antivirus-scanner.com, adblock.fr, audacity.fr, myfuncards.com…)
- Sites qui vous enferment dans une boucle de popups.
- Sites de téléchargement non fiables (softonic.com…)
- Sites liés à des campagnes de spam (buy-viagra.go.to, cheap-valium.polybuild.ru, forex-market.hut1.ru, norton-antivirus-trial.searchservice.info…)
- Sites conçus pour choquer (goatse, 2girls1cup…)
- Domaines liés au reporting/tracking Windows 10 (reports.wes.df.telemetry.microsoft.com, feedback.microsoft-hohm.com, telemetry.appex.bing.net, statsfe2.ws.microsoft.com…)
Unbound prise en charge liste
On ajoute la prise en charge de cette liste de domaines à bloquer dans notre fichier de configuration d’Unbound
sudo nano /etc/unbound/unbound.conf.d/unbound-icebull.conf
Ajouter ce qui suit en fin de fichier
# Ads blocking
include: "/etc/unbound/unbound.conf.d/adslist"
Générer liste de blocage
Bash pour récupérer la liste puis la transformer au format unbound
sudo -s
tmpListe=$(mktemp)
wget -O- https://sebsauvage.net/hosts/hosts | grep '^0\.0\.0\.0' | grep -v '^0\.0\.0\.0 0\.0\.0\.0' | awk '{print "local-zone: \""$2"\" static"}' > $tmpListe
sort -bdfu $tmpListe > /etc/unbound/unbound.conf.d/adslist
rm $tmpListe
On redémarre le service:
sudo systemctl restart unbound
Test sous homer depuis un poste client
./remoh.py https://doh.icebull.xyz doubleclick.net
id 0
opcode QUERY
rcode NXDOMAIN
flags QR AA RD RA
edns 0
payload 1232
;QUESTION
doubleclick.net. IN AAAA
;ANSWER
;AUTHORITY
;ADDITIONAL
Total elapsed time: 0.31 seconds
Dans la documentation d’Unbound, on trouve notamment types suivants :
static : Si une donnée local-data est trouvée, celle-ci est servie. Sinon, la requête se voit répondre NODATA ou NXDOMAIN.
Créer un bash pour la mise à jour de la liste
sudo nano /etc/unbound/unbound-adslist.sh
#!/bin/sh
# Fichier log temporaire
tmplogFile=$(/usr/bin/mktemp)
echo "$(date +'%b %d %X %z') INFO: Création de la nouvelle liste de blocage." >> $tmplogFile
# Mise à jour liste blocage pub et tracker
tmpListe=$(/usr/bin/mktemp)
/usr/bin/wget -O- https://sebsauvage.net/hosts/hosts | grep '^0\.0\.0\.0' | grep -v '^0\.0\.0\.0 0\.0\.0\.0' | awk '{print "local-zone: \""$2"\" static"}' > $tmpListe
# création liste avec doublons supprimés
/usr/bin/sort -bdfu $tmpListe > /etc/unbound/unbound.conf.d/adslist
/usr/bin/rm $tmpListe
echo "$(date +'%b %d %X %z') FIN création /etc/unbound/unbound.conf.d/adslist" >> $tmplogFile
# relance unbound
systemctl restart unbound
echo "$(date +'%b %d %X %z') INFO: Unbound redémarrer." >> $tmplogFile
# Envoi message
# cat $tmplogFile | mail -s "Liste blocage DNS icebull.xyz" vpn@cinay.eu
# Ajout log systemd
echo "$(date +'%b %d %X %z') unbound : fin mise à jour liste de blocage" | systemd-cat -t adslist -p info
rm $tmplogFile
Les droits
sudo chmod +x /etc/unbound/unbound-adslist.sh
Exécution manuelle en mode su
sudo -s
/usr/bin/sh /etc/unbound/unbound-adslist.sh
Vérifier si pas de doublon dans le journal unbound
journalctl -u unbound
Feb 14 13:30:43 icebull.xyz systemd[1]: Starting Unbound DNS server...
Feb 14 13:30:43 icebull.xyz systemd[1]: Started Unbound DNS server.
Mise à jour tous les lundi à 2h30 du matin de la liste
sudo crontab -e
# Mise à jour tous les lundi à 2h30 du matin de la liste
30 2 * * 1 /usr/bin/sh /etc/unbound/unbound-adslist.sh
Métamoteur
SearXNG
SearXNG est un métamoteur qui recherche ses informations à travers plusieurs moteurs de recherche généralistes
Suivre en totalité la procédure d’installation : SearXNG (métamoteur de recherche libre)
searx.icebull.xyz
Installer un proxy nginx
sudo apt install nginx-light
Supprimer le vhost par défaut
sudo rm /etc/nginx/sites-enabled/default
Le proxy pour le métamoteur searxng
sudo nano /etc/nginx/sites-enabled/searxng
server {
listen 4443 ssl http2;
server_name searx.icebull.xyz;
ssl_certificate /etc/dnsdist/dns-server.crt;
ssl_certificate_key /etc/dnsdist/dns-server.key;
location / {
include uwsgi_params;
uwsgi_pass unix:////usr/local/searxng/run/socket;
}
}
Ouvrir le port 4443 dans le parefeu
sudo ufw allow 4443/tcp # searx.icebull.xyz
Accès au moteur de recherche : https://searx.icebull.xyz:4443/
Lien paramètrage métamoteur dans un navigateur : https://searx.icebull.xyz:4443/search?q=%s
Instructions pour désactiver
On arrête et désactive l’application uwsgi
sudo systemctl stop uwsgi.service
sudo systemctl disable uwsgi.service
On arrête et désactive nginx
sudo systemctl stop nginx
sudo systemctl disable nginx
Efface la règle parefeu “4443/tcp”
sudo ufw status numbered # effacer règles 12 et 6
sudo ufw delete 12 # y
sudo ufw delete 6 # y
Serveur Wireguard
WireGuard est un serveur VPN à code source ouvert, gratuit, moderne et rapide, doté d’une cryptographie de pointe (ChaCha20,Curve25519,BLAKE2s,SipHash24,HKDF). Il est plus rapide et plus simple que l’IPSec et l’OpenVPN. Wireguard permet une connexion VPN entre un client et un serveur cela à travers un tunnel sécurisé.
WireGuard : installer et configurer un serveur VPN Linux et client (Windows, Android, Ubuntu)
Toutes les commandes qui suivent sont exécutées par “root”
forwarding
Autoriser le serveur Wireguard à relayer les paquets venant de ces clients vers l’internet et de traiter les paquets retours (modifier /etc/sysctl.conf)
sed -i 's/^#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
# Pas IPV6
#sed -i 's/^#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/' /etc/sysctl.conf
sysctl -p # prise en compte immédiate
Résultat
net.ipv4.ip_forward = 1
# net.ipv6.conf.all.forwarding = 1
Installer les paquets wireguard
Lancer la commande
apt-get install wireguard wireguard-tools net-tools linux-headers-`uname -r`
Clés
WireGuard repose sur une authentification par clé publique/privée (cryptographie asymétrique), vous devez donc créer ces clés avec les sous-commandes wg genkey et wg pubkey La création de la clé privée se fait avec wg genkey et la clé publique est générée en la canalisant dans wg pubkey
On va générer les clés
cd /etc/wireguard/
umask 077; wg genkey | tee wg_ice.key | wg pubkey > wg_ice.pub # Clés publique et privée du serveur wireguard
Configuration wg0.conf
Récupérer le nom de la carte réseau ip a
, dans notre cas ens3
Choisir une plage IPV4 privée, Random IPV4 Private Address Generator, qui sera utilisée par le serveur : 10.19.55.0/8
Le serveur aura l’adresse IP suivante: 10.19.55.1
Choisir un port, qui sera exposé publiquement, pour que le serveur écoute.Le port de documentation standard est généralement 51820.
Créer le fichier de configuration du serveur Wireguard /etc/wireguard/wg0.conf
[Interface]
PrivateKey = Clé privée serveur wireguard (wg_ice.key)
Address = 10.19.55.1/24
ListenPort = 51820
SaveConfig = true
PostUp = ufw route allow in on wg0 out on ens3
PostUp = iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on ens3
PreDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
Modification des droits (lecture uniquement par “root”)
chmod 600 /etc/wireguard/wg0.conf
Le fichier json /etc/wireguard/server.json
si on utilise wg-web
{
"address": [
"10.19.55.1/24"
],
"listenPort": 51820,
"mtu": 0,
"privateKey": "Clé privée serveur (wg_ice.key) ",
"publicKey": "Clé publique serveur (wg_ice.pub) ",
"endpoint": "185.112.146.46:51820",
"persistentKeepalive": 16,
"dns": [
"10.19.55.1"
],
"preUp": "",
"postUp": "ufw route allow in on wg0 out on ens3;iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE",
"preDown": "ufw route delete allow in on wg0 out on ens3;iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE",
"postDown": "",
"created": "2023-12-21T09:59:16.93733727Z",
"updated": "2023-12-21T09:59:16.93733727Z"
}
Actualiser le DNS unbound
Il faut tenit compte des adresses privées du vpn wireguard
Modifier le fichier de configuration /etc/unbound/unbound.conf.d/unbound-icebull.conf
Ajouter les lignes suivantes
interface: 10.19.55.1
access-control: 10.19.55.0/24 allow
Relancer DNS unbound
sudo systemctl restart unbound
Pour un fonctionnement client wireguard, il faut modifier le dns unbound
Et relancer le service sudo systemctl restart unbound
Parefeu UFW
Ouvir le port UDP 51820 sur le parefeu
ufw allow 51820/udp # wireguard
Effacer les règles IPV6 du parefeu
sudo ufw status numbered # effacer règles 14 à 8
sudo ufw delete 14 # y
sudo ufw delete 6 # y
Les régles
Status: active
To Action From
-- ------ ----
55046/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
DNS ALLOW Anywhere
853 ALLOW Anywhere
51820/udp ALLOW Anywhere
4443/tcp ALLOW Anywhere
Démarrer service wg0
Une fois le fichier de configuration du serveur Wireguard en place, on peut démarrer le service.
systemctl enable wg-quick@wg0 --now
Vérifier
systemctl status wg-quick@wg0
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2023-10-24 15:56:28 GMT; 3s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 70945 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 70945 (code=exited, status=0/SUCCESS)
CPU: 39ms
Oct 24 15:56:28 icebull.xyz wg-quick[70945]: [#] wg setconf wg0 /dev/fd/63
Oct 24 15:56:28 icebull.xyz wg-quick[70945]: [#] ip -4 address add 10.19.55.1/32 dev wg0
Oct 24 15:56:28 icebull.xyz wg-quick[70945]: [#] ip -6 address add fd83:d8a9:3fd8:2e9b::/64 dev wg0
Oct 24 15:56:28 icebull.xyz wg-quick[70945]: [#] ip link set mtu 1420 up dev wg0
Oct 24 15:56:28 icebull.xyz wg-quick[70973]: [#] resolvconf -a tun.wg0 -m 0 -x
Oct 24 15:56:28 icebull.xyz wg-quick[70945]: [#] ip -4 route add 10.19.55.4/32 dev wg0
Oct 24 15:56:28 icebull.xyz wg-quick[70945]: [#] ip -4 route add 10.19.55.3/32 dev wg0
Oct 24 15:56:28 icebull.xyz wg-quick[70945]: [#] ip -4 route add 10.19.55.2/32 dev wg0
Oct 24 15:56:28 icebull.xyz wg-quick[70945]: [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ens3 -j >
Oct 24 15:56:28 icebull.xyz systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
Client Wireguard
La page téléchargement et installation des clients wireguard
Pour la gestion wireguard voir le git wg-webui-fr
Accès gestion wireguard
Pour un accès via tunnel SSH
ssh -L 9500:localhost:8100 icevps@185.112.146.46 -p 55046 -i /home/yann/.ssh/iceland-vps
Mise en place d’un accès web avec authentification
L’outil pour créer les mots de passe
sudo apt install apache2-utils
Générer le mot de passe en mode su
htpasswd -c /etc/nginx/conf.d/.htpasswd wgadmin
Si l’on souhaite ajouter un autre utilisateur il faut enlever l’option -c
Le fichier de configuration nginx /etc/nginx/sites-enabled/wireguard
server {
listen 5443 ssl http2;
server_name wg.icebull.xyz;
ssl_certificate /etc/dnsdist/dns-server.crt;
ssl_certificate_key /etc/dnsdist/dns-server.key;
location / {
auth_basic "Zone restreinte!";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
proxy_pass http://127.0.0.1:8100;
}
}
Ouvir le port TCP 5443 sur le parefeu
ufw allow 5443/tcp # web wireguard
Ouvrir le lien https://wg.icebull.xyz:5443 et saisir log/mp