Миграция среды FreeBSD с Vultr на ConoHa, будучи в стельку пьяным
Привет, я некомпетентен.
Я почти умер, но сейчас мигрирую с Vultr на ConoHa, так что это заметки.
-> Я напился дома и уснул, так что пишу это сегодня, что почти на следующий день.
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
Установите то, что было выведено выше.
Я выведу это с помощью tee, чтобы можно было проверить содержимое позже.
./pkg-install.sh | tee pkg-install.log
pf
Я уже настроил pf,
root@localhost:~ # pfctl -nf /etc/pf.conf
root@localhost:~ # pfctl -f /etc/pf.conf
pfctl: /dev/pf: No such file or directory
Ой, кажется, по умолчанию он не включен.
root@localhost:~ # kldload pf
root@localhost:~ # pfctl -f /etc/pf.conf
root@localhost:~ #
Он не активируется после перезагрузки, поэтому я явно включу его для загрузки при запуске.
echo 'pf_load="YES"' >> /boot/loader.conf
echo 'pflog_load="YES"' >> /boot/loader.conf
WireGuard
Я создам тот же conf, используя вывод со стороны Vultr как есть.
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
После этого я включил 51820/UDP в группе безопасности ConoHa, и проверка связи со стороны клиента прошла успешно.
Добавьте следующее в /etc/rc.conf для автоматического запуска:
wireguard_enable="YES"
wireguard_interfaces="wg0"
И я сделаю так, чтобы openai.com не маршрутизировался.
VPN環境下でもChatGPTを使えるようにする - SOULMINIGRIG
dnsmasq
Проверка настроек на стороне 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
Примените эти настройки на стороне ConoHa и получите следующий adblock.conf
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
Я вообще не устанавливал 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.
Теперь, если вы настроите клиентский WireGuard для запроса DNS-сервера по адресу 10.1.0.1, все готово.
Nginx
В правилах безопасности ConoHa разрешите 80/tcp и 443/tcp для публичного доступа.
Nginx, установленный через pkg, уже автоматически добавляет nginx_enable="YES" в /etc/rc.conf, так что все в порядке.
Я отложу настройку conf до тех пор, пока не сделаю все остальные настройки. Я только убедился, что на порту 80 отображается страница по умолчанию Nginx.
Postfix
Это сложно. Поэтому я подумал, что просто передам вывод cat main.cf | grep -v '^#' | grep -v '^$' в ChatGPT, чтобы он сгенерировал scp для копирования всех необходимых файлов... но когда я попробовал ssh, я не смог подключиться.
На самом деле, я заметил это, когда использовал WireGuard на Vultr: ConoHa, похоже, блокирует некоторые зарубежные IP-адреса на более высоком уровне, и даже с сервера, размещенного на ConoHa, невозможно подключиться к соответствующим глобальным IP-адресам. Даже при tail -f на auth.log со стороны Vultr, никаких логов не появляется.
Я подумал, что можно было бы создать туннель WireGuard, но мне лень переписывать все настройки так же, как на Vultr...
Итак, я скопирую файлы по маршруту: старый сервер → моя машина → новый сервер.
$ 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
Сертификаты сначала архивируются с помощью tar, помещаются в каталог пользователя ssh, а затем передаются с помощью scp.
Со стороны Vultr
tar czvf letsencrypt.tar.gz /usr/local/etc/letsencrypt
cp letsencrypt.tar.gz /home/hoge/
chown hoge:hoge /home/darkstar/letsencrypt.tar.gz
Кстати, при использовании scp удобно выводить полный путь с помощью realpath, чтобы можно было просто скопировать и вставить путь src. И, кстати, certbot не был установлен...
pkg install -y py311-certbot-nginx-4.0.0
echo 'weekly_certbot_enable="YES"' >> /etc/periodic.conf
Теперь разместите это в /usr/local/etc/letsencrypt на стороне ConoHa, и все в порядке.
Правильное управление разрешениями
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 {} \;
Повторное хеширование на 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"
👀
Изменяю настройки
# smtp_use_tls = yes
smtp_tls_security_level = may
Снова
# postfix check
Перезапуск
# service postfix restart
postfix/postfix-script: stopping the Postfix mail system
postfix/postfix-script: starting the Postfix mail system
Dovecot
Поскольку пользователь еще не был создан, я создаю его.
pw useradd taro -u 1002 -g mail -d /home/taro -s /usr/sbin/nologin -m
passwd taro
Я выведу настройки со стороны Vultr и создам /usr/local/etc/dovecot/dovecot.conf на стороне ConoHa.
dovecot -n
rehash
cd /usr/local/etc/postfix
postmap recipient_access
postmap client_access
postmap sender_access
newaliases
На этом пока все, далее OpenDKIM.
OpenDKIM
Я совсем забыл, что OpenDKIM имеет свои настройки в каталоге mail... Я забыл.
# realpath opendkim.conf
/usr/local/etc/mail/opendkim.conf
Я сделал это довольно просто.
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 #
Я принес закрытый ключ и предоставил разрешения.
По идее, лучше бы не mailnull...
chown mailnull:mailnull /var/db/dkim/*.private
chmod 600 /var/db/dkim/*.private
И вот я подумал, что у меня было два TXT-записи с этим именем в прошлом, но достаточно только default...
Кроме того, я удалю неиспользуемые закрытые и открытые ключи.
Перенос существующего почтового каталога
Архивируйте с помощью tar и переместите с помощью scp.
Разместите почтовый каталог в том же месте и предоставьте разрешения.
# chown -R taro:mail /home/taro/Maildir
# chmod -R 700 /home/taro/Maildir
# doveadm mailbox list -u taro
Junk
Drafts
Sent
Trash
INBOX
Перезапустите и проверьте запуск демона, так как он был настроен с Socket inet:8891@localhost.
# lsof | grep 8891
opendkim 975 mailnull 3u IPv4 0xfffff80010f24a80 0 TCP localhost:8891->*:* (LISTEN)
Перенос NS почтового сервера
Перенос с Onamae на ConoHa
Домен -> Список функций домена -> Настройки DNS-сервера
В разделе 2. Выбор DNS-сервера выберите Другое и зарегистрируйте DNS-серверы ConoHa a.conoha-dns.com и b.conoha-dns.com.
Теперь запросы DNS-записей будут ссылаться на DNS ConoHa.
~~ Отступление ~~ For slaves of Google
Проверьте, работает ли dig.
DNS Google совсем не работает...
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.
Кстати, я забыл добавить MX один раз ^^;
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.

Время тестировать!
И вот, когда я попытался войти, меня отбросило... Если посмотреть с помощью tail -f,
# 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>
Хм, я подумал... оказалось, что вывод dovecot -n частично скрывает путь к закрытому ключу.
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
}
Теперь сервер входящей почты подключен.
Далее Postfix для отправки.
...тоже не подключился, поэтому я проверил.
Со стороны 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 *:*
Раз он принимает, то должно быть все в порядке, и я думал, что все было перенесено с помощью scp, но я забыл master.cf в скрипте копирования!
Со стороны 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 #
ОК~
Теперь все успешно подключено! Стало длинно, так что продолжение следует. До свидания.