Автор Тема: Postfix + ldap  (Прочитано 40984 раз)

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #60 : 23 Январь 2019, 03:57:35 »
Да, более десяти групп

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #61 : 23 Январь 2019, 06:47:38 »
Да, более десяти групп
И ldapsearch типа:
ldapsearch -o ldif-wrap=no -xLLL -H ldap://ads.mycompany.ru -D someUser@mycompany.ru -w somePass -b cn=users,dc=mycompany,dc=ru samaccountname=testuser memberof
ничего не возвращает?

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #62 : 31 Январь 2019, 05:11:23 »
Беда заключалась в том что "memberof" регистрозависимый и называться он должен "memberOf", буква "О" обязательно большая. Далее вопрос по скрипту dovecot в переменную $user отдает вместе с доменом, как отрезать "@domain.ru"? с перлом как я уже говорил у меня беда полная. Плюс ко всему ldapsearch в debian 9.6 по умолчанию не идет, но находится скрипт для запуска /usr/share/bash-completions/, что меня новичка смутило сначала, что он молча то, доставил пакет ldap-utils и все встало на свои места.

Ну и с вырезанимаем не режет, почему-то, mycompany.ru заменил на свое, да и OU значительно больше, чем Users
perl -00 -wpe 'chomp; s/memberOf: cn=([^,]+),cn=users,dc=mycompany,dc=ru(\n?)/$1 . ($2 ? "," : "")/gie'`Что выдает скрипт на данный момент отправил в личное сообщение.
« Последнее редактирование: 31 Январь 2019, 05:52:17 от icom »

icom

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #63 : 10 Апрель 2019, 05:10:40 »
при попытке включить авторизацию для dovecot по ldap и mysql одновременно возникла проблема.
Как только просто устанавливаю модуль dovecot-mysql, при перезапуске сервиса ругается что не может загрузить библиотеку ldap:
Общий лог кота:
Dec 28 13:56:58 auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Dec 28 13:57:01 auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Dec 28 13:57:01 auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/libdriver_mysql.so

Error.log
Dec 28 13:57:01 auth: Fatal: Couldn't load required plugin /usr/lib/dovecot/modules/auth/libauthdb_ldap.so: dlopen() failed: libnettle.so.6: failed to map segment from shared object
Dec 28 13:57:01 master: Error: service(auth): command startup failed, throttling for 2 secs

При это с postfix никаких проблем не возникло, смотрит ldap и mysql. Что может быть, у меня идеи быстро кончились?
По этому вопросу решение пришло позже:
во-первых обновился до актуального стабильного релиза dovecot, ругательства сильно поменялись, но суть осталась.
во-вторых поставил спамассасин, а он хотело каких-то еще криптобиблиотек;
в-третьих в файле довекота 10-master, параметр default_vsz_limit = 64М поменял на 256M как рекомендовалось в новых версиях.
Установил и подключил модуль dovecot-mysql и нет проблем.

JohnRD

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #64 : 16 Май 2020, 00:56:32 »
Егор добрый день, вечер, а также уважаемые Гуру Postfix

вопрос если можно
у меня сейчас такая конструкция, 10 почтовых доменов в разных городах
центральный domain.ru
филиалы dom2.domain.ru, dom3.domain.ru, dom4.domain.ru, … dom10.domain.ru
В центральном офисе корневой Windows домен corp.local и 1 дочерний dom1.corp.local
В Остальных городах dom2.corp.local … dom10.corp.local
Между центральным офисом и филиалами есть ведомственные каналы,
Между всеми LDAP есть репликация.
Есть общая организация MS Exchange, тоесть все контакты компании доступны каждому работнику в global address list, но в каждом филиале свой Exchange сервер где живут ящики своего филиала.
Почта внутри компании ходит по ведомственным каналам не выходя наружу.
В каждом городе свой postfix является релеем для своего MS Exchange,
Почта с наружи принимается на postfix и проверяется на наличие активного ящика в своем LDAP и пересылается в свой MS Exchange согласно транспорту.
MX записи для доменов филиалов dom2.domain.ru, dom3.domain.ru, dom4.domain.ru, … dom10.domain.ru имеют приоритет 10,
для каждого почтового домена филиала есть MX с приоритетом 20 указывающий на сервер postfix в центральном офисе, чтобы принять почту и отправить ее по ведомственному каналу в филиал.
В центральном офисе postfix проверяет наличие ящика в корневом домене corp.local поскольку этот домен содержит копию всех дочерних LDAP, и далее согласно своему транспорту отправляет на сервер Exchange IP которого там указан.
Проблема начала появляться когда люди начали переезжать из филиала в филиал и работать там.
К примеру: у человека родной почтовый домен dom4.domain.ru он уехал в другой филиал на неизвестное время где свой почтовый домен dom3.domain.ru, он хочет продолжать получать почту  на свой почтовый домен dom4.domain.ru.
Если это временно со своим ноутбуком проблем нет, входит аунтифицируется и работает все идет через внутренний канал, но если надолго логичнее ему дать пк из местного Windows домена, но приходиться делать костыли такие как: разрешать местному Exchange принимать почту для домена другого филиала, править транспорт родного Postfix указывая его родной email и новый сервер Exchange для пересылки
Вот так
domain.ru     smtp:[172.16.194.47]
dom2. domain.ru     smtp:[172.16.20.12]
dom3. domain.ru     smtp:[172.16.32.12]
dom4. domain.ru     smtp:[172.16.40.12]
dom5. domain.ru     smtp:[172.16.52.12]
dom6. domain.ru     smtp:[172.16.60.12]
dom7. domain.ru     smtp:[172.16.72.12]
dom8. domain.ru     smtp:[172.16.80.12]
dom9. domain.ru     smtp:[172.16.92.12]
dom10. domain.ru    smtp:[172.16.100.12]

familia-io@domain.ru smtp:[172.16.72.12]
получается внешняя почта все равно идет через MX родного города и пересылается по внутренним сетям на другой Exchange

от сюда возникает вопрос, можно ли сделать проверку в LDAP не только на наличие ящика но и проверку на предмет где он сейчас находится, в каком LDAP какого домена после чего эту переменную использовать для транспорта чтобы переслать в нужный Exchange того города где он поселился.
И если такое будет возможно можно ли будет отказаться от доменов 3го уровня, выдавая всем domain.ru используя  geo-location?
Заранее благодарен за ответ
« Последнее редактирование: 22 Май 2020, 18:45:55 от JohnRD »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #65 : 17 Май 2020, 03:34:44 »
Здравствуйте!
Транспортные карты postfix через LDAP настраивать не приходилось, но попытаться можно. Но первым делом у меня возник вопрос, зачем такие сложности? Если человек из филиала 3 приехал работать в филиал 4, что мешает ему подключаться к своему почтовому серверу в филиале 3 и принимать/отправлять почту через него?

Потому что если пойти по тому пути, что Вы предлагаете, то кроме проблем с транспортом на почтовом сервере филиала 4 должны возникнуть проблемы в доставкой письма в почтовый ящик "неродного" пользователя (хотя, может для Exchange это не проблема, не приходилось с ним сталкиваться, поэтому не знаю).

Мне кажется, Вы чересчур усложните систему, в AD придётся для каждого пользователя вести данные о том, в каком филиале он сейчас находится. Рано или поздно кто-то что-то забудет изменить и почта будет ходить как попало.

На мой взгляд, самые простые решения всегда являются самыми надёжными. Тем не менее, если Вы готовы рискнуть, для начала мне бы хотелось посмотреть на конфигурацию postfix какого-нибудь филиала.

Егор

JohnRD

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #66 : 17 Май 2020, 16:38:11 »
Егор Спасибо что ответ.
Когда я это строил, разделения на почтовые домены по 3му уровню мне казалось самым простым, я не мог предположить передвижения такого рода, это как правило объединение филиалов в одно юридическое лицо, упразднение начальства, и иногда переезд 1го директора в другой город.
Работа в домене 4, человеку из домена 3, возможна, домены друг друга знают через днс, если это на время то нет проблем, особенно если он со своим ПК приехал, пк и пользователь аунтифицируются в своем родном домене, но есть нюансы, все политики на пк и юзера прилетают с того родного домена, такие как агент касперского отчитывается в тот домен и тащит обновления от туда, настройки прокси сервера указывают на свой родной прокси, клиент 1с который лежит в сети того города и домена, и все это человек тащит с другого города по ведомственному каналу, включая почту, это терпимо и можно отключить на время политики для него, для программ типа клиента 1с, можно переписать путь на клиента в местной сети, прокси переписать на местный итд.
Но когда человек приезжает и сам не знает на сколько, это схоже с переводом военного в другую воинскую часть, то логичнее перевести его пк в местный домен, или выдать ему местный пк, завести новую учетку в этом домене и все ярлыки на программы, прокси  и тд будут ссылаться и будут привязаны к местной сети, вопрос остается с почтой, его почту знают многие контрагенты и понятно то что он ее хочет оставить за собой,
Поступить можно так, в местном Exchange добавить почтовый домен dom3.domain.ru в дополнение к родному dom4.domain.ru для приема человеку его родной почты, а в его родном постфиксе в транспорте дописать строку с IP адресом Exchange который сейчас его обслуживает, и это будет приоритетом.
dom3. domain.ru     smtp:[172.16.32.12]
familia-io@dom3.domain.ru smtp:[172.16.40.12]
и его почта будет приходить к нему через ведомственный канал, в Exchange нового домена с постфикса на который указывает MX, для dom3. domain.ru, так сейчас работает около года один человек.
Иногда получается договориться с человеком, выдать ему новую почту в новом домене, и настроить пересылку всей входящей почты со старого ящика прямо в Exchange, но отправлять он уже будет с новой почты, в надежде что через время все его контакты перейдут на его новый адрес.
В связи с этим в  голове вертится мысль об одном почтовом домене domain.ru
В каждом филиале на каждом Exchange делаю этот домен accepted, как родной
осталось научить постфикс определять где находится почтовый адрес в данный момент чтобы переслать именно в тот город в его домен на Exchange в котором живет его ящик.
И продумать как прописать MX ы в каждом городе, не гнать же всю почту через центр.
Хотя сейчас мобильные клиенты идут именно через центральный офис, через https, у Exchange есть понятие проксирование, центральный Exchange авторизует и конектит к своему серверу уже через ведомственные каналы.

Настройки postfix филиала

main.cf
virtual_mailbox_domains =
        dom3.domain.ru
virtual_mailbox_maps =
        ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = hash:/usr/local/etc/postfix/transport

transport
dom3.domain.ru     smtp:[172.16.32.12]

ldap_dom3.corp.local.cf
server_host =
        172.16.32.10,
        172.16.32.11
server_port = 3268
timeout = 60
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
result_format = %s
domain = dom3.domain.ru
result_attribute = cn
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3

поскольку рутовый домен corp.local содержит копии всех ldap дочерних доменов, то в центральном офисе postfix делает запрос в ldap контроллера домена corp.local
также существует MX для каждого потового домена филиала с меньшим приоритетом и указывает на IP сервер postfix центрального офиса, то центральный postfix может получить для всех дочерних доменов почту проверить в корневом ldap на предмет наличия и отослать в exchange родного домена,
также Exchange любого филиала может и отослать почту через центральный postfix, в случае проблем со своим, через внутренний MX с меньшим приоритетом, прописанный в локальном DNS

настройки postfix центрального офиса

main.cf
virtual_mailbox_domains =
        domain.ru,
        dom2.domain.ru,
        dom3.domain.ru,
        dom4.domain.ru,
        dom5.domain.ru,
        dom6.domain.ru,
        dom7.domain.ru,
        dom8.domain.ru,
        dom9.domain.ru,
        dom10.domain.ru
 virtual_mailbox_maps =
        ldap:/usr/local/etc/postfix/ldap_corp.local.cf
 virtual_transport = hash:/usr/local/etc/postfix/transport

ldap_corp.local.cf
server_host =
        172.16.10.10,
        172.16.10.11
server_port = 3268
timeout = 60
search_base = DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
result_format = %s
domain =
        domain.ru,
        dom2.domain.ru,
        dom3.domain.ru,
        dom4.domain.ru,
        dom5.domain.ru,
        dom6.domain.ru,
        dom7.domain.ru,
        dom8.domain.ru,
        dom9.domain.ru,
        dom10.domain.ru
result_attribute = cn
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=CORP,DC=corp,DC=local
bind_pw = Passw0rd
version = 3

transport
domain.ru     smtp:[172.16.194.47]
dom2.domain.ru     smtp:[172.16.20.12]
dom3.domain.ru     smtp:[172.16.32.12]
dom4.domain.ru     smtp:[172.16.40.12]
dom5.domain.ru     smtp:[172.16.52.12]
dom6.domain.ru     smtp:[172.16.60.12]
dom7.domain.ru     smtp:[172.16.72.12]
dom8.domain.ru     smtp:[172.16.80.12]
dom9.domain.ru     smtp:[172.16.92.12]
dom10.domain.ru    smtp:[172.16.100.12]

в дополнение
каждый дочерний домен уникальный и у объекта юзер уже есть поля его принадлежности к своему серверу Exchange например запрос поля
homeMTA
выдаст
CN=Microsoft MTA,CN=DOM3-MSG-01,CN=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=CORP,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=local

CN=DOM3-MSG-01   вот это сервер Exchange в этом филиале

« Последнее редактирование: 22 Май 2020, 18:55:27 от JohnRD »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #67 : 19 Май 2020, 03:15:52 »
Здравствуйте! Не люблю давать гипотетических советов (которые сам не опробовал), но в данном случае придётся так сделать, поскольку связки AD+Exchange у меня нет (атрибуты proxyAddress и homeMTA относятся к Exchanhe), а разворачивать её ради эксперимента слишком долго и накладно.

Postfix позволяет в настройках указывать несколько карт, поэтому в virtual_transport можно указать две карты:
virtual_transport = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf, hash:/usr/local/etc/postfix/transport
Понятно, что если LDAP-карта что-то вернёт, то транспорт письма будет осуществляться в соответствии с полученным ответом, если же она ничего не вернёт, то ответ должен быть получен из второй карты (типа, по умолчанию). Причём LDAP-карта должна вернуть ответ, сформированный как описано в разделе "RESULT FORMAT" man-страницы transport(5), то есть:
smtp:[172.16.40.12]или
smtp:[dom4-msg-01.dom4.domain.ru]
Это исходные данные. Теперь что касается самой LDAP-карты. Тут можно пойти двумя путями. "Простой" путь заключается в том, чтобы назначить в учётке пользователя некий свободный текстовый атрибут, который будет содержать IP-адрес (или DNS-имя) требуемого сервера. Для примера я возьму атрибут postOfficeBox. В записи пользователя с нестандартной маршрутизацией почты он будет заполнен так:
postOfficeBox: 172.16.40.12или
postOfficeBox: dom4-msg-01.dom4.domain.ru
Тогда LDAP-карта будет выглядеть примерно так:

server_host = 172.16.32.10, 172.16.32.11
server_port = 3268
domain = dom3.domain.ru
timeout = 60
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
result_attribute = postOfficeBox
result_format = smpt:[%s]

Проверить можно так:
postmap -q familia-io@dom3.domain.ru ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf
Должна вернуться строка:
smtp:[dom4-msg-01.dom4.domain.ru]

Второй, "сложный" способ: попробовать с помощью рекурсивных LDAP-запросов "поймать" DNS-имя Exchange-сервера на основе атрибута homeMTA записи пользователя. Сложность в том, что средствами LDAP-карты мы можем только получить что-то из значения конкретного атрибута записи, удовлетворившей заданным критериям поиска в каталоге, "вырезать" что-то из DN-имени записи не получится. То есть если в записи сервиса, на которую ссылается атрибут homeMTA записи пользователя, есть атрибут, в котором указано DNS-имя (IP-адрес) сервера Exchange, то можно попытаться добыть это значение такой LDAP-картой:
server_host = 172.16.32.10, 172.16.32.11
server_port = 3268
domain = dom3.domain.ru
timeout = 60
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
special_result_attribute = homeMTA
result_attribute = someAttributeWithExchageServerAddress
result_format = smpt:[%s]

Параметр special_result_attribute используется для организации рекурсивного поиска в записи, на которую указывает атрибут homeMTA, а в параметре result_attribute указывается тот атрибут, значением которого является имя Exchange-сервера (в примере я привёл фиктивное имя атрибута, его нужно заменить актуальным). Теоретически, рекурсия может быть многоступенчатой, но чтобы её грамотно организовать, нужно знать, как устроена сервисная запись "Microsoft MTA" (у меня её, повторюсь, нет). Про организацию рекурсивного поиска можно почитать в документации Postfix http://www.postfix.org/LDAP_README.html#example_group, конкретно второй случай с special.cf. О параметрах настройки LDAP-карт в man-странице ldap_table(5).

Надеюсь, мои гипотетические умозаключения наведут вас на правильные мысли и решения =) .

Егор

JohnRD

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #68 : 19 Май 2020, 19:58:31 »
Егор спасибо
у ексченжа есть свободные 15 кастом атрибутов в которые можно писать что хочешь, вписал IP

server_host =
        172.16.32.10,
        172.16.32.11
server_port = 3268
timeout = 60
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(objectClass=user))
result_format = smtp:[%s]
domain = dom3.domain.ru
result_attribute = extensionAttribute1
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
Получил вывод как у вас
root@dom3-gw:/usr/local/etc/postfix # postmap -q john3@dom3.domain.ru ldap:./test.cf
smtp:[172.16.32.12]

но есть вопросы
получается это будет проверять наличие юзера в лдап
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_corp.local.cf

и это
virtual_transport = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf

какова последовательность обработки кто первый virtual_mailbox_maps или virtual_transport

может у virtual_mailbox_maps запрос оставить полный с проверкой на класс обьекта и исключать выключенные.
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))

а у virtual_transport поменьше
query_filter = proxyAddresses=smtp:%s

и еще
какая цель у транспорта по дефолту, hash:/usr/local/etc/postfix/transport
что там написать? и куда направить? в каком случае он может понадобиться?


попробовал изменить транспорт на ldap
почта идет, далее попробовал на другой адрес у которого нет кастом атрибута, все равно идет, обнаружил следующее
у меня в main.cf   2 параметра транспорта

transport_maps = hash:/usr/local/etc/postfix/transport
и
#virtual_transport = hash:/usr/local/etc/postfix/transport
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf

выключил первый
#transport_maps = hash:/usr/local/etc/postfix/transport
в логах
relay=none, delay=0.16, delays=0.16/0/0/0, dsn=4.3.0, status=deferred (mail transport unavailable

вернул второй
virtual_transport = hash:/usr/local/etc/postfix/transport
#virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf

relay=none, delay=0.27, delays=0.26/0/0/0.01, dsn=4.3.0, status=deferred (mail transport unavailable)

в обоих стаивить ldap ? или как отказаться от
#transport_maps = hash:/usr/local/etc/postfix/transport
« Последнее редактирование: 19 Май 2020, 21:44:34 от JohnRD »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #69 : 19 Май 2020, 23:49:36 »
Попробую ответить на Ваши вопросы.

Про последовательность обработки virtual_mailbox_maps и virtual_transport. Трудно сказать, это нужно хорошо знать внутреннюю кухню Postfix, подозреваю, что сначала обрабатывается virtual_mailbox_maps, а потом virtual_transport. В принципе, они независимы друг от друга, переживать особенно нечего. По здравому размышлению, от virtual_mailbox_maps в вашей ситуации вообще можно отказаться.

Кстати, я тут подумал на свежую голову: вы же не используете Postfix для доставки почты непосредственно в почтовые ящики, а пересылаете почту для доставки в Exchange. Поэтому вместо демона virtual (доставщика почты в виртуальные ящики), правильнее было бы настраивать демон relay с соответствующими параметрами relay_domains, relay_transport и (при необходимости) relay_recipient_maps.

Про указание двух карт в virtual_transport (через запятую). Они будут обрабатываться последовательно в порядке указания в параметре. Если первая вернёт ответ, вторая обрабатываться не будет (логическое "ИЛИ"). Вторую, дефолтную, я оставил на случай, если администратор забудет назначить в каталоге значение атрибута, который используется в транспортной LDAP-карте. Или можно назначить "нестандартную" транспортировку только тем, кому она действительно нужна, остальным получателям транспортировка будет по дефолту.

Про параметр transport_maps. В документации Postfix толком не сказано, зачем он нужен. Подозреваю, что это глобальный дефолт для выбора транспорта, если определиться с транспортировкой из других карт (local_transport, virtual_transport, relay_transport) не удалось. Мне кажется, в вашем случае он задействуется потому, что "нестандартный" домен получателя не перечислен в параметре virtual_mailbox_domains, поэтому демон virtual вообще не задействуется для обработки письма и Postfix использует глобальные настройки транспортировки из transport_maps. Если привести в порядок virtual_mailbox_domains, то от transport_maps можно будет отказаться.

Кстати, если вы указываете в настройках LDAP-карты параметр domain, то в нём список доменов тоже должен быть исчерпывающим, иначе могут возникнуть непредвиденные трудности с доставкой. Или вообще откажитесь от использования этого параметра.

Про фильтр в параметре query_filter транспортной LDAP-карты. Я же просто показал вам пример, настраивайте, как считаете правильным для вашей ситуации.

JohnRD

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #70 : 20 Май 2020, 02:04:25 »
в карте
domain = dom3.domain.ru
убрал почта идет

в конфиге
virtual_mailbox_domains = dom3.domain.ru
выключаю virtual_mailbox_domains
он становится virtual_mailbox_domains = $virtual_mailbox_maps
почта не идет

и в карте и в конфиге одно значение dom3.domain.ru

и еще возник вопрос, достаточным будет вывод из ldap для транспорта
smtp:[172.16.32.12]
по идее нужно так
familia-io@dom3.domain.ru    smtp:[172.16.32.12]

попробовал и так и с email,  сменил транспорт на центральный сервер, получается без дефолтного почта просто не идет а с ним она идет куда там прописано., без участия ldap запроса

выключаю virtual_transport
он становится virtual_transport = virtual
почта идет,
точно пользуется transport_maps


« Последнее редактирование: 20 Май 2020, 02:26:24 от JohnRD »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #71 : 20 Май 2020, 02:54:38 »
и еще возник вопрос, достаточным будет вывод из ldap для транспорта
smtp:[172.16.32.12]
по идее нужно так
familia-io@dom3.domain.ru    smtp:[172.16.32.12]

Привильно так:
smtp:[172.16.32.12]
Это можно проверить с помощью статической карты, в которой у вас прописан конкретный адрес:
postmap -q familia-io@dom3.domain.ru hash:/usr/local/etc/postfix/transport
попробовал и так и с email,  сменил транспорт на центральный сервер, получается без дефолтного почта просто не идет а с ним она идет куда там прописано., без участия ldap запроса

выключаю virtual_transport
он становится virtual_transport = virtual
почта идет,
точно пользуется transport_maps

Предлагаю не метаться, а добиться, чтобы у вас заработала транспортная LDAP-карта. Отключите transport_maps, а в настройках демона virtual оставьте так:
# transport_maps = ...

...

virtual_mailbox_domains = dom3.domain.ru
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf

Почта должна ходить только для тех пользователей, у которых прописан атрибут для транспортной LDAP-карты, для остальных -- нет. После того, как вы этого добьётесь, добавьте дефолтную статическую транспортную карту, чтобы почта ходила для всех остльных пользователей:
virtual_transport = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf, hash:/usr/local/etc/postfix/transport

JohnRD

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #72 : 22 Май 2020, 18:05:39 »
Egor добрый день

так и не смог я избавиться от
transport_maps

оставляю
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
лог такой
May 22 16:42:57 dom3-gw postfix/qmgr[36274]: warning: connect to transport private/ldap: No such file or directory
May 22 16:42:57 dom3-gw postfix/error[36282]: 2D2676556231: to=<john3@dom3.domain.ru>, relay=none, delay=0.17, delays=0.16/0/0/0.01, dsn=4.3.0, status=deferred (mail transport unavailable)

оставляю
virtual_transport = hash:/usr/local/etc/postfix/transport
лог такой
May 22 17:12:38 dom3-gw postfix/qmgr[36757]: warning: connect to transport private/hash: No such file or directory
May 22 17:12:38 dom3-gw postfix/error[36759]: 778B76556233: to=<john3@dom3.domain.ru>, relay=none, delay=0.28, delays=0.28/0/0/0, dsn=4.3.0, status=deferred (mail transport unavailable)
судя по private/hash и private/ldap  то он видит строку и разницу в ней

убираю обе
transport_maps  = hash:/usr/local/etc/postfix/transportvirtual_transport = hash:/usr/local/etc/postfix/transportвижу такое
May 22 17:21:45 dom3-gw postfix/virtual[36885]: fatal: bad string length 0 < 1: virtual_mailbox_base =
May 22 17:21:46 dom3-gw postfix/master[36876]: warning: process /usr/local/libexec/postfix/virtual pid 36885 exit status 1
May 22 17:21:46 dom3-gw postfix/master[36876]: warning: /usr/local/libexec/postfix/virtual: bad command startup -- throttling
он сразу понимает что нет транспорта совсем

тоесть вот так у меня не работает
# transport_maps = ...
virtual_mailbox_domains = dom3.domain.ru
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf

убрал virtual_transport
изменил transport_maps на ldap c result_format = smtp:[%s] с поиском IP ексченжа
#transport_maps = hash:/usr/local/etc/postfix/transport
transport_maps = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
почта пошла в этот ящик с кастом атрибутом

в ящик без атрибута почта не пошла
May 22 19:05:32 dom3-gw postfix/virtual[37605]: fatal: bad string length 0 < 1: virtual_mailbox_base =
May 22 19:05:33 dom3-gw postfix/master[37594]: warning: process /usr/local/libexec/postfix/virtual pid 37605 exit status 1
May 22 19:05:33 dom3-gw postfix/master[37594]: warning: /usr/local/libexec/postfix/virtual: bad command startup -- throttling


подскажите что я упускаю
посмотрел примеры, либо обе строки transport_maps и virtual_transport либо одна transport_maps

сейчас попробую настроить с relay демоном но боюсь, что transport_maps вылезит все равно, он какой-то дефолтовый тут

postfix postfix-3.5.1_1

root@dom3-gw:/usr/local/etc/postfix # postconf -n
command_directory = /usr/local/sbin
compatibility_level = 2
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
html_directory = /usr/local/share/doc/postfix
inet_interfaces = all
inet_protocols = ipv4
local_recipient_maps =
mail_owner = postfix
mailq_path = /usr/local/bin/mailq
manpage_directory = /usr/local/man
message_size_limit = 41943040
meta_directory = /usr/local/libexec/postfix
milter_default_action = accept
milter_protocol = 2
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = dom3.domain.ru
myhostname = mail1.dom3.domain.ru
mynetworks = 127.0.0.0/8, 172.16.32.12/32
mynetworks_style = host
myorigin = $mydomain
newaliases_path = /usr/local/bin/newaliases
non_smtpd_milters = inet:localhost:12301
proxy_interfaces =
queue_directory = /var/spool/postfix
readme_directory = /usr/local/share/doc/postfix
relay_domains = $mydestination
relayhost =
sample_directory = /usr/local/etc/postfix
sendmail_path = /usr/local/sbin/sendmail
setgid_group = maildrop
shlib_directory = /usr/local/lib/postfix
smtpd_client_restrictions = permit_mynetworks, check_client_access hash:/usr/local/etc/postfix/sender_access, reject_unauth_pipelining, reject_unknown_client_hostname, reject_rbl_client bl.spamcop.net, reject_rbl_client sbl.spamhaus.org, reject_rbl_client zen.spamhaus.org, reject_rbl_client aspews.ext.sorbs.net, check_reverse_client_hostname_access pcre:/usr/local/etc/postfix/reverse_hostname_access.pcre
smtpd_discard_ehlo_keywords = silent-discard, dsn
smtpd_etrn_restrictions = permit_mynetworks, reject
smtpd_helo_restrictions = permit_mynetworks, check_helo_access hash:/usr/local/etc/postfix/sender_access, reject_invalid_helo_hostname, reject_unknown_helo_hostname, reject_non_fqdn_helo_hostname
smtpd_milters = inet:localhost:12301
smtpd_recipient_restrictions = check_recipient_access hash:/usr/local/etc/postfix/recipient_access, permit_mynetworks, reject_unauth_destination check_policy_service inet:127.0.0.1:10023
smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/usr/local/etc/postfix/sender_access, reject_non_fqdn_sender, reject_unverified_sender, reject_unknown_sender_domain
soft_bounce = no
unknown_local_recipient_reject_code = 550
virtual_mailbox_domains = dom3.domain.ru
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
root@dom3-gw:/usr/local/etc/postfix #


root@dom3-gw:/usr/local/etc/postfix # postconf | grep transport
address_verify_default_transport = $default_transport
address_verify_local_transport = $local_transport
address_verify_relay_transport = $relay_transport
address_verify_sender_dependent_default_transport_maps = $sender_dependent_default_transport_maps
address_verify_transport_maps = $transport_maps
address_verify_virtual_transport = $virtual_transport
best_mx_transport =
default_transport = smtp
default_transport_rate_delay = 0s
defer_transports =
empty_address_default_transport_maps_lookup_key = <>
error_transport_rate_delay = $default_transport_rate_delay
fallback_transport =
fallback_transport_maps =
lmtp_transport_rate_delay = $default_transport_rate_delay
local_transport = local:$myhostname
local_transport_rate_delay = $default_transport_rate_delay
mailbox_transport =
mailbox_transport_maps =
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $sender_bcc_maps $recipient_bcc_maps $smtp_generic_maps $lmtp_generic_maps $alias_maps $smtpd_client_restrictions $smtpd_helo_restrictions $smtpd_sender_restrictions $smtpd_relay_restrictions $smtpd_recipient_restrictions $address_verify_sender_dependent_default_transport_maps $address_verify_sender_dependent_relayhost_maps $address_verify_transport_maps $fallback_transport_maps $lmtp_discard_lhlo_keyword_address_maps $lmtp_pix_workaround_maps $lmtp_sasl_password_maps $lmtp_tls_policy_maps $mailbox_command_maps $mailbox_transport_maps $postscreen_discard_ehlo_keyword_address_maps $rbl_reply_maps $sender_dependent_default_transport_maps $sender_dependent_relayhost_maps $smtp_discard_ehlo_keyword_address_maps $smtp_pix_workaround_maps $smtp_sasl_password_maps $smtp_tls_policy_maps $smtpd_discard_ehlo_keyword_address_maps $smtpd_milter_maps $virtual_gid_maps $virtual_uid_maps
relay_transport = relay
relay_transport_rate_delay = $default_transport_rate_delay
retry_transport_rate_delay = $default_transport_rate_delay
sender_dependent_default_transport_maps =
smtp_transport_rate_delay = $default_transport_rate_delay
transport_maps =
transport_retry_time = 60s
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
virtual_transport_rate_delay = $default_transport_rate_delay
root@dom3-gw:/usr/local/etc/postfix #


root@dom3-gw:/usr/local/etc/postfix # postconf | grep virtual
address_verify_virtual_transport = $virtual_transport
propagate_unmatched_extensions = canonical, virtual
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $sender_bcc_maps $recipient_bcc_maps $smtp_generic_maps $lmtp_generic_maps $alias_maps $smtpd_client_restrictions $smtpd_helo_restrictions $smtpd_sender_restrictions $smtpd_relay_restrictions $smtpd_recipient_restrictions $address_verify_sender_dependent_default_transport_maps $address_verify_sender_dependent_relayhost_maps $address_verify_transport_maps $fallback_transport_maps $lmtp_discard_lhlo_keyword_address_maps $lmtp_pix_workaround_maps $lmtp_sasl_password_maps $lmtp_tls_policy_maps $mailbox_command_maps $mailbox_transport_maps $postscreen_discard_ehlo_keyword_address_maps $rbl_reply_maps $sender_dependent_default_transport_maps $sender_dependent_relayhost_maps $smtp_discard_ehlo_keyword_address_maps $smtp_pix_workaround_maps $smtp_sasl_password_maps $smtp_tls_policy_maps $smtpd_discard_ehlo_keyword_address_maps $smtpd_milter_maps $virtual_gid_maps $virtual_uid_maps
unknown_virtual_alias_reject_code = 550
unknown_virtual_mailbox_reject_code = 550
virtual_alias_address_length_limit = 1000
virtual_alias_domains = $virtual_alias_maps
virtual_alias_expansion_limit = 1000
virtual_alias_maps = $virtual_maps
virtual_alias_recursion_limit = 1000
virtual_delivery_slot_cost = $default_delivery_slot_cost
virtual_delivery_slot_discount = $default_delivery_slot_discount
virtual_delivery_slot_loan = $default_delivery_slot_loan
virtual_delivery_status_filter = $default_delivery_status_filter
virtual_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
virtual_destination_concurrency_limit = $default_destination_concurrency_limit
virtual_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
virtual_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
virtual_destination_rate_delay = $default_destination_rate_delay
virtual_destination_recipient_limit = $default_destination_recipient_limit
virtual_extra_recipient_limit = $default_extra_recipient_limit
virtual_gid_maps =
virtual_initial_destination_concurrency = $initial_destination_concurrency
virtual_mailbox_base =
virtual_mailbox_domains = dom3.domain.ru
virtual_mailbox_limit = 51200000
virtual_mailbox_lock = fcntl, dotlock
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_minimum_delivery_slots = $default_minimum_delivery_slots
virtual_minimum_uid = 100
virtual_recipient_limit = $default_recipient_limit
virtual_recipient_refill_delay = $default_recipient_refill_delay
virtual_recipient_refill_limit = $default_recipient_refill_limit
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
virtual_transport_rate_delay = $default_transport_rate_delay
virtual_uid_maps =
root@dom3-gw:/usr/local/etc/postfix #


root@dom3-gw:/usr/local/etc/postfix # postconf | grep domain
append_dot_mydomain = ${{$compatibility_level} < {1} ? {yes} : {no}}
default_rbl_reply = $rbl_code Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason}
fast_flush_domains = $relay_domains
maps_rbl_domains =
masquerade_domains =
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = dom3.domain.ru
myorigin = $mydomain
parent_domain_matches_subdomains = debug_peer_list,fast_flush_domains,mynetworks,permit_mx_backup_networks,qmqpd_authorized_clients,relay_domains,smtpd_access_maps
relay_domains = $mydestination
relay_domains_reject_code = 554
remote_header_rewrite_domain =
resolve_null_domain = no
resolve_numeric_domain = no
smtpd_sasl_local_domain =
smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/usr/local/etc/postfix/sender_access, reject_non_fqdn_sender, reject_unverified_sender, reject_unknown_sender_domain
strict_mime_encoding_domain = no
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = dom3.domain.ru
root@dom3-gw:/usr/local/etc/postfix #


root@dom3-gw:/usr/local/etc/postfix # postconf | grep relay
address_verify_relay_transport = $relay_transport
address_verify_relayhost = $relayhost
address_verify_sender_dependent_relayhost_maps = $sender_dependent_relayhost_maps
empty_address_relayhost_maps_lookup_key = <>
fast_flush_domains = $relay_domains
lmtp_fallback_relay =
luser_relay =
parent_domain_matches_subdomains = debug_peer_list,fast_flush_domains,mynetworks,permit_mx_backup_networks,qmqpd_authorized_clients,relay_domains,smtpd_access_maps
relay_clientcerts =
relay_delivery_slot_cost = $default_delivery_slot_cost
relay_delivery_slot_discount = $default_delivery_slot_discount
relay_delivery_slot_loan = $default_delivery_slot_loan
relay_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
relay_destination_concurrency_limit = $default_destination_concurrency_limit
relay_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
relay_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
relay_destination_rate_delay = $default_destination_rate_delay
relay_destination_recipient_limit = $default_destination_recipient_limit
relay_domains = $mydestination
relay_domains_reject_code = 554
relay_extra_recipient_limit = $default_extra_recipient_limit
relay_initial_destination_concurrency = $initial_destination_concurrency
relay_minimum_delivery_slots = $default_minimum_delivery_slots
relay_recipient_limit = $default_recipient_limit
relay_recipient_maps =
relay_recipient_refill_delay = $default_recipient_refill_delay
relay_recipient_refill_limit = $default_recipient_refill_limit
relay_transport = relay
relay_transport_rate_delay = $default_transport_rate_delay
relayhost =
sender_dependent_relayhost_maps =
smtp_fallback_relay = $fallback_relay
smtpd_relay_restrictions = ${{$compatibility_level} < {1} ? {} : {permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination}}
unknown_relay_recipient_reject_code = 550
root@dom3-gw:/usr/local/etc/postfix #

попробовал с
relay_domains = dom3.domain.ru
relay_recipient_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf

получил
May 22 22:52:48 be3-gw postfix/relay/smtp[39138]: DE1F76556231: to=<john3@dom3.domain.ru>, relay=none, delay=0.18, delays=0.16/0.01/0.02/0, dsn=5.4.6, status=bounced (mail for dom3.domain.ru loops back to myself)


еще подумал я над вторым "сложным вариантом" с рекурсией

обьект john у которого мы ищем ящик лежит тут
CN=john,OU=Users,OU=DOM3,DC=dom3,DC=corp,DC=local
у него есть атрибут homeMTA c DN CN=Microsoft MTA,CN=DOM3-MSG-01,CN=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=CORP,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=local

у CN=Microsoft MTA есть атрибут mTALocalDesig который имеет значение в чистом виде с именем сервера DOM3-MSG-01
но проблема в том что CN Microsoft MTA находится в другой ветке CN=Configuration,DC=corp,DC=local
поэтому такой запрос не сработает
server_host = ldap://172.16.32.10
search_base = DC=dom3,DC=corp,DC=local
query_filter = (proxyAddresses=smtp:%s)
result_format = smtp:[%s]
special_result_attribute = homeMTA
result_attribute = mTALocalDesig
вывод такой
root@dom3-gw:/usr/local/etc/postfix # postmap -q john3@dom3.domain.ru ldap:/usr/local/etc/postfix/ldap_transport_map.cf
postmap: warning: dict_ldap_get_values[1]: DN CN=Microsoft MTA,CN=DOM3-MSG-01,CN=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=CORP,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=local not found, skipping
postmap: warning: dict_ldap_lookup: Had some trouble with entries returned by search: No such object
root@dom3-gw:/usr/local/etc/postfix #

делаю так
server_host = ldap://172.16.32.10
search_base = DC=corp,DC=local
query_filter = (proxyAddresses=smtp:%s)
result_format = smtp:[%s]
special_result_attribute = homeMTA
result_attribute = mTALocalDesig
вывод такой
root@dom3-gw:/usr/local/etc/postfix # postmap -q john3@dom3.domain.ru ldap:/usr/local/etc/postfix/ldap_transport_map.cf
postmap: warning: dict_ldap_lookup: Search error 10: Referral
postmap: fatal: table ldap:/usr/local/etc/postfix/ldap_transport_map.cf: query error: No error: 0
root@dom3-gw:/usr/local/etc/postfix #

обращаюсь к центральному серверу с глобальным каталогом
server_host = ldap://172.16.10.10
search_base = DC=corp,DC=local
query_filter = (proxyAddresses=smtp:%s)
result_format = smtp:[%s]
special_result_attribute = homeMTA
result_attribute = mTALocalDesig
вывод пустой
root@dom3-gw:/usr/local/etc/postfix # postmap -q john3@dom3.domain.ru ldap:/usr/local/etc/postfix/ldap_transport_map.cf
root@dom3-gw:/usr/local/etc/postfix #

где я ошибся?
« Последнее редактирование: 25 Май 2020, 01:35:11 от JohnRD »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #73 : 25 Май 2020, 05:32:53 »
Простите, что не сразу отвечаю -- дел очень много, даже в выходные =( .

По поводу virtual_transport я посмотрел в документации postfix -- всё-таки это не про транспортировку почты, а про раскладку писем в ящики. За транспортировку в чистом виде отвечает как раз transport_maps, так что всё верно. Поэтому предлагаю сделать так:
transport_maps = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf, hash:/usr/local/etc/postfix/transport

А virtual_transport закомментировать вообще.

По второму вопросу посмотрю чуть позже.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #74 : 26 Май 2020, 02:02:25 »
По вопросу с отсылками (referrals). Теоретически, поисковый запрос LDAP можно заставить автоматически следовать по возвращаемым отсылкам и в настройках LDAP-карт Postfix предусмотрена опция chase_referrals:
chase_referrals = yesНо проблема в том, что переход по отсылкам происходит анонимно, а AD требует аутентификации, поэтому фактически в случае с AD  переход по отсылкам не выполняется.

То есть напрямую средствами Postfix задачу с такой рекурсией в AD решить не удастся. Можно в качестве обходного пути попытаться поднять прокси-каталог на OpenLDAP с бэкендом slapd-meta, который "склеит" AD-шные служебные каталоги в один, и перенаправить Postfix на него. Но стоит ли в данном случае игра свеч?

Егор