# Організація поштової скриньки для локальних мереж без DNS

Даний матеріал є адаптацією інструкції для користувачів локальної спільноти адміністраторів альтернативних мереж. Може стати в нагоді, якщо ви бажаєте створити власний поштовий сервер для локальної групи користувачів на підприємстві або для дому, без використання сторонніх серверів Google (та інших провайдерів) для переписки засобами DeltaChat або іншого клієнта, що підтримує протоколи SMTP/IMAP.

Подібним займаюсь вперше, матеріал може доповнюватись, але в цілому, мій персональний сервер на базі локальної мережі Yggdrasil - вже працює. Користуючись мережами Yggdrasil та/або Mycelium, ви також можете отримувати і надсилати пошту з локального простору через їх вбудований оверлейний режим: тобто пересилати листи через Інтернет без виділеного IP за NAT.

* якщо плануєте користуватись Yggdrasil але для вас ця інструкція виглядає складною, зверніть увагу на більш простий, коробковий варіант для локальних мереж - Yggmail, але він є швидше месенджером з API для поштових клієнтів з лімітом на вкладення в 1 Мб, а не повноцінним поштовим сервером; до того ж реалізує не стандартні адреси, що може стати проблемою сумісності з альтернативними клієнтами, які валідують хост без підтримки локальних псевдонімів

## Створення користувача пошти

Є багато способів адміністрування скриньок, але я обрав самий простий: системний, за паролем:

``` bash
useradd -m USER
passwd USER
```
* USER - замініть на вашого користувача
* для логіну буде використовуватись саме "юзернейм" а не "юзернейм@хост", оскільки технічно я хочу потім зробити прийом пошти з Yggdrasil та Mycelium на один і той же системний обліковий запис
* вказаний пароль буде також використовуватись для авторизації в клієнті

## Dovecot

``` bash
apt install dovecot-core dovecot-imapd
```

### /etc/dovecot/dovecot.conf

Вимикаю IPv4, але "слухаю" всі мережі IPv6 (включно з Yggdrasil та у моєму випадку - Mycelium)

``` /etc/dovecot/dovecot.conf
listen = ::
```

### /etc/dovecot/conf.d/10-auth.conf

``` /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
```

На Dovecot `2.4.1-4` опція вище не підтримується, тому замість неї потрібно розкоментувати:

``` /etc/dovecot/conf.d/10-auth.conf
auth_allow_cleartext = yes
```

### /etc/dovecot/conf.d/10-master.conf

``` /etc/dovecot/conf.d/10-master.conf
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}
```

## Postfix

``` bash
apt install postfix
```

### /etc/postfix/main.cf

``` /etc/postfix/main.cf
myhostname = localhost

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
smtpd_use_tls=no
compatibility_level = 3.6

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

# файл /etc/aliases - повинен існувати!
# alias_maps = hash:/etc/aliases
# alias_database = hash:/etc/aliases

mydestination =
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv6

# деякі поради від спаму з мережі, але як вони працюють ще не знаю :)
smtpd_etrn_restrictions=reject
disable_vrfy_command = yes
smtpd_helo_required = yes

# інтеграція з Dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
mailbox_command =
```
* опцію `smtpd_use_tls` вимкнено, тому що весь внутрішній трафік Yggdrasil (у моєму випадку) вже захищено на рівні транспорту; для класичних мереж - можна скористатись само-підписаним сертифікатом, додавши на нього виключення.

## Фаєрвол

Моя особиста конфігурація не передбачає прийом пошти від користувачів окрім локальних:

``` bash
ufw allow from CLIENT_IP to any port 25 proto tcp
ufw allow from CLIENT_IP to any port 143 proto tcp
```
* замінити CLIENT_IP на той, з якого підключатиметься клієнт DeltaChat

У випадку, якщо ви налаштовуєте скриньку для прийому відправлень від інших користувачів локальної мережі, можете додати виключення на його хост тієї мережі, якою користуєтесь, або замість фаєрволу - налаштувати доступ засобами SpamAssassin.

## DeltaChat

Налаштовуючи даний клієнт, вказуємо:
* E-mail - у форматі RFC 5321, тобто з літералом IPv6, наприклад: user@[IPv6:xxx:xxxx:xxxx:xxxx::]
* User SMTP/IMAP - такий як до `useradd` (без хосту)
* Host SMTP/IMAP - ваш IPv6 в мережі Yggdrasil або Mycelium
* Password - такий як до `passwd`
* Обов'язково вказуємо стандартні порти, інакше DeltaChat використовує відмінні від 25/143
* Усі види шифрування TLS вимикаємо

## Діагностика проблем

Якщо з якихось причин, пошта не відправляється і журнали в `/var/log` - відсутні, перевіряємо наявність черги:

``` bash
mailq
```
* тут буде вказано причину

Наприклад, в мене було `alias database unavailable`, тому я створив цей файл вручну, вказавши потрібні мені псевдоніми:

``` bash
nano /etc/aliases
```
* цей файл може бути порожній
* можливо, достатньо його взагалі не вказувати в конфігурації postfix явно

Після цього, оновлюємо базу і перезавантажуємо (або релодимо) сервер postfix:

``` bash
newaliases
systemctl restart postfix
```

## Посилання

=> https://www.rfc-editor.org/rfc/rfc5321#section-4.1.3 Специфікація RFC 5321
=> https://devzone.org.ua/post/orhanizatsiia-poshtovoyi-skrynky-e-mail-dlia-lokalnykh-merez-bez-dns Веб-адаптація матеріалу на DevZone (з коментарями)

### Дивіться також

=> yggdrasil-is-network-with-distributed-routing.gmi Yggdrasil - мережа з децентралізованою маршрутизацією
=> yggmail-messenger-with-email-protocol.gmi Yggmail - месенджер з поштовим інтерфейсом