Ось кілька корисних речей, які слід знати для керування сервером Exim 4. Це передбачає попереднє робоче знання SMTP, MTA та підказки оболонки UNIX.
Ідентифікатори повідомлень і спул-файли
Ідентифікатори повідомлень, які Exim використовує для посилань на повідомлення у своїй черзі, є буквено-цифровими змішаним регістром і мають форму: XXXXXX-YYYYYY-ZZ. Більшість команд, пов’язаних із керуванням чергою та журналюванням, використовують ці ідентифікатори повідомлень.
Для кожного повідомлення в каталозі спулу є три — порахуйте їх, ТРИ — файли. Якщо ви маєте справу з цими файлами вручну, замість використання відповідних команд exim, як описано нижче, переконайтеся, що ви отримали їх усі, і не залишайте Exim із залишками повідомлень у черзі. Раніше я возився безпосередньо з цими файлами, коли вперше почав запускати машини Exim, але завдяки утилітам, описаним нижче, мені не потрібно було цього робити багато місяців.
Файли в /var/spool/exim/msglog містять інформацію про журнал для кожного повідомлення та мають такі ж назви, як і ідентифікатор повідомлення.
Файли в /var/spool/exim/input називаються за ідентифікатором повідомлення, а також суфіксом, який вказує, чи це заголовок конверта (-H) чи дані повідомлення (-D).
Ці каталоги можуть містити додаткові хешовані підкаталоги для роботи з більшими поштовими чергами, тому не очікуйте, що все завжди з’являтиметься безпосередньо у верхніх каталогах /var/spool/exim/input або /var/spool/exim/msglog; будь-які пошуки або greps повинні бути рекурсивними. Перевірте, чи є правильний спосіб зробити те, що ви робите, перш ніж працювати безпосередньо над файлами спулу.
Основна інформація
Надрукувати кількість повідомлень у черзі:
root@localhost# exim -bpc
Надрукувати список повідомлень у черзі (час у черзі, розмір, ідентифікатор повідомлення, відправник, одержувач):
root@localhost# exim -bp
Надрукувати підсумок повідомлень у черзі (кількість, обсяг, найстаріші, найновіші, домен і підсумки):
root@localhost# exim -bp | exiqsumm
Надрукувати що Exim робить зараз:
root@localhost# exiwhat
Перевірте, як exim маршрутизуватиме задану адресу:
root@localhost# exim -bt alias@localdomain.com
user@thishost.com
<-- псевдонім@localdomain.com
маршрутизатор = локальний користувач, транспорт = локальна_доставка
root@localhost# exim -bt user@thishost.com
user@thishost.com
маршрутизатор = локальний користувач, транспорт = локальна_доставка
root@localhost# exim -bt user@remotehost.com
маршрутизатор = lookuphost, транспорт = remote_smtp
хост mail.remotehost.com [1.2.3.4] MX=0
Запустіть удавану SMTP-транзакцію з командного рядка, ніби вона надходить із заданої IP-адреси. Це відобразить перевірки Exim, ACL та фільтри, коли вони застосовані. Повідомлення фактично НЕ буде доставлено.
root@localhost# exim -bh 192.168.11.22
Показати всі налаштування конфігурації Exim:
root@localhost# exim -bP
Пошук у черзі за допомогою exiqgrep
Exim містить утиліту, яка є досить гарною для grepping через чергу, називається exiqgrep. Вивчіть це. Знай це. Живіть цим. Якщо ви не використовуєте це, і якщо ви не знайомі з різними прапорцями, які він використовує, ви, ймовірно, робите щось непростим шляхом, наприклад, передаєте `exim -bp` в awk, grep, cut або `wc - l`. Не робіть життя важчим, ніж воно є.
По-перше, різні прапорці, які контролюють, які повідомлення збігаються. Їх можна комбінувати, щоб створити дуже конкретний пошук.
Використовуйте -f для пошуку в черзі повідомлень від певного відправника:
root@localhost# exiqgrep -f [luser]@domain
Використовуйте -r для пошуку в черзі повідомлень для певного одержувача/домену:
root@localhost# exiqgrep -r [luser]@domain
Використовуйте -o для друку повідомлень, старших за вказану кількість секунд. Наприклад, повідомлення старше 1 дня:
root@localhost# exiqgrep -o 86400 [...]
Використовуйте -y, щоб надрукувати повідомлення, які молодші за вказану кількість секунд. Наприклад, повідомлення менше години тому:
root@localhost# exiqgrep -y 3600 [...]
Використовуйте -s, щоб узгодити розмір повідомлення з регулярним виразом. Наприклад, 700-799 байт:
root@localhost# exiqgrep -s '^7..$' [...]
Використовуйте -z, щоб знайти лише заморожені повідомлення, або -x, щоб знайти лише незаморожені повідомлення.
Є також кілька прапорців, які керують відображенням результату.
Використовуйте -i, щоб надрукувати лише ідентифікатор повідомлення в результаті одного з двох пошуків вище:
root@localhost# exiqgrep -i [ -r | -f ] ...
Використовуйте -c, щоб надрукувати кількість повідомлень, які відповідають одному з наведених вище запитів:
root@localhost# exiqgrep -c ...
Надрукувати лише ідентифікатор повідомлення всієї черги:
root@localhost# exiqgrep -i
Керування чергою
Основний двійковий файл exim (/usr/sbin/exim) використовується з різними прапорцями, щоб щось відбувалося з повідомленнями в черзі. Для більшості з них у командному рядку потрібно вказати один або більше ідентифікаторів повідомлень, і саме тут `exiqgrep -i`, як описано вище, дійсно стає в нагоді.
Почати запуск черги:
root@localhost# exim -q -v
Розпочати роботу в черзі лише для місцевих доставки:
root@localhost# exim -ql -v
Видалити повідомлення з черги:
root@localhost# exim -Mrm <message-id> [ <message-id> ... ]
Заморозити повідомлення:
root@localhost# exim -Mf <ідентифікатор повідомлення> [ <ідентифікатор повідомлення> ... ]
Розморозити повідомлення:
root@localhost# exim -Mt <message-id> [ <message-id> ... ]
Доставте повідомлення, незалежно від того, зависло воно чи ні, досягнуто часу повтору чи ні:
root@localhost# exim -M <message-id> [ <message-id> ... ]
Доставити повідомлення, але лише якщо час повторної спроби досягнуто:
root@localhost# exim -Mc <message-id> [ <message-id> ... ]
Примусово завершити повідомлення та відкинути його як «скасовано адміністратором»:
root@localhost# exim -Mg <message-id> [ <message-id> ... ]
Видалити всі заморожені повідомлення:
root@localhost# exiqgrep -z -i | xargs exim -Mrm
Видалити всі повідомлення старше п'яти днів (86400 * 5 = 432000 секунд):
root@localhost# exiqgrep -o 432000 -i | xargs exim -Mrm
Заморозити всю пошту в черзі від певного відправника:
root@localhost# exiqgrep -i -f luser@example.tld | xargs exim -Мf
Переглянути заголовки повідомлення:
root@localhost# exim -Mvh <id-повідомлення>
Переглянути тіло повідомлення:
root@localhost# exim -Mvb <message-id>
Переглянути журнали повідомлень:
root@localhost# exim -Mvl <message-id>
Додайте одержувача до повідомлення:
root@localhost# exim -Mar <message-id> <address> [ <address> ... ]
Відредагуйте відправника повідомлення:
root@localhost# exim -Mes <id-повідомлення> <адреса>
Керування доступом
Exim дозволяє вам застосовувати списки контролю доступу в різних точках транзакції SMTP, вказуючи ACL для використання та визначаючи його умови в exim.conf. Ви можете почати з рядка HELO.
# Specify the ACL to use after HELO
acl_smtp_helo = check_helo
# Conditions for the check_helo ACL:
check_helo:
deny message = Gave HELO/EHLO as "friend"
log_message = HELO/EHLO friend
condition = ${if eq {$sender_helo_name}{friend} {yes}{no}}
deny message = Gave HELO/EHLO as our IP address
log_message = HELO/EHLO our IP address
condition = ${if eq {$sender_helo_name}{$interface_address} {yes}{no}}
accept
ПРИМІТКА. Виконуйте перевірку HELO на свій страх і ризик. HELO є досить неважливим у великій схемі SMTP сьогодні, тому не надто вірте в те, що він містить. Може здатися, що в деяких спамах використовується рядок HELO, але ви можете бути здивовані тим, скільки легітимних повідомлень також починаються із сумнівного HELO. У будь-якому випадку, спамеру так само легко надіслати правильний HELO, ніж надіслати HELO im.a.spammer, тому вважайте, що вам пощастило, якщо ви можете зупинити спам таким чином.
Далі ви можете перевірити адресу відправника або віддалений хост. Тут показано, як це зробити після команди RCPT TO; якщо ви відхилите тут, на відміну від відхилення після MAIL FROM, ви матимете кращі дані для реєстрації, наприклад, для кого було призначено повідомлення.
# Specify the ACL to use after RCPT TO
acl_smtp_rcpt = check_recipient
# Conditions for the check_recipient ACL
check_recipient:
# [...]
drop hosts = /etc/exim_reject_hosts
drop senders = /etc/exim_reject_senders
# [ Probably a whole lot more... ]
У цьому прикладі два звичайних текстових файли використовуються як чорні списки. Додайте відповідні записи до цих файлів – імена хостів/IP-адреси до /etc/exim_reject_hosts, адреси до /etc/exim_reject_senders, по одному запису на рядок.
Також можна виконати сканування вмісту за допомогою регулярного виразу до тіла повідомлення, хоча, очевидно, це може призвести до того, що Exim використовуватиме більше ЦП, ніж йому було б потрібно, особливо для великих повідомлень.
# Specify the ACL to use after DATA
acl_smtp_data = check_message
# Conditions for the check_messages ACL
check_message:
deny message = "Sorry, Charlie: $regex_match_string"
regex = ^Subject:: .*Lower your self-esteem by becoming a sysadmin
accept
Виправити SMTP-Auth для Pine
Якщо pine не може використовувати автентифікацію SMTP на хості Exim і просто повертає повідомлення «неможливо автентифікувати», навіть не запитуючи пароль, додайте такий рядок до exim.conf:
begin authenticators
fixed_plain:
driver = plaintext
public_name = PLAIN
server_condition = "${perl{checkuserpass}{$1}{$2}{$3}}"
server_set_id = $2
> server_prompts = :
Це була проблема у збірках CPanel Exim деякий час тому, але вони, здається, додали цей рядок до поточної стандартної конфігурації.
Вимкнути пошук identd
Чесно кажучи, я не думаю, що identd був корисним протягом тривалого часу, якщо взагалі був. Identd покладається на хост, що підключається, щоб підтвердити особу (UID системи) віддаленого користувача, який володіє процесом, який створює мережеве з’єднання. Це може бути корисним у світі облікових записів оболонки та користувачів IRC, але насправді йому не місце на великому SMTP-сервері, де UID часто є просто «mail» або будь-яким іншим, як працює віддалений MTA, що марно знати. Це накладно, і призводить лише до затримок, поки запит identd відхиляється або час очікування. Ви можете зупинити сервер Exim у виконанні цих запитів, встановивши час очікування на нуль секунд у exim.conf:
rfc1413_query_timeout = 0s
Перезавантажте конфігурацію
Після внесення змін до exim.conf вам потрібно надати головному exim pid SIGHUP, щоб повторно виконати його та перечитати конфігурацію. Звичайно, ви можете зупинити та запустити службу, але це надмірно та спричиняє кілька секунд непотрібного простою. Просто зробіть це:
root@localhost# kill -HUP `cat /var/spool/exim/exim-daemon.pid`
Тоді ви повинні побачити щось подібне до наступного в exim_mainlog:
pid 1079: SIGHUP received: re-exec daemon
exim 4.52 daemon started: pid=1079, -q1h, listening for SMTP on port 25 (IPv4)
Корисні посилання:
Коментарі