# SPF, DKIM, DMARC

Якщо ситуація така: домени зареєстровані у реєстратора доменів (є можливість додавати/змінювати записи), а сайти і пошта знаходяться на сервері, на якому ти писала, обов'язково - "Додати SPF, DKIM, DMARC записи у DNS". То чи треба налаштовувати DNS на серері, чи достатньо буде налаштувань у реєстраторва доменів?

Цілком достатньо **налаштувань у панелі реєстратора доменів** — **налаштовувати DNS-сервер на своєму Ubuntu-сервері НЕ потрібно**, якщо:

* ти використовуєш **DNS-хостинг самого реєстратора** (або стороннього DNS-провайдера: Cloudflare, DigitalOcean DNS тощо)
* ти можеш додавати/редагувати там **A, MX, TXT, SPF, DKIM, DMARC** та інші записи

***

### ✅ Як це працює

DNS-записи не зобов’язані зберігатися на тому ж сервері, де знаходиться сайт або пошта. Коли хтось хоче надіслати листа на `user@example.com`, відбувається:

1. DNS-запит до `example.com` — шукають **MX-записи**
2. Потім — **A-записи** поштового хосту (`mail.example.com`)
3. Також можуть перевірити **TXT-записи (SPF, DKIM, DMARC)**

І все це залежить від **записів у DNS**, а не від того, чи є на твоєму сервері налаштований DNS-сервер (BIND, unbound, dnsmasq тощо).

***

### 📌 Ти маєш зробити одне:

**У реєстратора в панелі DNS керування** треба додати записи типу:

#### 1. **A-запис**

```
mail     A     <твоє_публічне_IP>
```

#### 2. **MX-запис**

```
@        MX    10 mail.example.com.
```

> Крапка в кінці `mail.example.com.` — важлива у деяких реєстраторів

***

#### 3. **SPF**

```
@    TXT   "v=spf1 mx a ip4:<твоє_IP> ~all"
```

> Або спрощено:

```
@    TXT   "v=spf1 mx ~all"
```

***

#### 4. **DKIM**

* Генерується окремо (`opendkim` або `rspamd`)
* Запис виглядає приблизно так:

```
default._domainkey  TXT   "v=DKIM1; k=rsa; p=..."
```

***

#### 5. **DMARC**

```
_dmarc   TXT   "v=DMARC1; p=none; rua=mailto:dmarc@example.com"
```

> або:

```
"v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
```

***

### 🧠 Висновок:

| Питання                                     | Відповідь                                                         |
| ------------------------------------------- | ----------------------------------------------------------------- |
| Чи потрібно піднімати DNS-сервер на Ubuntu? | **Ні**                                                            |
| Де додавати SPF/DKIM/DMARC?                 | **У DNS панелі у реєстратора доменів**                            |
| Що має бути на сервері?                     | **A-запис має вказувати на публічний IP**                         |
| Хто "керує" DNS?                            | Той, у кого розміщений DNS-зонфайл (реєстратор, Cloudflare, etc.) |

***

Якщо скажеш, який у тебе реєстратор (наприклад, NIC.UA, Namecheap, Cloudflare тощо), можу показати конкретно, куди йти й що додавати.

### Ащо це за адреса: "rua=mailto:<dmarc@example.com>"? Ця скринька повинна бути створена на сервері?

Чудове питання. Поясню:

***

### 📩 Що таке `rua=mailto:dmarc@example.com` у DMARC?

У DMARC-записі `rua` означає:

> **Reporting URI for Aggregate reports**\
> Тобто: *куди надсилати агреговані звіти про те, як інші поштові системи бачать твої листи*.

Ці звіти допомагають дізнатися:

* чи інші поштові сервери **отримують** твої листи
* чи **проходить SPF, DKIM**
* чи хтось **не підробляє** твою пошту
* які **IP-адреси** розсилають пошту з твого домену

***

### 🔧 Чи обов’язково створювати скриньку `dmarc@example.com`?

**Не обов’язково, але бажано.**

* Якщо ти вказуєш `rua=mailto:dmarc@example.com`, то **сервіси на кшталт Gmail, Yahoo, Outlook** будуть пробувати надіслати на цю адресу XML-звіт
* Якщо скринька не існує — звіт не буде доставлений, але все інше працюватиме

***

### 🛠 Що можна зробити:

#### Вариант 1 — **Створити поштову скриньку**:

```bash
useradd dmarc
```

або у твоїй базі `virtual_users` додати:

```
dmarc@example.com
```

Це дозволить **отримувати звіти** про доставку й перевірки твоїх листів.

***

#### Вариант 2 — **Використати сторонню скриньку або сервіс**:

Можна вказати іншу адресу:

```
rua=mailto:dmarc-report@gmail.com
```

або скористатися спеціальними сервісами:

* [dmarcian.com](https://dmarcian.com/)
* [postmarkapp.com](https://postmarkapp.com/)
* [agari.com](https://www.agari.com/)

Вони дають адресу типу `rua=mailto:dmarc@your-id.dmarcian.com`, і звіти йдуть до вебінтерфейсу.

***

### 🧠 Підсумок:

| Питання                                        | Відповідь                                    |
| ---------------------------------------------- | -------------------------------------------- |
| Чи обов’язково створювати <dmarc@example.com>? | **Ні, але тоді звіти губитимуться**          |
| Для чого ця адреса?                            | **Отримувати XML-звіти про перевірки пошти** |
| Що буде, якщо її нема?                         | **Все працює, але без звітності**            |
| Чи можна використати зовнішню скриньку?        | **Так, хоч Gmail, хоч спеціальний сервіс**   |

Хочеш, покажу приклад такого XML-звіту і як його читати?

Ні, **звіти DMARC не надсилаються на кожен лист** — і це дуже добре, бо інакше в тебе була б повна пошта.

***

### 📊 Які саме звіти надсилаються?

DMARC генерує **агреговані звіти (aggregate reports)** — це **щоденні зведення** (раз на добу, або трохи рідше) від поштових провайдерів (Gmail, Yahoo, Outlook, Apple Mail, тощо).

#### У цих звітах:

* скільки **листів** з твого домену надійшло за день
* з **яких IP-адрес** ці листи надійшли
* чи **пройшли вони SPF і DKIM**
* яку політику застосували: прийняли, відхилили, помістили в спам

***

### 📥 Як виглядає типовий звіт?

Це **XML-файл**, який, наприклад, Google надсилає з адреси типу:

```
dmarc-support@google.com
```

У листі буде прикріплений файл, наприклад:

```
google.com!example.com!20240625!20240626.xml.gz
```

***

### 🧪 Приклад вмісту звіту (спрощено):

```xml
<record>
  <row>
    <source_ip>203.0.113.45</source_ip>
    <count>25</count>
    <policy_evaluated>
      <dkim>fail</dkim>
      <spf>pass</spf>
      <disposition>quarantine</disposition>
    </policy_evaluated>
  </row>
  <identifiers>
    <header_from>example.com</header_from>
  </identifiers>
</record>
```

> Це означає, що з IP `203.0.113.45` за добу прийшло 25 листів, SPF пройшов, DKIM — ні, політика: **quarantine** (тобто, можливо, в спам)

***

### 📌 Як часто надсилаються звіти?

* Переважно **раз на день**
* Залежить від провайдера
* Якщо листів нема — звіт можуть не надсилати

***

### 🧠 Підсумок

| Питання             | Відповідь                                |
| ------------------- | ---------------------------------------- |
| На кожен лист звіт? | **Ні**, лише щоденна зведена статистика  |
| Хто надсилає?       | Gmail, Yahoo, Outlook, і т.д.            |
| Як виглядає?        | XML-файл у вкладенні                     |
| Що вказує?          | IP, кількість листів, SPF/DKIM результат |
| Як часто приходить? | Зазвичай 1 раз на добу                   |

Можеш протестувати, надіславши листа з домену на адресу @gmail.com, а потім подивитися, чи прийде звіт наступного дня. Якщо хочеш, можу показати, як їх автоматично аналізувати.

### Якщо у мене на сервері буде декілька поштових доменів, то для кожного буде свій DKIM, і, можливо DMARC, якщо `rua` буде різним?

Так, усе правильно — якщо на твоєму сервері працюють **декілька поштових доменів**, то:

***

### ✅ DKIM — **окремий ключ для кожного домену**

* DKIM — це криптографічний підпис, прив'язаний до **конкретного домену**
* Тому **для кожного домену має бути свій DKIM-ключ (приватний і публічний)**

#### Як виглядає запис DKIM у DNS:

```
default._domainkey.example.com.   TXT  "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
```

#### Якщо у тебе:

* `example.com`
* `second.org`

Тоді:

* має бути два окремих ключі
* два DNS-записи:

  ```
  default._domainkey.example.com
  default._domainkey.second.org
  ```

> *`default`* — це селектор. Його можна змінити (наприклад, `mail2024`, `postfix1`), якщо хочеш мати кілька ключів або ротацію.

***

### ✅ DMARC — **окремий запис для кожного домену**

* DMARC також налаштовується **пер-домен**
* Тобто, кожен домен має свій власний TXT-запис:

```
_dmarc.example.com   TXT   "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
_dmarc.second.org    TXT   "v=DMARC1; p=reject; rua=mailto:dmarc@second.org"
```

> Адреси в `rua` можуть бути однакові або різні — як тобі зручно.

***

### 📌 Підсумок

<table><thead><tr><th width="188">Що</th><th width="234">Окремо для кожного домену?</th><th>Коментар</th></tr></thead><tbody><tr><td>DKIM ключ</td><td>✅ Так</td><td>Власний приватний/pублічний ключ</td></tr><tr><td>DKIM DNS запис</td><td>✅ Так</td><td>Наприклад, <code>default._domainkey.*</code></td></tr><tr><td>DMARC запис</td><td>✅ Так</td><td><code>rua</code> можна змінювати</td></tr><tr><td>SPF запис</td><td>✅ Так</td><td>Залежить від поштових IP/структури</td></tr><tr><td>MX запис</td><td>✅ Так</td><td>Вказує на твій поштовий сервер</td></tr></tbody></table>

***

Можеш згенерувати DKIM для кожного домену через:

* `opendkim-genkey` (якщо використовуєш `opendkim`)
* або автоматично, якщо працюєш із Mailcow, rspamd, etc.

Хочеш приклад генерації DKIM ключа вручну через `opendkim-genkey`?
