Migration de l'environnement FreeBSD de Vultr vers ConoHa en état d'ébriété
Bonjour, je suis incompétent.
Je suis presque mort, mais je suis en train de migrer de Vultr vers ConoHa, donc voici une note.
-> Je l'écris aujourd'hui, presque le lendemain, car je me suis endormi ivre à la maison.
Vultr FreeBSD
$ pkg info | awk '{print $1}' | sed "s/^/pkg install -y /g"
pkg install -y base91-0.6.0_1
pkg install -y brotli-1.1.0,1
pkg install -y cgit-1.2.3_1
pkg install -y curl-8.12.1
pkg install -y dnsmasq-2.90_4,1
pkg install -y doas-6.3p12
pkg install -y expat-2.7.0
pkg install -y fcgi-devkit-2.4.0_6
pkg install -y fcgiwrap-1.1.0_12
pkg install -y gettext-runtime-0.23
pkg install -y git-2.49.0
pkg install -y gmp-6.3.0
pkg install -y go-1.21_5,2
pkg install -y go121-1.21.13_1
pkg install -y indexinfo-0.3.1
pkg install -y libffi-3.4.6
pkg install -y libidn2-2.3.7
pkg install -y liblz4-1.10.0,1
pkg install -y libnghttp2-1.65.0
pkg install -y libpsl-0.21.5_2
pkg install -y libssh2-1.11.1,3
pkg install -y libunistring-1.2
pkg install -y mpdecimal-4.0.0
pkg install -y nettle-3.10.1
pkg install -y nginx-1.26.3_2,3
pkg install -y p5-Authen-SASL-2.17_1
pkg install -y p5-CGI-4.67
pkg install -y p5-Clone-0.47
pkg install -y p5-Digest-HMAC-1.05
pkg install -y p5-Encode-Locale-1.05
pkg install -y p5-Error-0.17030
pkg install -y p5-HTML-Parser-3.83
pkg install -y p5-HTML-Tagset-3.24
pkg install -y p5-HTTP-Date-6.06
pkg install -y p5-HTTP-Message-7.00
pkg install -y p5-IO-HTML-1.004
pkg install -y p5-IO-Socket-IP-0.43
pkg install -y p5-IO-Socket-SSL-2.089
pkg install -y p5-LWP-MediaTypes-6.04
pkg install -y p5-Mozilla-CA-20250202
pkg install -y p5-Net-SSLeay-1.94
pkg install -y p5-TimeDate-2.33,1
pkg install -y p5-URI-5.31
pkg install -y pcre2-10.45
pkg install -y perl5-5.36.3_2
pkg install -y python311-3.11.11
pkg install -y readline-8.2.13_2
pkg install -y zstd-1.5.7
ConoHa FreeBSD
./pkg-install.sh | tee pkg-install.log
Vultr FreeBSD
$ pkg info | awk '{print $1}' | sed "s/^/pkg install -y /g"
pkg install -y base91-0.6.0_1
pkg install -y brotli-1.1.0,1
pkg install -y cgit-1.2.3_1
pkg install -y curl-8.12.1
pkg install -y dnsmasq-2.90_4,1
pkg install -y doas-6.3p12
pkg install -y expat-2.7.0
pkg install -y fcgi-devkit-2.4.0_6
pkg install -y fcgiwrap-1.1.0_12
pkg install -y gettext-runtime-0.23
pkg install -y git-2.49.0
pkg install -y gmp-6.3.0
pkg install -y go-1.21_5,2
pkg install -y go121-1.21.13_1
pkg install -y indexinfo-0.3.1
pkg install -y libffi-3.4.6
pkg install -y libidn2-2.3.7
pkg install -y liblz4-1.10.0,1
pkg install -y libnghttp2-1.65.0
pkg install -y libpsl-0.21.5_2
pkg install -y libssh2-1.11.1,3
pkg install -y libunistring-1.2
pkg install -y mpdecimal-4.0.0
pkg install -y nettle-3.10.1
pkg install -y nginx-1.26.3_2,3
pkg install -y p5-Authen-SASL-2.17_1
pkg install -y p5-CGI-4.67
pkg install -y p5-Clone-0.47
pkg install -y p5-Digest-HMAC-1.05
pkg install -y p5-Encode-Locale-1.05
pkg install -y p5-Error-0.17030
pkg install -y p5-HTML-Parser-3.83
pkg install -y p5-HTML-Tagset-3.24
pkg install -y p5-HTTP-Date-6.06
pkg install -y p5-HTTP-Message-7.00
pkg install -y p5-IO-HTML-1.004
pkg install -y p5-IO-Socket-IP-0.43
pkg install -y p5-IO-Socket-SSL-2.089
pkg install -y p5-LWP-MediaTypes-6.04
pkg install -y p5-Mozilla-CA-20250202
pkg install -y p5-Net-SSLeay-1.94
pkg install -y p5-TimeDate-2.33,1
pkg install -y p5-URI-5.31
pkg install -y pcre2-10.45
pkg install -y perl5-5.36.3_2
pkg install -y python311-3.11.11
pkg install -y readline-8.2.13_2
pkg install -y zstd-1.5.7
ConoHa FreeBSD
Installez ce qui a été généré ci-dessus.
Je le redirige avec tee pour pouvoir vérifier le contenu plus tard.
./pkg-install.sh | tee pkg-install.log
pf
J'avais déjà configuré pf, donc
root@localhost:~ # pfctl -nf /etc/pf.conf
root@localhost:~ # pfctl -f /etc/pf.conf
pfctl: /dev/pf: No such file or directory
Oh, il semble qu'il ne soit pas activé par défaut.
root@localhost:~ # kldload pf
root@localhost:~ # pfctl -f /etc/pf.conf
root@localhost:~ #
Comme il n'est pas activé même après un redémarrage, je vais le rendre explicite pour qu'il soit chargé au démarrage.
echo 'pf_load="YES"' >> /boot/loader.conf
echo 'pflog_load="YES"' >> /boot/loader.conf
WireGuad
En utilisant la sortie de Vultr telle quelle, je vais créer le même fichier conf.
vim /usr/local/etc/wireguad/wg0.conf
chmod 600 /usr/local/etc/wireguard/wg0.conf
chmod 700 /usr/local/etc/wireguard
wg-quick up wg0
En activant 51820/UDP dans le groupe de sécurité de ConoHa, la vérification de la connectivité côté client était OK.
Pour un démarrage automatique, ajoutez ce qui suit à /etc/rc.conf:
wireguard_enable="YES"
wireguard_interfaces="wg0"
Et je m'assure que openai.com n'est pas routé.
Activer ChatGPT même dans un environnement VPN - SOULMINIGRIG
dnsmasq
Vérification de la configuration côté Vultr
# cd /usr/local/etc
# grep -v '^#' dnsmasq.conf | grep -v '^$'
no-resolv
server=1.1.1.1
interface=wg0
listen-address=10.0.0.1
log-queries
conf-dir=/usr/local/etc/dnsmasq.d
J'applique cette configuration côté ConoHa et je récupère le fichier adblock.conf suivant.
GitHub - haturatu/dnsmasq-blockdns
# curl -o adblock.conf https://raw.githubusercontent.com/haturatu/dnsmasq-blockdns/refs/heads/main/adblock.conf
-sh: curl: not found
root@localhost:/usr/local/etc/dnsmasq.d # pkg install curl
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
curl: 8.14.1
Number of packages to be installed: 1
The process will require 5 MiB more space.
2 MiB to be downloaded.
Proceed with this action? [y/N]: y
Je n'avais même pas installé curl ^^;
# service dnsmasq restart
Performing sanity check on dnsmasq configuration.
dnsmasq: syntax check OK.
Performing sanity check on dnsmasq configuration.
dnsmasq: syntax check OK.
Stopping dnsmasq.
Starting dnsmasq.
Avec cela, en configurant le serveur DNS du côté client de WireGuard pour qu'il interroge 10.1.0.1, c'est terminé.
Nginx
Dans les règles de sécurité de ConoHa, j'autorise publiquement 80/tcp et 443/tcp.
Ainsi, Nginx, installé via pkg, est déjà configuré automatiquement avec nginx_enable="YES" dans /etc/rc.conf, ce qui est bon.
Je reporterai la configuration complète après avoir effectué les réglages de base. J'ai seulement vérifié que la page par défaut de Nginx s'affiche sur le port 80.
Postfix
C'est un travail difficile. Donc, j'ai pensé à passer la sortie de cat main.cf | grep -v '^#' | grep -v '^$' directement à ChatGPT pour qu'il génère les commandes scp pour copier tous les fichiers nécessaires... mais quand j'ai essayé ssh, je n'ai pas pu l'atteindre.
En fait, j'avais déjà remarqué cela en utilisant WireGuard sur Vultr : il semble que ConoHa bloque certaines adresses IP étrangères au niveau supérieur, et il est impossible d'atteindre ces adresses IP globales même depuis un serveur hébergé sur ConoHa. Même en faisant tail -f sur le auth.log de Vultr, aucun journal n'apparaît.
J'ai pensé que je pourrais y arriver en créant un tunnel WireGuard, mais c'est fastidieux de reconfigurer avec les mêmes paramètres que Vultr....
Par conséquent, je vais copier via le chemin ancien serveur → ma machine → nouveau serveur.
$ cat scp-postfix.sh
#!/bin/bash
scp darkstar@vultr-freebsd:/usr/local/etc/postfix/main.cf main.cf.old
scp darkstar@vultr-freebsd:/usr/local/etc/postfix/recipient_access recipient_access.old
scp darkstar@vultr-freebsd:/usr/local/etc/postfix/client_access client_access.old
scp darkstar@vultr-freebsd:/usr/local/etc/postfix/sender_access sender_access.old
scp darkstar@vultr-freebsd:/etc/mail/aliases aliases.old
sed 's/old-ipv4/new-ipv4/g' main.cf.old > main.cf.new
scp main.cf.new root@conoha-freebsd:/usr/local/etc/postfix/main.cf
scp recipient_access.old root@conoha-freebsd:/usr/local/etc/postfix/recipient_access
scp client_access.old root@conoha-freebsd:/usr/local/etc/postfix/client_access
scp sender_access.old root@conoha-freebsd:/usr/local/etc/postfix/sender_access
scp aliases.old root@conoha-freebsd:/etc/mail/aliases
Pour les certificats, je les archive d'abord avec tar, je les place dans le répertoire de l'utilisateur SSH, puis je les transfère avec scp.
Côté Vultr
tar czvf letsencrypt.tar.gz /usr/local/etc/letsencrypt
cp letsencrypt.tar.gz /home/hoge/
chown hoge:hoge /home/darkstar/letsencrypt.tar.gz
Au fait, lorsque je fais un scp, il est facile de vérifier le chemin source en affichant le chemin complet avec realpath, ce qui permet de copier-coller directement. Et certbot n'était pas installé...
pkg install -y py311-certbot-nginx-4.0.0
echo 'weekly_certbot_enable="YES"' >> /etc/periodic.conf
Maintenant, je les place dans /usr/local/etc/letsencrypt côté ConoHa, c'est bon.
Gérer correctement les permissions
cd /usr/local/etc/letsencrypt
find /usr/local/etc/letsencrypt -type d -exec chmod 700 {} \;
find /usr/local/etc/letsencrypt -type f -exec chmod 600 {} \;
Hacher à nouveau sur ConoHa
# which postmap
/usr/local/sbin/postmap
cd /usr/local/etc/postfix
postmap recipient_access
postmap client_access
postmap sender_access
newaliases
# postfix check
/usr/local/sbin/postconf: warning: /usr/local/etc/postfix/main.cf: support for parameter "smtp_use_tls" will be removed; instead, specify "smtp_tls_security_level"
👀
Je modifie la configuration
# smtp_use_tls = yes
smtp_tls_security_level = may
Encore une fois
# postfix check
Redémarrage
# service postfix restart
postfix/postfix-script: stopping the Postfix mail system
postfix/postfix-script: starting the Postfix mail system
Dovecot
Je n'avais pas encore créé d'utilisateur, donc je le crée.
pw useradd taro -u 1002 -g mail -d /home/taro -s /usr/sbin/nologin -m
passwd taro
Je génère la configuration côté Vultr et je crée directement /usr/local/etc/dovecot/dovecot.conf côté ConoHa.
dovecot -n
rehash
cd /usr/local/etc/postfix
postmap recipient_access
postmap client_access
postmap sender_access
newaliases
Pour l'instant, passons à OpenDKIM.
OpenDKIM
J'avais complètement oublié, mais OpenDKIM a sa configuration dans le répertoire mail... J'avais oublié.
# realpath opendkim.conf
/usr/local/etc/mail/opendkim.conf
Je l'avais rendu assez simple.
root@vultr:/usr/local/etc/mail # cat TrustedHosts
eyes4you.org
mail.eyes4you.org
root@vultr:/usr/local/etc/mail # cat SigningTable
eyes4you.org default._domainkey.eyes4you.org
mail.eyes4you.org default._domainkey.eyes4you.org
root@vultr:/usr/local/etc/mail # cat opend
cat: opend: No such file or directory
root@vultr:/usr/local/etc/mail # cat opendkim.conf
##
## opendkim.conf -- configuration file for OpenDKIM filter
##
## Copyright (c) 2010-2015, The Trusted Domain Project. All rights reserved.
##
Canonicalization simple/simple
Domain eyes4you.org
KeyFile /var/db/dkim/eyes4you.org.private
LogWhy yes
Mode sv
ReportAddress "DKIM Error Postmaster" <postmaster@eyes4you.org>
Selector default
SendReports yes
Socket inet:8891@localhost
SubDomains yes
Syslog Yes
SyslogSuccess yes
UMask 002
InternalHosts /usr/local/etc/mail/TrustedHosts
SigningTable /usr/local/etc/mail/SigningTable
KeyTable /usr/local/etc/mail/KeyTable
root@vultr:/usr/local/etc/mail # ls -lrta
total 108
-rw-r--r-- 1 root wheel 56 Aug 21 2023 opendmarc_ignore.hosts
-rw-r--r-- 1 root wheel 15502 Aug 21 2023 opendmarc.conf
-rw-r--r-- 1 root wheel 21800 Jan 7 2024 opendkim.conf.samplea
-rw-r--r-- 1 root wheel 32 Feb 4 2024 TrustedHosts
-rw-r--r-- 1 root wheel 88 Feb 4 2024 KeyTable
-rw-r--r-- 1 root wheel 95 Feb 4 2024 SigningTable
-rw-r--r-- 1 root wheel 765 Feb 4 2024 opendkim.conf
-rw-r--r-- 1 root wheel 21800 Jul 6 2024 opendkim.conf.sample
-rw-r--r-- 1 root wheel 15475 Jul 6 2024 opendmarc.conf.sample
drwxr-xr-x 2 root wheel 512 Jul 20 2024 .
drwxr-xr-x 21 root wheel 1024 Apr 18 07:11 ..
root@vultr:/usr/local/etc/mail #
J'ai récupéré la clé privée et attribué les permissions.
Normalement, il ne devrait pas être mailnull...
chown mailnull:mailnull /var/db/dkim/*.private
chmod 600 /var/db/dkim/*.private
Et maintenant que j'y pense, j'avais mis deux enregistrements TXT pour ce nom dans le passé, mais default seul devrait suffire...
De plus, j'ai supprimé les clés privées et publiques non référencées.
Migration du répertoire de messagerie existant
Je l'archive avec tar et le déplace directement avec scp.
Je place le répertoire de messagerie au même endroit et j'attribue les permissions.
# chown -R taro:mail /home/taro/Maildir
# chmod -R 700 /home/taro/Maildir
# doveadm mailbox list -u taro
Junk
Drafts
Sent
Trash
INBOX
Après un redémarrage, comme j'ai configuré avec Socket inet:8891@localhost, je vérifie le démarrage du démon.
# lsof | grep 8891
opendkim 975 mailnull 3u IPv4 0xfffff80010f24a80 0 TCP localhost:8891->*:* (LISTEN)
Transfert NS du serveur de messagerie
Transfert de Onamae vers ConoHa
Domaine -> Liste des fonctions de domaine -> Paramètres du serveur de noms
Dans 2. Sélection du serveur de noms, sélectionnez Autre et enregistrez les DNS de ConoHa a.conoha-dns.com et b.conoha-dns.com.
Cela fera en sorte que les requêtes d'enregistrements DNS se réfèrent aux DNS de ConoHa.
~~ Digression ~~
For slaves of Google
Vérifier si dig peut le résoudre.
Les DNS de Google ne fonctionnent pas du tout...
thepassenger:[haturatu]:~$ dig eyes4you.org NS @1.1.1.1 +short
a.conoha-dns.com.
b.conoha-dns.org.
thepassenger:[haturatu]:~$ dig eyes4you.org NS @8.8.8.8 +short
02.dnsv.jp.
04.dnsv.jp.
01.dnsv.jp.
03.dnsv.jp.
thepassenger:[haturatu]:~$ dig eyes4you.org NS @8.8.4.4 +short
03.dnsv.jp.
02.dnsv.jp.
04.dnsv.jp.
01.dnsv.jp.
Au fait, j'avais oublié d'ajouter le MX une fois ^^;
thepassenger:[haturatu]:~$ dig eyes4you.org TXT @1.1.1.1 +short
"v=spf1 ip4:163.44.113.145 include:_spf.eyes4you.org ~all"
thepassenger:[haturatu]:~$ dig eyes4you.org MX @1.1.1.1 +short
10 mail.eyes4you.org.](thepassenger:[haturatu]:~$ dig _dmarc.mail.eyes4you.org TXT @1.1.1.1 +short
"v=DMARC1; p=none; pct=100; adkim=r; aspf=r"
thepassenger:[haturatu]:~$ dig default._domainkey.mail.eyes4you.org TXT @1.1.1.1 +short
"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgNNPi+LvBGPAu/J4ze0LWJyCHv1UJqS/ZJBg3mY2W6bQyr6Ele1x2KDYWspglyeXuP/gJB/RhXric+73/AImw5ggbT4LGtxcywxeYPNQaHvXiIKfq8sdFR2L80I3E2qamQEKYGJHJuCVw0w3zS22bq+YFq5n9kEQW2iC7k5EGlwIDAQAB"
thepassenger:[haturatu]:~$ dig mail.eyes4you.org A @1.1.1.1 +short
163.44.113.145
thepassenger:[haturatu]:~$ dig eyes4you.org MX @1.1.1.1 +short
10 mail.
thepassenger:[haturatu]:~$ dig eyes4you.org MX @1.1.1.1 +short
10 mail.eyes4you.org.

C'est l'heure du test !
Et quand j'ai essayé de me connecter, j'ai été rejeté... En regardant avec tail -f, je vois :
# tail -f /var/log/dovecot.log
Sep 14 10:00:31 imap-login: Error: Failed to initialize SSL server context: Couldn't parse private SSL key (ssl_key setting) (maybe ssl_key_password is wrong?): error:1E08010C:DECODER routines::unsupported: No supported data to decode. Input type: PEM: user=<>, rip=hogeip, lip=hogeip, session=<EmHcabg+6cfOU23o>
Sep 14 10:00:31 auth: Debug: Loading modules from directory: /usr/local/lib/dovecot/auth
Sep 14 10:00:31 auth: Debug: Module loaded: /usr/local/lib/dovecot/auth/lib20_auth_var_expand_crypt.so
Sep 14 10:00:31 auth: Debug: Wrote new auth token secret to /var/run/dovecot/auth-token-secret.dat
Sep 14 10:00:31 auth: Debug: auth client connected (pid=1559)
Sep 14 10:00:31 imap-login: Error: Failed to initialize SSL server context: Couldn't parse private SSL key (ssl_key setting) (maybe ssl_key_password is wrong?): error:1E08010C:DECODER routines::unsupported: No supported data to decode. Input type: PEM: user=<>, rip=hogeip, lip=hogeip, session=</2rnabg+aUzOU23o>
Sep 14 10:00:34 auth: Debug: auth client connected (pid=1560)
Sep 14 10:00:34 imap-login: Error: Failed to initialize SSL server context: Couldn't parse private SSL key (ssl_key setting) (maybe ssl_key_password is wrong?): error:1E08010C:DECODER routines::unsupported: No supported data to decode. Input type: PEM: user=<>, rip=hogeip, lip=hogeip, session=<scwJarg+ZnfOU23o>
Sep 14 10:00:34 auth: Debug: auth client connected (pid=1561)
Sep 14 10:00:34 imap-login: Error: Failed to initialize SSL server context: Couldn't parse private SSL key (ssl_key setting) (maybe ssl_key_password is wrong?): error:1E08010C:DECODER routines::unsupported: No supported data to decode. Input type: PEM: user=<>, rip=hogeip, lip=hogeip, session=<w0cVarg+IujOU23o>
Hmm, je me suis dit "quoi"... et il s'avère que la sortie de dovecot -n masque en partie le chemin de la clé privée.
ssl = required
ssl_cert = </usr/local/etc/letsencrypt/live/mail.eyes4you.org/fullchain.pem
ssl_client_ca_dir = /etc/ssl/certs
ssl_dh = # hidden, use -P to show it
ssl_key = # hidden, use -P to show it
userdb {
driver = passwd
}
Le serveur de réception est maintenant connecté.
Ensuite, Postfix pour l'envoi.
... n'était pas connecté non plus, donc j'ai enquêté.
Côté Vultr
root@vultr:/usr/local/etc/postfix # grep -r submission | grep -v "\#"
./main.cf.default:known_tcp_ports = lmtp=24, smtp=25, smtps=submissions=465, submission=587
./master.cf:submission inet n - n - - smtpd
root@vultr:/usr/local/etc/postfix # grep -r 587
./main.cf.default:known_tcp_ports = lmtp=24, smtp=25, smtps=submissions=465, submission=587
./master.cf:#587 inet n - n - - smtpd
root@vultr:/usr/local/etc/postfix # sockstat -4 -l | grep 587
postfix smtpd 97537 6 tcp4 *:587 *:*
root master 1221 18 tcp4 *:587 *:*
Cela devrait être OK car il accepte les connexions, et je pensais avoir tout transféré avec scp, mais j'avais oublié master.cf dans le script de copie !
Côté ConoHa
root@localhost:/usr/local/etc/postfix # service postfix restart
postfix/postfix-script: stopping the Postfix mail system
postfix/postfix-script: starting the Postfix mail system
root@localhost:/usr/local/etc/postfix # sockstat -4 -l | grep 25
root master 1912 13 tcp4 *:25 *:*
root@localhost:/usr/local/etc/postfix # sockstat -4 -l | grep 587
root master 1912 18 tcp4 *:587 *:*
root@localhost:/usr/local/etc/postfix #
OK~
C'est maintenant connecté avec succès ! C'est devenu long, donc je continuerai bientôt. À bientôt.