Назад | Перейти на главную страницу

Не удалось развернуть строку в ручном маршруте

Я пытаюсь добавить маршрут с перенаправлением на основе записи mx.

Но мое регулярное выражение никогда не работает.

Exim 4.90, os ubontu 18.04.

Моя конфигурация:

non_mydom_mx:
  driver     = manualroute
  #condition = ${lookup dnsdb{mxh=^mx\d\.mydom\.net}{true}fail}
  condition  = ${lookup dnsdb{mxh=^.*\$}{true}fail}
  transport  = non_mydom
  route_list = * 192.168.0.11

Не удалось выполнить тестовую маршрутизацию:

mk@mydom.net
    <-- mk@mydom.net
  router = dnslookup, transport = remote_smtp
  host mx1.mydom.net [xxxx] MX=10
  host mx2.mydom.net [xxxx] MX=20

Здесь есть несколько проблем. Меньший из них в том, что $ в конце регулярного выражения не экранируется, поэтому exim думает, что это начало переменной. Из-за этого выражение не может расшириться.

Более серьезная проблема в том, что dnsdb поиск выполняет простой DNS-запрос, и все. Задавать регулярное выражение в поиске не имеет смысла, поскольку в этом случае запрос будет неоднозначным. В вашем случае поиск выглядит примерно так: «дайте мне MX-адрес, мне все равно, какой», и он явно не работает. Даже если вы избежите $ sign, exim даже не расширяет данное регулярное выражение, вместо этого пытается найти запись MX для хоста с именем ^.*$.

Маршрутизация на основе записи MX может быть выполнена следующим образом:

non_mydom_mx:
   driver     = manualroute
   condition = ${if match {${lookup dnsdb{>: mxh=$domain}}}{[^:]\d\.mydom\.net}{yes}{no} }
   transport  = non_mydom
   route_list = * 192.168.0.11

Здесь вы запрашиваете имя хоста MX для домена получателя. Поскольку в домене обычно имеется больше записей MX, поиск объединяет результаты, разделенные : (это указано >: в начале поискового значения). Значение, данное dnsdb поиск используется в match, который сравнивает результат с регулярным выражением (которое учитывает : символ как начало новой строки). Если результат совпадает, то условие приводит к yesв противном случае no, в этом случае маршрутизатор отказывается.

Возможно, стоит упомянуть, что exim имеет отличный вывод для отладки, поэтому, если вы застряли, просто запустите exim в режиме отладки следующим образом:

exim4 -d+all -bd -oX 25252 2>&1|tee exim-debuglog.txt

После этого подключение к заданному порту (25252) и попытка отправить простое сообщение заставит exim записать всю информацию об обработке сообщения, включая ACL, маршрутизаторы и этапы раскрытия переменных. Это может пригодиться, если вы попытаетесь выяснить, почему определенное правило не работает.