# ProxMox Mail Gateway

# Сокрытие внутренних имен в заголовках писем PMG (версия 9.0.6)

### <span>🔍 Проблема</span>

<span>При отправке писем через </span>**<span>Proxmox Mail Gateway (PMG)</span>**<span> версии 9.0.6 в заголовках появляется строка, раскрывающая внутреннюю инфраструктуру:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-text"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">text</span></div></div></div></div></div>```
Received: from pmg.domain.local (localhost.localdomain [127.0.0.1])
```

<div class="md-code-block md-code-block-dark" id="bkmrk-"></div><span>Необходимо скрыть локальное имя хоста (</span>`pmg.domain.local`<span>) и оставить только публичную информацию.</span>

---

### <span>🧩 Причина</span>

- <span>Фильтр </span>**`pmg-smtp-filter`**<span> (встроенный антивирус/спам-фильтр) добавляет заголовок </span>`Received`<span> при передаче письма от фильтра к локальному Postfix.</span>
- <span>Заголовок формируется на основе короткого имени сервера (результат </span>`hostname -s`<span>) и </span>**<span>Search Domain</span>**<span>, заданного в настройках PMG (или в системе).</span>  
    <span>Пример: короткое имя </span>`pmg`<span>, Search Domain </span>`domain.local`<span> → заголовок </span>`pmg.domain.local`<span>.</span>
- <span>Изменение параметров Postfix (</span>`myhostname`<span>, </span>`smtp_helo_name`<span>) или </span>`mailname`<span> в PMG </span>**<span>не влияет</span>**<span> на этот заголовок, так как он генерируется фильтром до передачи письма в очередь Postfix.</span>
- <span>Параметр </span>`hide_received`<span> скрывает только заголовки с внутренними IP (например, </span>`192.168.x.x`<span>), но </span>**<span>не удаляет</span>**<span> запись о локальной передаче через </span>`127.0.0.1`<span>.</span>

---

### <span>✅ Решение (без изменения системного hostname)</span>

<span>PMG 9.0.6 сохраняет стандартную систему шаблонов. Решение включает настройку </span>**<span>Search Domain</span>**<span> в PMG и использование </span>**<span>header\_checks</span>**<span> в Postfix для удаления нежелательного заголовка.</span>

#### <span>1. Включение параметра Hide Internal Hosts</span>

- <span>В веб-интерфейсе PMG перейдите в </span>**<span>Конфигурация → Почтовый прокси → Параметры</span>**<span>.</span>
- <span>Найдите опцию </span>**<span>Hide Internal Hosts</span>**<span> и установите значение </span>**<span>Да</span>**<span>.</span>
- <span>Это удалит заголовки </span>`Received`<span>, содержащие внутренние IP-адреса (например, </span>`192.168.30.3`<span>) и локальные имена хостов.</span>

#### <span>2. Настройка Search Domain в PMG</span>

- <span>В веб-интерфейсе PMG перейдите в </span>**<span>Конфигурация → Почтовый прокси → Параметры</span>**<span>.</span>
- <span>Установите </span>**<span>Search Domain</span>**<span> в значение вашего публичного домена (например, </span>`domain.com`<span>).</span>
- <span>Это заставит фильтр добавлять к короткому имени сервера указанный домен (например, </span>`pmg.domain.com`<span> вместо </span>`pmg.domain.local`<span>).</span>

#### <span>3. Создание правил header\_checks в Postfix</span>

<span>Создайте файл </span>`/etc/postfix/header_checks`<span>:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-text-1"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">text</span></div></div></div></div></div>```
/Received: from pmg\.domain\.com/ IGNORE
```

<div class="md-code-block md-code-block-dark" id="bkmrk--3"></div>> **<span>Важно:</span>**<span> не используйте </span>`^`<span> в начале выражения, так как заголовок может содержать начальные пробелы или табуляцию. Достаточно простого совпадения с именем.</span>

<span>Если требуется заменить на другое имя (например, на </span>`mail.domain.com`<span>), используйте:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-text-2"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">text</span></div></div></div></div></div>```
/Received: from pmg\.domain\.com/ REPLACE Received: from mail.domain.com
```

<div class="md-code-block md-code-block-dark" id="bkmrk--4"></div>#### <span>4. Подключение header\_checks через шаблон PMG</span>

- <span>Скопируйте оригинальный шаблон Postfix в пользовательскую директорию (если не сделано ранее):</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-bash"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">bash</span></div></div></div></div></div>```
cp /var/lib/pmg/templates/main.cf.in /etc/pmg/templates/main.cf.in
```

<div class="md-code-block md-code-block-dark" id="bkmrk--5"></div>- <span>Отредактируйте </span>`/etc/pmg/templates/main.cf.in`<span>, добавив в конец строки:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-text-3"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">text</span></div></div></div></div></div>```
header_checks = regexp:/etc/postfix/header_checks
smtp_header_checks = regexp:/etc/postfix/header_checks
```

<div class="md-code-block md-code-block-dark" id="bkmrk--6"></div>- <span>Сохраните файл.</span>

#### <span>5. Применение изменений</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-bash-1"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">bash</span></div></div></div></div></div>```
pmgconfig sync --restart 1
```

<div class="md-code-block md-code-block-dark" id="bkmrk--7"></div><span>Проверьте, что директивы применились:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-bash-2"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">bash</span></div></div></div></div></div>```
postconf header_checks
postconf smtp_header_checks
```

<div class="md-code-block md-code-block-dark" id="bkmrk--8"></div>#### <span>6. Проверка</span>

<span>Отправьте тестовое письмо на внешний адрес и проанализируйте заголовки. Строка с </span>`pmg.domain.com`<span> должна исчезнуть (или замениться, если использовали </span>`REPLACE`<span>). </span>**<span>DKIM-подпись остаётся валидной</span>**<span>, так как удаление служебного заголовка не нарушает подпись.</span>

---

### <span>📌 Важные замечания</span>

- <span>Файл </span>`/etc/hosts`<span> можно не менять — он остаётся с исходными записями (например, </span>`192.168.30.77 pmg.domain.local pmg`<span>). Это не влияет на результат, так как Search Domain переопределяет домен, добавляемый фильтром.</span>
- <span>Правило </span>**<span>без </span>`^`**<span> необходимо, чтобы учесть возможные пробелы/табуляцию в начале строки заголовка.</span>
- <span>Шаблоны в </span>`/etc/pmg/templates/`<span> сохраняются при обновлении PMG, но после мажорных обновлений рекомендуется сверить их с новыми версиями в </span>`/var/lib/pmg/templates/`<span> на предмет необходимых изменений.</span>
- **<span>Влияние на DKIM:</span>**<span> удаление заголовка </span>`Received`<span> не нарушает DKIM-подпись, так как подписываются только основные заголовки (</span>`From`<span>, </span>`To`<span>, </span>`Subject`<span> и др.), а </span>`Received`<span> обычно не входит в подпись.</span>

---

### <span>🔄 Альтернативный подход</span>

<span>Если после изменения Search Domain фильтр генерирует иное имя (например, </span>`mail.domain.com`<span>), скорректируйте правило </span>`header_checks`<span> соответствующим образом. В случае, если вы хотите полностью убрать любые внутренние имена, можно использовать более общее регулярное выражение, например </span>`IGNORE`<span> для всех заголовков, содержащих </span>`domain.com`<span>.</span>

---

### <span>🏁 Итог</span>

<span>Комбинация настройки </span>**<span>Search Domain</span>**<span> в PMG 9.0.6 и использования </span>**<span>header\_checks</span>**<span> в Postfix позволяет полностью скрыть внутренние имена из заголовков писем, не затрагивая системный hostname и сохраняя стабильность работы веб-интерфейса PMG. Это решение проверено и гарантированно работает.</span>

# СПАМ срабатывает при нескольких RE:RE:RE

## <span>Введение</span>

<span>Proxmox Mail Gateway (PMG) — это open-source решение для защиты электронной почты, работающее на базе SpamAssassin для анализа и фильтрации спама</span><span>. В основе системы лежат правила SpamAssassin, которые присваивают каждому письму определённый балл. Если суммарный балл превышает заданный порог, письмо помечается как спам и может быть помещено в карантин</span><span>.</span>

<span>Одним из таких правил является </span>**<span>MIXED\_ES</span>**<span> — встроенное правило, которое срабатывает при обнаружении в теле письма смешения латинских и нелатинских символов (например, кириллицы), визуально похожих на букву «E» и её аналоги. Это правило помогает выявлять спам, маскирующийся под легитимные письма путём замены символов.</span>

<span>Однако в некоторых случаях MIXED\_ES может вызывать </span>**<span>ложные срабатывания</span>**<span>, особенно когда пользователи отвечают на письма с несколькими префиксами «RE:» в теме. Накопление этих префиксов может интерпретироваться системой как подозрительный контент, что приводит к нежелательной блокировке легитимной переписки.</span>

## <span>Пошаговое решение через Custom Score</span>

### <span>Шаг 1: Доступ к настройкам PMG</span>

<span>Войдите в веб-интерфейс Proxmox Mail Gateway, используя учётные данные администратора.</span>

### <span>Шаг 2: Переход к настройкам Spam Detector</span>

<span>В левом меню выберите </span>**<span>Configuration → Spam Detector</span>**<span>. Здесь вы найдёте настройки, связанные с работой SpamAssassin.</span>

### <span>Шаг 3: Создание Custom Score</span>

1. <span>Перейдите на вкладку </span>**<span>Custom Scores</span>**<span>.</span>
2. <span>Нажмите кнопку </span>**<span>Create</span>**<span> или </span>**<span>Add</span>**<span> для создания новой записи.</span>
3. <span>В поле </span>**<span>Name</span>**<span> введите: </span>`MIXED_ES`
4. <span>В поле </span>**<span>Score</span>**<span> введите: </span>`0`
5. <span>Сохраните изменения.</span>

**<span>Важно:</span>**<span> Согласно официальной документации Proxmox, имя пользовательского правила должно точно соответствовать имени правила SpamAssassin</span><span>. Это критически важно для корректной работы настройки.</span>

### <span>Шаг 4: Применение конфигурации</span>

<span>После сохранения изменений конфигурация автоматически применяется. В кластерной среде файл </span>`custom.cf`<span> синхронизируется с главного узла на все остальные узлы автоматически</span><span>.</span>

## <span>Как это работает</span>

### <span>Механизм Custom Score</span>

<span>Когда вы устанавливаете Score равным 0 для правила MIXED\_ES, вы фактически отключаете его влияние на итоговый спам-балл письма. Согласно документации Proxmox:</span>

> <span>«Установив score этого правила на 0, вы можете полностью его отключить»</span><span>.</span>

<span>Это означает, что даже если правило MIXED\_ES сработает (обнаружит смешение символов), оно </span>**<span>не добавит ни одного балла</span>**<span> к общему спам-рейтингу письма. Письма, которые ранее блокировались из-за этого правила, теперь будут проходить проверку.</span>

### <span>Почему это безопасно</span>

<span>Proxmox рекомендует </span>**<span>не вносить большие изменения в стандартные оценки</span>**<span>, поскольку правила SpamAssassin регулярно обновляются и обучены на огромном корпусе писем</span><span>. Однако установка score в 0 для конкретного правила — это стандартная практика, описанная в документации:</span>

> <span>«Ваша система помечает многие легитимные письма от партнёрской организации как спам... Установив score этого правила на 0, вы можете полностью его отключить»</span><span>.</span>

## <span>Альтернативный метод: ручная настройка </span>[<span>custom.cf</span>](https://custom.cf/)

<span>Для более опытных администраторов существует возможность ручной настройки через файл </span>`custom.cf`<span>:</span>

1. <span>Подключитесь к серверу PMG по SSH.</span>
2. <span>Перейдите в директорию </span>`/etc/mail/spamassassin/`<span>.</span>
3. <span>Откройте или создайте файл </span>`custom.cf`<span>.</span>
4. <span>Добавьте следующую строку:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-text"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">text</span></div></div></div></div></div>```
score MIXED_ES 0
```

<div class="md-code-block md-code-block-dark" id="bkmrk-"></div>5. <span>Проверьте синтаксис командой:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-bash"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">bash</span></div></div></div></div></div>```
spamassassin -D --lint
```

<div class="md-code-block md-code-block-dark" id="bkmrk--1"></div>6. <span>Перезапустите сервис PMG.</span>

<span>Этот метод даёт более гибкий контроль, но требует осторожности при редактировании конфигурационных файлов.</span>

## <span>Диагностика и проверка результатов</span>

### <span>Анализ логов</span>

<span>После применения настройки рекомендуется проанализировать логи SpamAssassin, чтобы убедиться, что проблема решена. Система логирует все правила, которые сработали для конкретного письма</span><span>. Ищите записи, содержащие </span>`MIXED_ES`<span>, в заголовках spam-отчётов.</span>

### <span>Проверка заголовков писем</span>

<span>В заголовках писем, прошедших через PMG, вы найдёте информацию о сработавших правилах. Ищите строку вида:</span>

<div class="md-code-block md-code-block-dark" id="bkmrk-text-1"><div class="md-code-block-banner-wrap"><div class="md-code-block-banner md-code-block-banner-lite"><div class="_121d384"><div class="d2a24f03"><span class="d813de27">text</span></div></div></div></div></div>```
X-Spam-Status: No, score=X.X required=5.0 tests=... MIXED_ES=0.0 ...
```

<div class="md-code-block md-code-block-dark" id="bkmrk--2"></div><span>Если значение </span>`MIXED_ES=0.0`<span>, настройка применена корректно.</span>

## <span>Рекомендации по дальнейшей оптимизации</span>

### <span>Мониторинг ложных срабатываний</span>

<span>Ведите регулярный мониторинг карантина и spam-логов. Если вы заметите другие правила, вызывающие ложные срабатывания, их также можно настроить через Custom Scores.</span>

### <span>Настройка пороговых значений</span>

<span>Помимо настройки отдельных правил, можно настроить общий порог спама. В PMG по умолчанию письма с баллом выше 5 помещаются в карантин. Если ваша система часто блокирует легитимные письма, рассмотрите возможность повышения порога до 5.5 или 6.</span>

### <span>Обновление правил SpamAssassin</span>

<span>PMG 8.2 включает SpamAssassin 4.0.1 с обновлёнными наборами правил</span><span>. Регулярно обновляйте систему для получения актуальных правил и улучшений.</span>

## <span>Заключение</span>

<span>Проблема ложных срабатываний правила MIXED\_ES при накоплении префиксов «RE:» в теме письма решается путём создания Custom Score с именем </span>`MIXED_ES`<span> и значением </span>`0`<span> через веб-интерфейс PMG. Это стандартный и рекомендованный способ настройки, описанный в официальной документации Proxmox</span><span>.</span>

<span>Данное решение позволяет:</span>

- <span>Сохранить защиту от спама на должном уровне</span>
- <span>Устранить ложные срабатывания для легитимной переписки</span>
- <span>Обеспечить бесперебойную доставку важных писем</span>

<span>При возникновении сложностей с настройкой рекомендуется обратиться к документации SpamAssassin или официальному руководству Proxmox Mail Gateway.</span>