Labada hab ee isku xirka waxay sidan yihiin isla fariinta isla akoonka relay, farqiguna waa halka TLS ka bilaabmo, ma aha waxa la diro. Mid waxa uu ku furmaa qoraal cad oo ku korodha gudaha xidhiidhka; kan kalena waa la sireeyay laga bilaabo byte-ka koowaad. Farqiqaas keliya ayaa go'aamiya waxa siyaasadda relay adag ay aqbali doonto, waxa qalabka dhexe uu arki karo, iyo fariinta khaladka ee aad galab dhan akhrin doonto. Halkan waxaa ah sida aan u dhex doorto labadooda marka barnaamij ku jira shabakad gaar ah fariin u dhiibo adeeg diris gudaha ah.

Halka labada hab ay dhab ahaan ku kala duwan yihiin

Hawshu waa isku mid labada xaaladood: isa-sheegid akoon la ansixiyay, magacaabin diraha la oggolaaday, liis garayn qaatayaasha, iyo sugitaanka in relay-ga uu qaato mas'uuliyadda. Waxa is beddela waa nidaamka hawlaha. Dekedda 587 waxay ku bilaabataa sidii fadhi SMTP oo qoraal cad, waxay ku dhawaaqdaa STARTTLS jawaabta EHLO, oo waxa la kordhiyaa kaliya haddii macmiilku codsado. Dekedda 465 waxay filanaysaa gacanqaadis TLS ka hor inta aan la odhan wax amarka SMTP ah.

Diris iyo relay waa hawlo kala duwan, sidaas darteed lambarrada dekeduhu ma aha caadooyin la isweydaarsan karo. RFC 6409 wuxuu ku sharraxay dirista fariimaha adeeg u gaar ah, RFC 8314-na wuxuu daboolayaa nooca TLS qarsoodiga ah ee relay-yada casriga ah intooda badan ay bixiyaan 465. Haddii relay-gaagu dokumenteeyo mid ka mid ah labada, dukumeentigaas wuxuu ka sarreeyaa doorbid kasta oo aad ka heshay shaqo-hayn hore.

Waxa STARTTLS 587 kuu siinayo

Kor-u-qaadistu waxay ku dhacdaa gudaha wada-hadalka SMTP, sidaas darteed relay-gu wuu ku dhawaaqi karaa, macmiilkuna wuu diidi karaa inuu sii socdo isaga la'aan. Python gudaha, starttls() wuxuu tuurayaa ka-reebitaan marka server-ku aanu soo bandhigin fidintaas, taas oo isku dayga hoos-u-dhigista u beddelaysa guuldarro muuqata halkii gelitaan qoraal cad oo aamusan. Dhaqankaas ayaa ah doodda ugu weyn ee habkan, waana mudan in si ula kac ah lagu tiirsanaado, ma aha si shil ah.

Daqadda soo-gaadhista waa yar tahay laakiin waa dhab: is-dhaafsiga EHLO bilowga ah waa la akhrin karaa, waxnana ka hor kor-u-qaadista ma qaado aqoonsi. Jid gaar ah oo u dhexeeya subnetwork-ka barnaamijka iyo relay gudaha ah, daqaddaas badanaa waa la aqbali karaa. Jid aadan maamulin, taas ayaa sababta kooxaha qaarkood ay ku adkaystaan habka kale.

Qalabka dhex-gelista ee meesha ka saara awoodda STARTTLS wuxuu soo saaraa diris guuldarraysatay, ma aha dib-u-noqosho. Taas ayaa ah natiijada aad rabto, waana habka ugu dhaqsiyaha badan ee lagu ogaado in wax ku qorayo SMTP jidka.

Waxa TLS qarsoodiga ah 465 beddelo

Ma jiro gabi ahaan marxalad qoraal cad. Macmiilku wuxuu sameeyaa gacanqaadis TLS isla markii socket-ku furmo, wuxuu ku xaqiijiyaa shahaadada bakhaarkiisa aamin, kadibna wuxuu is-dhaafsadaa EHLO, AUTH iyo fariinta. Waxba ma hoos-u-dhigi karaan fadhiga sababtoo ah ma jiro xaalad qoraal cad oo laga wada xaajoodo, taasna waxay meesha ka saartaa fasal dhan oo guuldarrooyin dhex-gelin ah.

Is-dhaafsigu waa awoodda ogaanshaha cudurka. Relay ka jawaaba 465 isagoo isticmaalaya SMTP qoraal cad, ama dheellitirka culeyska ee dhameeya TLS magac shahaado khaldan, wuu ku guuldarraystaa gacanqaadista wuxuuna ku siiyaa khalad SSL halkii khalad boosto. Marka taas dhacdo, dhibaatadu waxay ka hoosaysaa barnaamijka, waxna ma sameeyaan dhismaha fariinta.

Hal shaqo diris, laba gaadiid

Koodhku aad buu ugu yar yahay farqiqa u dhexeeya hababka, sidaas darteed doorashadu waa inay ka timaaddo siyaasadda relay-ga ee ma aha raaxada maktabadda. Marka hore dhoofi dejinta, kadibna socodsii hal script oo doorta gaadiidka dekedda la habeeyay.

export SMTP_HOST=smtp.relay.internal
export SMTP_PORT=587
export SMTP_USER=svc-notify
export [email protected]
export [email protected]
export SMTP_PASSWORD="$(cat /run/secrets/smtp_password)"
import os, smtplib, ssl
from email.message import EmailMessage

ctx = ssl.create_default_context()
msg = EmailMessage()
msg["From"] = os.environ["MAIL_FROM"]
msg["To"] = os.environ["MAIL_TEST_TO"]
msg["Subject"] = "relay submission test"
msg.set_content("One authorized test message from the app.")

host = os.environ["SMTP_HOST"]
port = int(os.environ.get("SMTP_PORT", "587"))

if port == 465:
    client = smtplib.SMTP_SSL(host, port, context=ctx, timeout=15)
else:
    client = smtplib.SMTP(host, port, timeout=15)
    client.ehlo()
    client.starttls(context=ctx)
    client.ehlo()

with client:
    client.login(os.environ["SMTP_USER"], os.environ["SMTP_PASSWORD"])
    refused = client.send_message(msg)

print("refused:", refused)

create_default_context() wuxuu xaqiijiyaa silsiladda iyo magaca martigeliyaha, sidaas darteed CA gaar ah waa in lagu rakibo bakhaarka aaminaadda halkii lagaga gudbi lahaa macnaha aan la xaqiijin. send_message() wuxuu soo celiyaa qaamuuska qaatayaasha ay relay-gu diiday; qaamuus madhan waxay ka dhigan tahay inuu aqbalay dhammaantood. Waqtiga shan iyo toban ilbiriqsi waa bar bilaash ah, ma aha qiime loo habeeyay shabakaddaada.

Ka fogee password-ka sawirka iyo diiwaannada. Sir lagu rakibay waqtiga socodka oo lagu akhriyay deegaanka waa hagaagsan yahay; in deegaanka lagu celiyo sadarka diiwaanka ma aha hagaagsan, iyo raadka debug ee is-dhaafsiga AUTH sidoo kale ma aha.

Dooro siyaasadda relay-ga iyo jidka, ma aha caadada

Sadex shuruudood ayaa go'aamiya. Marka hore, waxa relay-gu dhab ahaan ku dhawaaqo: adeeg kaliya ku dhageysta 587 isagoo wata STARTTLS lama gaari karo 465, si kasta oo aad u doorbidid TLS qarsoodiga ah. Marka labaad, haddii jidka u dhexeeya barnaamijka iyo relay-gu uu riixasho ku filan yahay inuu aqbalo is-dhaafsi EHLO la akhrin karo. Marka saddexaad, haddii wax dhexda ku qoraya ama proxy ka sameeya SMTP, sababtoo ah taas ayaa go'aamisa haddii khatarta hoos-u-dhigistu tahay mid aragti ama dhab ah.

Marka relay-gu bixiyo labadaba, waxaan qaataa 465 adeeg ku shaqeeya kormeer la'aan iyo 587 adeeg uu qof daawanayo hirgelinta koowaad, kaliya sababtoo ah fariimaha guuldarradu waxay tilmaamaan lakabyo kala duwan. Doorbidkaas waa kayga mana aha siyaasad.

Wax kasta oo aad dooratid, diiwaangeli dekedda, maaddada aaminaadda iyo domain-ka diraha oo ay la socoto hirgelinta. Kadib dir hal fariin tijaabo ah oo la oggolaaday oo xaqiiji in relay-gu aqbalay, adigoo natiijada dirista iyo warbixin kasta oo keenid dambe ah u haysta sidii diiwaanno gaar ah. Gudbinta guulaysatay ee relay-ga waa dhammaadka mas'uuliyadda barnaamijka, ma aha caddaynta in fariintu gaartay sanduuqa soo-gelinta.

Maqaallo la xiriira