The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Проверка существования email в AD (..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Проверка существования email в AD (..."  +/
Сообщение от auto_tips (??) on 09-Ноя-09, 09:22 
У нас в компании используется сервер Exchange для обмена почтовыми сообщениями. Но для отправки сообщений во "вне" используем Communigate Pro.
Communigate (CGP for Linux) используется только как прослойка и письма отправленные на известные домены пересылаются на  Exchange.

схема

   Internet
      |
      |
   Communigate Pro
      |
      |
   Exchange
      |
      |
   Users

Но если просмотреть логи, то можно увидеть, что есть огромные очереди на адреса, которых не существует и соответственно куча DNR.
Значит нужно как-то отсеивать эти настырные подключения.

Пришел к выводу, что можно сделать External Authentication + скрипт на perl + запретить пересылку писем на exchange (это будет делать скрипт)

Что было сделано.

1. На communigate включил External Authentication (В helpers) с параметрами:

   Program Path: /var/CommuniGate/adrelay.pl
   Time-out: 20s
   Auto-Restart: 30s

Не забыть поставить галку External Authentication

2. Так же на communigate в разделе Users - Domain Defaults - Unknown Names:

   Consult External for Unknown: Yes
   Mail to Unknown: Rejected

Теперь напишем скрипт в /var/CommuniGate/adrelay.pl
  
   #!/usr/bin/perl
   use Net::LDAP;
   my  $searchBase = 'dc=DOMAIN,dc=local';
   my @ldap_servers=(
   { address=>'XXX.XXX.XXX.XXX',     # the address or IP of LDAP server
     port=>389,                # LDAP port, 389 by default
     timeout=>5,               # timeout in seconds, 20 by default
     adminDN=>'LDAPUSER@DOMAIN.local',  # the DN for admin bind
     adminPassword=>'Password', # the DN PASSWORD for admin bind
   },
   { address=>'XXX.XXX.XXX.XXX',     # the address or IP of LDAP    server2
     port=>389,                # LDAP port, 389 by default
     timeout=>5,               # timeout in seconds, 20 by default
     adminDN=>'LDAPUSER@DOMAIN.local',  # the DN for admin bind
     adminPassword=>'Password', # the DN PASSWORD for admin bind
   },
   { address=>'XXX.XXX.XXX.XXX',     # the address or IP of LDAP  server3
     port=>389,                # LDAP port, 389 by default
     timeout=>5,               # timeout in seconds, 20 by default
     adminDN=>'LDAPUSER@DOMAIN.local',  # the DN for admin bind
     adminPassword=>'Password', # the DN PASSWORD for admin bind
   },
   );

   $| = 1;
   print "* MegaScript started\n";
   my ($ldapServerID,$ldapServerTried)=(0,0);
   while(<STDIN>) {
     chomp;    # remove \n from the end of line
     my ($prefix,$method,@eargs) = split(/ /);
     if($method eq 'NEW') {
       unless($prefix && $method && $eargs[0]) {
         print "$prefix ERROR Expected: nnn NEW user\@domain\n";
       } else {
         my $errorMsg=new_command($prefix,$eargs[0]);
  
       if(defined $errorMsg) {
         print "$prefix ERROR $errorMsg\n";
       }
     }
   }
   elsif ($method eq 'INTF' ) {
       if($eargs[0] < 3) {
         print "* This script requires CGPro version 4.1b7 or newer\n";
         exit;
       }

         exit;
       }
       print "$prefix INTF 3\n";
     }
     elsif($method eq 'QUIT') {
       print "$prefix OK\n";
       last;
     } else {
       print "$prefix ERROR Only NEW, INTF and QUIT commands  supported\n";
     }
   }
   print "* Megascript done\n";
   exit(0);
  
   sub tryConnectServer {
     my $theServer=$ldap_servers[$ldapServerID];
     print "* trying to connect to $theServer->{address}\n";
     my $ldap = Net::LDAP->new($theServer->{address},port=>($theServer->{port} || 389),timeout=>($theServer->{timeout} || 20) )
      || return undef;
     return $ldap;
   }
  sub tryConnect {
     my $nServers=scalar(@ldap_servers);
     for(my $nTried=0;$nTried<$nServers;$nTried++) {
       if($ldapServerID>=$nServers) { $ldapServerID=0;}
       my $ldap=tryConnectServer();
       return $ldap if($ldap);
       ++$ldapServerID;
     }
     return undef;
   }

   sub new_command {
     my ($prefix,$user)=@_;
     my ($name,$domain)=("","");
     if($user =~ /(.+)\@(.+)/) {
       $name=$1;
       $domain=$2;
     } else {
       return "Full account name with \@ and domain part expected";
     }
     my $ldap = tryConnect();
     unless($ldap) {
       return "Failed to connect to all LDAP servers";
     }
     my $adminDN=$ldap_servers[$ldapServerID]->{adminDN};
     my $adminPassword=$ldap_servers[$ldapServerID]->{adminPassword};
     my $result=$ldap->bind($adminDN,password=>$adminPassword)
       || return "Can't bind as admin: ".$result->error;
     $result->code && return "Can't bind as admin: ".$result->error;
    
  
        my $mesg = $ldap->search (  # perform a search
                base   => $searchBase,
                scope  => "subtree",
                filter => "(&(proxyAddresses=smtp:$name\@$domain) (objectclass=*))"
        );

     $ldap->unbind();  
     unless(defined $mesg) {
       return "LDAP search failed";
     }
     if($mesg->all_entries() eq 0) {
       return "address $name\@$domain NOT exists";
     } else {
       print "$prefix ROUTED $name\%$domain\@[IPEXCHANGE]\n";  
       # Pomenyai IPEXCHANGE!!!!!!!!!!!!
       return undef;
     }
  };


Что делает скрипт.
При получении адреса e-mail в RCPT TO ищет его в AD в атрибутах пользователей. Если не находит, то сообщение игнорируется.

Проверить работоспособность скрипта можно запустив его и набрать 1 NEW email@domain.ru
Если выдаст ROUTED email%domain.ru@IPEXCHANGE - то значит все ОК!!!


URL:
Обсуждается: http://www.opennet.ru/tips/info/2218.shtml

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от klame (??) on 09-Ноя-09, 09:22 
Я у себя сделал немного по-другому: чтобы не делать тысячи обращений в час к AD на проверку существования пользователей, запускаю скрипт, который делает поиск всех адресов почты ао AD и пишет их в файл, а почтовый сервер(у меня postfix) смотрит адреса по локальному файлу.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Sadok email(??) on 09-Ноя-09, 09:51 
Аналогично. По крону раз в 10 минут запускаю.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Аноним (??) on 10-Ноя-09, 08:33 
А нельзя разве сразу в AD postfix'ом смотреть адреса? У него же есть поддержка карт ldap
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от 2dfx email(ok) on 09-Ноя-09, 12:03 
Я думал о файле, но у нас достаточно много человек и большая ротация персонала. Данный скрипт позволит следить за изменениями в режиме реального времени.

Это уже V2. До этого была возможность подключения только к одному контроллеру домена. И если происходила ошибка, то почта переставала ходить. Здесь же можно увеличивать число контроллеров домена до бесконечности.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Sadok email(??) on 09-Ноя-09, 12:06 
>Я думал о файле, но у нас достаточно много человек и большая
>ротация персонала.

Что раз в 30 минут сотрудники увольняются/принимаются?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Руслан1 on 09-Ноя-09, 15:18 
Я бы сделал вебмордочку для сотрудницы отдела кадров, чтобы она сама блокировала учетку. При блокировке, будет перегенерироваться файл для проверки почтовиком.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от HFSC (??) on 09-Ноя-09, 16:37 
в exim это на уровне acl делается, без всяких скриптов
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Проверка существования email в AD (ldap) для маршрутизации п"  +/
Сообщение от ALex_hha (??) on 09-Ноя-09, 23:13 
В postfix тоже, с помощью карт просмотра ldap :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от фноним on 10-Ноя-09, 11:29 
Ура велосипедистам

использовать exchange только для писем это пипец

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Ананимус on 10-Ноя-09, 13:51 
А для чего же ще ентот ексченж использовать?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от xasm (??) on 10-Ноя-09, 14:53 
нуда   нуда
а патом еще говорят что венда отстой)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Александр (??) on 11-Ноя-09, 10:24 
Все же непонятно, зачем гонять платный CGP, чтобы обеспечивать проксирование для платного же MS Exchange? При том, что первый конкурирует со вторым :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Skif (ok) on 11-Ноя-09, 22:11 
>Все же непонятно, зачем гонять платный CGP, чтобы обеспечивать проксирование для платного
>же MS Exchange? При том, что первый конкурирует со вторым :)
>

По воду первого не скажу - это к автору, но могу предположить - внешний фильтр и SMTP-прокси, а вот Exchange при всём вашем сарказме для многих организаций самое оно. Почтовик как таковой сейчас уж слишком "бедное" решение. Нужны и общие календари и папки, и планировщики, и интеграция с другими сервисами в сети, это в конце концов удобная работа с коммуникаторами и единый почтовый клиент.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Touch (??) on 12-Ноя-09, 12:24 
Дело в том что всё что вы описали CommuniGate умеет сам по-себе :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "Проверка существования email в AD (ldap) для маршрутизации п..."  +/
Сообщение от Skif (ok) on 12-Ноя-09, 14:03 
>Дело в том что всё что вы описали CommuniGate умеет сам по-себе
>:)

Вопрос в формате и интегрированности. Exchange это интегрированный продукт, который чудесно встраивается и расширяет функционал других приложений MS, впрочем это тема не для этого форума. Опять таки возращаясь к почтовым клиентам и доступу с моб. устройств - комунигейту далековато в этом плане до MS - мое личное мнение.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру