![]() |
![]() |
ray_man 21.09.2004 - 14:10 |
Используется связка Exim + Exchange. В exim настроен роутер, который проверяет пользователей exchenge по LDAP и если таковые есть - отдает письма ему, нет - отбрасывает с ошибкой "Unknown user". Проблемма следующая: когда exchange не доступен exim'у, роутер не может сделать запрос и отклоняет письмо с ошибкой "Temporary local problem". А надо бы поместить письмо в очередь и отправить позже. Как это сделать подскажите. Вот роутер который осуществляет проверку: ----- ... domainlist relay_to_domains = some.server.com ... begin routers exchangemaillookup: driver = redirect data = ${lookup ldap domains = +relay_to_domains verify_recipient self = pass pass_router = dnslookup no_more dnslookup: ... exchangeroute: driver = manualroute domains = +relay_to_domains transport = remote_smtp route_data = 192.168.xxx.xxx no_more begin transports ... ---------------- |
ano 1 - 21.09.2004 - 15:17 | Я бы, честно говоря, убрал первый router. Проверку на существование ящика надёжнее всего либо вообще не делать (результат тот-же - если не exim, так exchange даст отлуп типа "user unknown", когда будет доступен), либо делать по локальному файлу - экспортировать из exchange в текстовый файл и класть на ту машинку, где exim раз в 5 минут - но в этом случае можно такую проверку делать уже в ACL на RCPT, тогда ещё и трафик сэкономишь. Ещё вариант - перенести такую проверку в транспорт, но это надо пробовать, не знаю точно, что получится... |
tuxer 2 - 21.09.2004 - 15:24 |
С exim'ом в качестве роутера не сталкивался, не зная версии и не видя полного конфига будем гадать: ignore_bounce_errors_after = ? timeout_frozen_after = ? auto_thaw = ? |
tuxer 3 - 21.09.2004 - 15:32 | Согласен с ano, здесь проще не делать проверку на существование юзера вообще. |
ray_man 4 - 21.09.2004 - 15:45 |
[1] проверка мэйлбокса нужна, т.к. Exchange 5.5 и кажется более старшие версии (точно не знаю) принимают почту для несуществующих ящиков на мэйлбокс постмастера (если можно настроить exchange, чтобы он давал "отлуп типа "user unknown", хотелось бы узнать как это сделать). Вариант с текстовым файлом не совсем нравится, если выхода не будет тогда посмотрю. С транспортом не совсем понял как реализовать. [2] exim 4.20 данные параметры, как мне кажется, ничем не помогут, т.к. письмо режектится. А мне нужно чтобы оно попало в очередь или было "заморожено". Если я не прав поясните плз. |
ray_man 5 - 21.09.2004 - 15:54 | Основная функция exim в этой связке - избавиться от спама, большая часть из которого идет на несуществующие ящики. Сам exchange не может этого сделать (или я не не нашел как это сделать). |
tuxer 6 - 21.09.2004 - 16:01 | В контексте "не делать проверку на существование юзера" имеет значение, иначе нет. Можно почту для всех валить в одно место (ящик), а exchange будет выгребать оттуда и раскладывать по своим user'ам, через определенное время. |
ray_man 7 - 21.09.2004 - 16:05 |
прошу прощения, сразу не заметил, роутер корявый получился, вот поправил: exchangemaillookup: driver = redirect data = ${lookup ldap domains = +relay_to_domains verify_recipient self = pass pass_router = dnslookup no_more |
ano 8 - 21.09.2004 - 16:09 | Лучше бы, конечно, exchange отучить такую подлость делать, но тут не подскажу, не работал я с ним и не буду ;-) Вариант с экспортом в файл на самом деле наиболее жизнеспособен - проще и надёжнее остальных. Как по другому сделать - пока не знаю, подумаю, если время будет, но скорее всего ничего больше не придумаю. Дело в том, что перехватить defer в exim'e можно только в callout'ах, в остальных местах никак. Да, есть ещё вариант - написать проверку на perl, подключить в exim'e и радоваться жизни. Я так себе greylisting сделал. Отлично работает :-) |
ano 9 - 21.09.2004 - 16:12 | 5: ну, от спама ты так просто не избавишься :-) Это гораздо более обширная тема. |
ray_man 10 - 21.09.2004 - 16:22 |
[ano] На несуществующие ящики в час приходит около 150 писем. Это прилично. Поэтуму хотелось бы подлечить exchange, и не принимать эти письма. Может есть у кого идеи как всетаки подправить роутер? |
ano 11 - 21.09.2004 - 16:36 |
Вот моя статистика с одного сервера: # egrep -c 'wrong HELO|dynamic_|VIRUS|DNSBL' /var/log/exim/mainlog 1386 # grep -c 'mailbox does not exist' /var/log/exim/mainlog 80 Вот с другого: # egrep -c 'wrong HELO|dynamic_|VIRUS|DNSBL' /var/log/exim/mainlog 1085 # grep -c 'mailbox does not exist' /var/log/exim/mainlog 186 Это за текущие сутки. Отсюда вывод - на несуществующие ящики приходит не так уж и много спама (эта проверка у меня стоит первой). |
ray_man 12 - 21.09.2004 - 16:38 | Объясните плз. почему вы против этого роутера? В чем минусы его использования? |
ano 13 - 21.09.2004 - 16:49 | Минус - в том, что он вместо 5xx mailbox does not exist (deny) даёт 4xx temporarily rejected (defer), когда exchange не отвечает. Причём, даже тогда, когда ящик существует. В принципе, на результат это не повлияет - нормальный сервер через час попытается отправить письмо ещё раз, а спамер скорее всего нет, причём если exchange ответил "нету такого", повторная попытка завершится как задумано (5хх). Это "некрасиво", но работает :-) И я ничуть не против. Но тебе-ж самому не нравится ;-) |
ano 14 - 21.09.2004 - 17:01 | Да, ещё такое соображение: ACL'ы - контролируют, router'ы - маршрутизируют, transport'ы - доставляют, соответственно, наилучшее место для проверок чего угодно - именно ACL, по крайней мере для этого он придуман. Бывают исключения, но редко. |
ray_man 15 - 21.09.2004 - 17:02 | Понятно. Тогда вариант с тесктовым файлом. Каким образом его соорудить? В каком направлении капать? |
ano 16 - 21.09.2004 - 17:11 |
Ну, это уж как сделаешь, я тут не подсказчик, как в exchange сделать экспорт просто не знаю. Потом ещё надо же перекинуть его на машинку с exim'ом - тут тоже я не могу знать, какие возможности для этого есть (ftp, ssh, http, ...). А вот сам ACL могу и показать: acl_check_rcpt: accept hosts = : deny local_parts = ^.*[@%!|] : ^\\. accept local_parts = postman : postmaster : abuse domains = +local_domains deny condition = ${lookup{${lc:$local_part}@${lc:$domain}} \ domains = +local_domains message = mailbox does not exist ($local_part@$domain) log_message = mailbox does not exist accept hosts = +relay_from_hosts ... |
ray_man 17 - 21.09.2004 - 17:19 | Спасибо |
ano 18 - 21.09.2004 - 17:36 |
Ой... Чего-то condition обрезался... Должен быть такой: condition = ${lookup{${lc:$local_part}@${lc:$domain}} dbm{/usr/local/etc/exim/db/valid_boxes.db}{no}{yes}} |