Score:0

วิธีเชื่อมต่อพร็อกซี IMAP/POP3 กับเซิร์ฟเวอร์อีเมลส่วนหลังที่เหมาะสมตามโดเมน

ธง ng

ฉันมีระบบที่มีเซิร์ฟเวอร์อีเมลหลายตัว (exchange, zimbra) สำหรับหลายโดเมน ดังนั้นเมื่อผู้ใช้โดเมน A ต้องการเชื่อมต่อกับเซิร์ฟเวอร์เพื่อรับอีเมล พวกเขาต้องใช้ IP ของเซิร์ฟเวอร์ A (เช่น 192.168.10.253) เช่นเดียวกับผู้ใช้โดเมน B พวกเขาต้องใช้ IP ของเซิร์ฟเวอร์ B (เช่น 192.168. 20.253).

ฉันต้องการลดความซับซ้อนของการเชื่อมต่อระหว่างผู้ใช้และเมลเซิร์ฟเวอร์โดยสร้างพร็อกซีเซิร์ฟเวอร์สำหรับการเชื่อมต่อ IMAP/POP3 แต่ฉันไม่พบวิธีแก้ไข มีวิธีอื่นที่ต้องทำหรือไม่ ได้โปรดให้คีย์เวิร์คหรือวิธีแก้ปัญหาที่ดีกว่าแก่ฉัน ขอบคุณมาก.

คำอธิบายรูปภาพสำหรับคำถามของฉัน

Score:0
ธง ng

นี่คือทางออกของฉัน หวังว่ามันจะช่วยได้

นี่เป็นของฉัน สถาปนิกระบบพร็อกซี

นี่คือการกำหนดค่าใน nginx

จดหมาย {
         auth_http localhost:80/ldap_auth.php;
         pop3_capabilities "TOP" "ผู้ใช้";
         imap_capabilities "IMAP4rev1" "UIDPLUS";

        เซิร์ฟเวอร์ {
                ฟัง 110;
                โปรโตคอล pop3;
                pop3_auth ธรรมดา apop cram-md5;
                เปิดพร็อกซี;
        }

        เซิร์ฟเวอร์ {
                ฟัง 143;
                โปรโตคอล imap;
                เปิดพร็อกซี;
        }
}

นี่คือซอร์สโค้ดใน ldap_auth.php

<?php
ถ้า (!isset($_SERVER["HTTP_AUTH_USER"]) || !isset($_SERVER["HTTP_AUTH_PASS"])) {
    ล้มเหลว();
}

$ชื่อผู้ใช้ = $_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($ชื่อผู้ใช้, $userpass)) {
    ล้มเหลว();
    ทางออก;
}

$userserver = getmaildomain($ชื่อผู้ใช้);

$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(ผู้ใช้$);

    $ldapconfig['host'] = '10.0.250.241';
    $ldapconfig['พอร์ต'] = '389';
    $ldapconfig['basen'] = 'ou=' $emailโดเมน ',dc=topdomain,dc=vn';
    $ldapconfig['binduser'] = 'cn=admin,dc=topdomain,dc=vn';
    $ldapconfig['bindpass'] = 'P@ssw0rd';
    $ds = ldap_connect($ldapconfig['host'], $ldapconfig['port']);

    ถ้า (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'])) {
                ถ้า ($search_result = ldap_search($ds, $ldapconfig['basen'], "(|(uid=%U)(sAMAccountName=%U))")) {
                    $entries = ldap_get_entries($ds, $search_result);
                    ถ้า ($ รายการ ['นับ'] == 1) {
                        $dn = $entries[0]['dn'];
                        ถ้า (ldap_bind($ds, $dn, $pass)) {
                            กลับจริง;
                        } อื่น {
                            กลับเป็นเท็จ;
                        }
                    }
                }
            }
        }
    }
    กลับเป็นเท็จ;
}

ฟังก์ชัน getmaildomain($user)
{
    กลับ substr($user, strpos($user, '@') + 1);
}

ฟังก์ชัน getmailuser($user)
{
    กลับ substr($user, 0, strpos($user, '@'));
}

ฟังก์ชั่นล้มเหลว ()
{
    ส่วนหัว ("สถานะการรับรองความถูกต้อง: เข้าสู่ระบบหรือรหัสผ่านไม่ถูกต้อง");
    ทางออก;
}

ฟังก์ชั่นผ่าน ($ เซิร์ฟเวอร์, $ พอร์ต)
{
    ส่วนหัว ("สถานะการรับรองความถูกต้อง: ตกลง");
    ส่วนหัว ("เซิร์ฟเวอร์รับรองความถูกต้อง: $ เซิร์ฟเวอร์");
    ส่วนหัว ("Auth-Port: $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
อนุญาต bind_v2
# กำหนด ACL ส่วนกลางเพื่อปิดการเข้าถึงการอ่านเริ่มต้น

# อย่าเปิดใช้งานการอ้างอิงจนกว่าคุณจะมีไดเร็กทอรีที่ใช้งานได้
#บริการและความเข้าใจของผู้แนะนำ
#ผู้อ้างอิง ldap://root.openldap.org

pidfile /var/run/slapd/slapd.pid
argsfile /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-authzจาก "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-authzจาก "dn.exact:cn=admin,dc=topdomain,dc=vn"

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา