Настройка Postfix на Arch Linux

Последнее время, мне приглянулся дистрибутив Arch Linux. Вообще я симпатизирую «rolling release» дистрибутивам из-за постоянного актуального состояния системы. Я пока не знаю, насколько это стабильно работает в Arch Linux, но в целом идея замечательная. Недостатки того, что после обновления что то может упасть, я намерен компенсировать регулярными бекапами. Мне надоели форки RHEL, поэтому возникла задача на практике пощумать Arch Linux и понять, насколько эта система подходит мне в рабочей среде.

Статья ожидает быть долго, начну с самого начала и всех подробностей, которые мне могут пригодится в будуще. Первое что начнем, это с установки Arch Linux на VPS Proxmox. Описывать подробно процесс создания виртуалки не буду, отмечу только, что тип сетевого интерфейса virtio.

IPv4 у нас настроен на этапе установки Arch Linux, поэтому, нам останетя только прописать настройки IPv6. На этом этапе я остановлюсь более подробно. У меня сервер в OVH. Первое что нам нужно это посомтреть IPv6 шлюз для сервера и выделенную IPv6 подсеть. В моем случа это fe80:0000:0000:0000:0000:0000:0000:0001 и 2001:41d0:11c:c700::/56 сооствественно. В сокращенном виде адрес шлюза fe80::1, его я и буду испольховать далее. Вы можете просто скопировать шлюз из панели.

Далее нам необходимо прописать IPv6 на уровне настроек сети. У меня настройки хранятся в файле 20-ens18.network, имя конфига может отличаться от вашего.

nano /etc/systemd/network/20-ens18.network

В секцию [Network] нужно добавить IPv6 адрес и параметр IPv6AcceptRA=no

[Network]
Address=2001:41d0:11c:c700::777/64
IPv6AcceptRA=no

Далее ниже еще одну дублирующую секцию [Route]

[Route]
Gateway=fe80::1
GatewayOnLink=yes

В итоге конфиг стал выглядеть сдледующим образом:

[Match]
Name=ens18

[Network]
Address=51.51.5.15/32
Gateway=100.64.0.1
DNS=1.1.1.1
DNS=8.8.8.8

Address=2001:41d0:11c:c700::777/64
IPv6AcceptRA=no

[Route]
Gateway=100.64.0.1
GatewayOnLink=yes

[Route]
Gateway=fe80::1
GatewayOnLink=yes

Сохраняем файл и применяем настройки командой

systemctl restart systemd-networkd

Далее набор команд, для проверки, что IPv6 поднялся:

# ip -6 addr show dev ens18
2: ens18:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp0s18
    altname enx020000772c58
    inet6 2001:41d0:11c:c700::777/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::ff:fe77:2c58/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever


# ip -6 route
2001:41d0:11c:c700::/64 dev ens18 proto kernel metric 256 pref medium
fe80::/64 dev ens18 proto kernel metric 256 pref medium
default via fe80::1 dev ens18 proto static metric 1024 onlink pref medium

# ping -6 -c 3 2001:4860:4860::8888
PING 2001:4860:4860::8888 (2001:4860:4860::8888) 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=112 time=4.73 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=112 time=4.50 ms
^C
--- 2001:4860:4860::8888 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 4.496/4.612/4.728/0.116 ms
# ping -6 -c 3 2001:4860:4860::8888
PING 2001:4860:4860::8888 (2001:4860:4860::8888) 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=112 time=4.52 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=112 time=4.52 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=112 time=4.52 ms

--- 2001:4860:4860::8888 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 4.515/4.519/4.522/0.003 ms

Как можете видеть из вывода сеть поднялась, IPv6 работает.

Мы настраиваем почтовый сервер, поэтому нам необходимо прописать AAAA запись в DNS для нашего IPv6 адреса. В моем случае это mx.codebeer.ru. И далее проверимь досутпность нашего IPv6 по домену mx.codebeer.ru из внешней сети. Для этого можно использовать сервис https://dnschecker.org/ping-ipv6.php

Настройка DNS записей

Нужно создать A и MX записи для почтового домена. Я не буду подробно описывать этот процесс.

Далее вторая по важности это прописать SPF запись:

"v=spf1 mx ~all"

Следуюет ометить, что для формления записи используются кавычки.

Записи DKIM и DMARC будут далее в статье.

Установка Postfix

Устаналиваем Postfix, включаем автозапуск, проверяем статус:

pacman -Syu postfix
systemctl enable --now postfix
systemctl status postfix --no-pager

Убедимся что имя хоста соотвествует нашему почтовому домену:

# cat /etc/hostname
mx.codebeer.ru

Приводим /etc/hosts к следующему виду:

127.0.0.1   localhost
::1         localhost
51.51.5.15 mx.codebeer.ru mx

Настраиваем Postfix под наш домен:

postconf -e "inet_interfaces = all"
postconf -e "myhostname = mx.codebeer.ru"
postconf -e "mydomain = codebeer.ru"
postconf -e "myorigin = \$mydomain"
postconf -e "mydestination = \$myhostname, localhost.\$mydomain, localhost, \$mydomain"
postconf -e "mynetworks = 127.0.0.0/8 [::1]/128"
postconf -e "home_mailbox = Maildir/"
postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"
postconf -e "message_size_limit = 36700160"
postconf -e "mailbox_size_limit = 0"

Теперь сгенерируй базу алиасов, команда пригодится в будущем, если необходимо будет прописать алиасы для почтовых ящиков.

# ls -l /etc/postfix/aliases*
-rw-r--r-- 1 root root 11516 Dec  7 15:08 /etc/postfix/aliases
-rw-r--r-- 1 root root 20480 Feb  2 14:29 /etc/postfix/aliases.lmdb

Если нужно что бы Postfix работал только через IPv4 протокол, нужно отредактировать параметр в файле /etc/postfix/main.cf

inet_protocols = ipv4

Применяем настройки Postfix

systemctl restart postfix

Проверка, что Postfix слушает 25 порт:

# ss -lntp | grep ':25'
LISTEN 0      0            0.0.0.0:25        0.0.0.0:*    users:(("smtpd",pid=4713,fd=6),("master",pid=4428,fd=13))

Отправляем тестовое письмо на свою почту:

echo "Test from mx.powervps.net" | sendmail -v [email protected]

Включить автоперезапуск Postfix при падении

Необходмо создать файл drop-in:

mkdir -p /etc/systemd/system/postfix.service.d
cat > /etc/systemd/system/postfix.service.d/restart.conf <<'EOF'
[Service]
Restart=on-failure
RestartSec=5s

StartLimitIntervalSec=300
StartLimitBurst=5
EOF

Применяем настройки:

systemctl daemon-reload
systemctl restart postfix

Проверяем работает ли автоматическое поднятие сервиса:

pkill -9 master
sleep 2
systemctl status postfix --no-pager