Рейтинг:0

Как проксировать соединение IMAP/POP3 с соответствующим внутренним почтовым сервером по домену

флаг ng

У меня есть система с несколькими почтовыми серверами (обмен, zimbra) для нескольких доменов. Поэтому, когда пользователи домена А хотят подключиться к серверу для получения электронной почты, они должны использовать IP-адрес сервера А (пример: 192.168.10.253), так же, как и пользователь домена Б, они должны использовать IP-адрес сервера Б (пример: 192.168.10.253). 20.253).

Я хочу упростить соединение между пользователями и почтовым сервером, создав прокси-сервер для соединения IMAP/POP3, но я не могу найти решение для этого, есть ли способ это сделать? Пожалуйста, дайте мне ключ или решение для лучшего. Спасибо большое.

Описание изображения для моего вопроса

Рейтинг:0
флаг ng

Это мое решение, надеюсь, оно поможет.

Это мое архитектор прокси-системы

Это конфиг в nginx

почта {
         auth_http localhost:80/ldap_auth.php;
         pop3_capabilities "ВЕРХ" "ПОЛЬЗОВАТЕЛЬ";
         imap_capabilities "IMAP4rev1" "UIDPLUS";

        сервер {
                слушать 110;
                протокол поп3;
                pop3_auth обычный apop cram-md5;
                прокси включен;
        }

        сервер {
                слушать 143;
                имап протокола;
                прокси включен;
        }
}

Это исходный код в ldap_auth.php

<?php
if (!isset($_SERVER["HTTP_AUTH_USER"]) || !isset($_SERVER["HTTP_AUTH_PASS"])) {
    потерпеть поражение();
}

$username = $_SERVER["HTTP_AUTH_USER"];
$userpass = $_SERVER["HTTP_AUTH_PASS"];
$протокол = $_SERVER["HTTP_AUTH_PROTOCOL"];

// внутренний порт по умолчанию
$backend_port = 110;

если ($протокол == "imap") {
    $backend_port = 143;
}

$backend_ip["domain1.com"] = "10.0.250.251";
$backend_ip["domain2.com"] = "10.0.220.140";

// Аутентифицировать пользователя или потерпеть неудачу
если (!authuser($username, $userpass)) {
    потерпеть поражение();
    выход;
}

$userserver = getmaildomain($username);

$server_ip = (isset($backend_ip[$userserver])) ? $backend_ip[$userserver] : $userserver;

// Проходят!
передать($server_ip, $backend_port);

//КОНЕЦ

функция authuser($user, $pass)
{
    $pass = str_replace('%20', ' ', $pass);
    $pass = str_replace('%25', '%', $pass);
    $emailDomain = getmaildomain($user);
    $emailUsername = getmailuser($user);

    $ldapconfig['хост'] = '10.0.250.241';
    $ldapconfig['порт'] = '389';
    $ldapconfig['basedn'] = 'ou=' . $домен электронной почты . ',dc=topdomain,dc=vn';
    $ldapconfig['binduser'] = 'cn=admin,dc=topdomain,dc=vn';
    $ldapconfig['bindpass'] = 'P@ssw0rd';
    $ds = ldap_connect($ldapconfig['хост'], $ldapconfig['порт']);

    если (isset($ds)) {
        ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
        ldap_set_option($ds, LDAP_OPT_NETWORK_TIMEOUT, 10);

        если (isset($user) && isset($pass)) {
            если (ldap_bind($ds, $ldapconfig['binduser'], $ldapconfig['bindpass'])) {
                if ($search_result = ldap_search($ds, $ldapconfig['basedn'], "(|(uid=%U)(sAMAccountName=%U)))")) {
                    $entries = ldap_get_entries($ds, $search_result);
                    если ($entries['count'] == 1) {
                        $dn = $entries[0]['dn'];
                        если (ldap_bind($ds, $dn, $pass)) {
                            вернуть истину;
                        } еще {
                            вернуть ложь;
                        }
                    }
                }
            }
        }
    }
    вернуть ложь;
}

функция getmaildomain($user)
{
    вернуть substr($user, strpos($user, '@') + 1);
}

функция getmailuser($user)
{
    вернуть substr($user, 0, strpos($user, '@'));
}

функция не работает()
{
    header("Статус авторизации: Неверный логин или пароль");
    выход;
}

передача функции ($ сервер, $ порт)
{
    header("Статус авторизации: ОК");
    header("Сервер авторизации: $сервер");
    header("Порт-аутентификации: $port");
    выход;
}

это конфигурация в OpenLDAP Font-end

включить /etc/ldap/schema/core.schema 
включить /etc/ldap/schema/corba.schema 
включить /etc/ldap/schema/cosine.schema 
включить /etc/ldap/schema/duaconf.schema 
включить /etc/ldap/schema/dyngroup.schema
включить /etc/ldap/schema/inetorgperson.schema
включить /etc/ldap/schema/java.schema 
включить /etc/ldap/schema/misc.schema 
включить /etc/ldap/schema/nis.schema 
включить /etc/ldap/schema/openldap.schema 
включить /etc/ldap/schema/collective.schema 
включить /etc/ldap/schema/pmi.schema 
включить /etc/ldap/schema/ppolicy.schema
разрешить привязку_v2
# Определите глобальные ACL, чтобы отключить доступ для чтения по умолчанию.

# Не включайте рефералы до тех пор, пока у вас не будет рабочего каталога
# сервис И понимание рефералов.
#ссылка ldap://root.openldap.org

pid-файл /var/run/slapd/slapd.pid
файл аргументов /var/run/slapd/slapd.args

# Загрузить динамические бэкэнд-модули: 
путь к модулю /usr/lib/ldap 
модуль загрузки rwm.la
загрузка модуля back_meta.la 
загрузка модуля back_ldap.la
лог-уровень -1
            ################################################### ######################
# Определения удаленного сервера LDAP
            ################################################### ######################

#Шрифт
мета базы данных
суффикс "dc=topdomain,dc=vn"
rootdn "cn=admin,dc=topdomain,dc=vn"
rootpw P@ssw0rd

#doamin1.vn — Сервер
uri "ldap://10.0.250.251/ou=domain1.vn,dc=topdomain,dc=vn"
только для чтения нет 
последний мод выключен
suffixmassage "ou=domain1.vn,dc=topdomain,dc=vn" "DC=domain1,DC=vn"
uid атрибута карты sAMAccountName
idassert-bind bindmethod = простой
binddn="CN=ldap,CN=Пользователи,DC=domain1,DC=vn"
учетные данные = "P@ssw0rd"
idassert-authzFrom "dn.exact:cn=admin,dc=topdomain,dc=vn"

#doamin1.vn — Сервер
uri "ldap://10.0.220.45/ou=domain2.vn,dc=topdomain,dc=vn"
только для чтения нет 
последний мод выключен
suffixmassage "ou=domain2.vn,dc=topdomain,dc=vn" "DC=domain2,DC=vn"
uid атрибута карты sAMAccountName
idassert-bind bindmethod = простой
binddn="CN=Администратор LDAP,CN=Пользователи,DC=domain2,DC=vn"
учетные данные = "P@ssw0rd"
idassert-authzFrom "dn.exact:cn=admin,dc=topdomain,dc=vn"

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.