Migration de l'environnement FreeBSD de Vultr vers ConoHa en état d'ébriété

26 min

language: ja bn de en es fr hi ko pt ru zh-cn zh-tw

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.

Image

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.

Related Posts