tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

Gmail ja Postfix: ilmainen lähtevän sähköpostin SMTP-palvelin (mail relay)

Virtuaaliserverien suurin ongelma on sähköposti. Saapuvalle postille on keksittävä joku muu kuin paikallinen ratkaisu, koska oma IMAP/POP3-palvelin ei useimmiten ole mahdollinen. Ulkoisia saapuvan sähköpostin vaihtoehtoja on kourallinen, Gmail on varmasti tunnetuin ja ilmainen, mutta Amazon SES yhdessä WorkMailin kanssa on harkitsemisen arvoinen vaihtoehto. Lähtevällä postille on enemmän vaihtoehtoja, mutta nekin ovat kaikki ulkoisia. Silloin virtuaalipalvelimella Postfix vain välittää lähtevän sähköpostin portin 587 kautta varsinaiselle SMTP-palvelimelle eli kyseessä on rele (mail relay). Pelkälle lähtevälle emailille voi käyttää esimerkiksi Mailgunia tai vielä parempaa Amazon SES:iä, mutta kumpikin on maksullinen. Jos 500 lähtevän sähköpostin raja 24 tunnin aikajaksossa ei ole ongelma, ja haluaa ilmaisen, niin silloin kannattaa naittaa Postfix ja Gmail yhteen.

Säädetään Postfix Ubuntuun DigitalOceanin VPS:ssä, jota he kutsuvat dropletiksi. Teen kaiken rootina, joten jos olet SSH:ssa omalla tunnuksellasi, niin muista sudo tai su.

Postfixin asennus

Aloitetaan pakettilistan ja järjestelmän päivityksellä.

apt update
apt dist-upgrade

Asetetaan muutamat arvot etukäteen, niin saadaan nopeampi ja helpompi asennus.

  • Kerrotaan, että Postfix toimii releenä:
debconf-set-selections <<< "postfix postfix/main_mailer_type select Satellite system"
  • Kerrotaan Postifixille, että serverin hostname on myös mailiserverin hostname:
debconf-set-selections <<< "postfix postfix/mailname string $HOSTNAME"
  • Käsketään Postfix käyttämään välitettäviin posteihin Gmailia.
debconf-set-selections <<< "postfix postfix/relayhost string smtp.gmail.com"
  • Asennetaan Postfix:
apt -y install postfix
  • Oletko jo aiemmin asentanut Postfixin? Siinä tapauksessa pääset asetuksiin tällä:
dpkg-reconfigure postfix
  • Kerrotaan Postfixille Gmailin käyttäjätunnus ja salasana. Avataan kirjautumistiedot sisältävä tiedosto:
nano /etc/postfix/sasl_passwd
  • Laita tiedostoon muodossa SMTP-palvelin tunnus:salasana:
[smtp.gmail.com]:587 osotteesi@gmail.com:gmail-salasanasi
  • Tiedosto sasl_passwd on selkokielinen tiedosto, joten turvataan se varmistamalla, että omistajuus on root-tunnuksella:
chown root:root /etc/postfix/sasl_passwd
  • Laitetaan luku- ja kirjoitusoikeudet vain root-tunnukselle:
chmod 600 /etc/postfix/sasl_passwd
  • Käsketään Postfixiä käyttämään uusia kirjautumistietoja:
postmap /etc/postfix/sasl_passwd
  • Estetään anonyymien kirjautuminen ja kiristetään turvallisuutta:
nano /etc/postfix/main.cf

Lisää tämä main.cf-tiedoston loppuun:

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/postfix/cacert.pem
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offer = yes
  • Tarkista löydätkö rivin -o smtp_fallback_relay=
    Jos et löydä, niin kaikki on hyvin. Jos löydät, niin kommentoi se laittamalla # rivin alkuun
  • Tehdään hash tunnus/salasanaparista:
postmap hash:/etc/postfix/sasl_passwd
  • Tehdään simppeli SSL-sertifikaatti maililiikennettä varten
cat /etc/ssl/certs/thawte_Primary_Root_CA.pem | sudo tee -a /etc/postfix/cacert.pem
  • Käynnistetään Postfix:
systemctl start postfix
  • Tai käynnistetään se uudelleen, jos se on jo käynnissä:
systemctl restart postfix

Jos sinulla on host-nimi sama kuin FQDN, niin sinun ei tarvitse tehdä tätä vaihetta. Minulla host on pro, joka ei ole FQDN, joten joudun tekemään asian, jonka nimi on domain mapping. Yksinkertaistettuna kerron, että osoite root@pro (tai mikä tunnus lähettäjä onkaan) näkyy lähettäjän osoitteena server@katiska.info. Jos olet DigitalOceanin asiakas, niin host on sama kuin asettamasi dropletin nimi ja jos haluat vaihtaa sen, niin joudut muuttamaan hallinnassa dropletin nimeä.

  • Luodaan mapping-tiedosto:
nano /etc/postfix/generic

Lisää sinne tarvittavat osoitteet. Voit laittaa useamman eri riveille, jos sinulla on tarvetta, kuten että asennat useamman alidomainen kerralla. Ns. aidon lähettäjän nimiosa ennen @-merkkiä saa olla ihan mitä tahansa. Minä lisään tämän, mutta muuta se sinulle sopivaksi:

root@pro server@katiska.info
  • Kerrotaan ”uudelleenohjaus” Postfixille:
postmap /etc/postfix/generic
  • Se täytyy kertoa myös Postfixin konfiguraatiotiedostossa:
nano /etc/postfix/main.cf

Lisää tämä tiedoston loppuun:

smtp_generic_maps = hash:/etc/postfix/generic
  • Ja taas täytyy käynnistää Postfix uudestaan:
systemctl restart postfix
  • Avataan palomuuriin portti sähköpostiliikennettä varten:
ufw allow 587

Testaus

Asennetaan ensin mahdollisuus lähettää sähköpostia komentoriviltä:

apt -y install mailutils

Lähtetään yksinkertainen testimaili:

mail -s "Hei, olen otsikko" joku-oikea-mailiosoitteesi <<< "Minä olen testi"

Jos sähköposti saapui perille, niin kaikki on hyvin ja järjestelmäsi osaa lähettää Gmailin kautta. Jos ei mitään kuulu, niin sitten alkaa virheiden selvittäminen.

Tarkista ensimmäiseksi, että sinulla ei ole kirjoitusvirheitä missään. Tarkista myös, että main.cf -tiedostossa on rivi relayhost = [smtp.gmail.com]:587. Vilkaise virhelogit, josko niistä löytyisi jotain vinkkiä.

Tämä avaa mailin login:

tail /var/log/mail.log

Tällä saat etsittyä järjestelmän logista Postfixiin liittyvät:

tail -f -n 50 /var/log/syslog | grep postfix

Voit tarkistaa, että onko sähköposti bouncannut takaisin järjestelmän laatikkoon:

less /var/mail/$(whoami)
  • shift-g (eli iso G) skrollaa aivan alas
  • q päästää pois

Postfix: status=bounced (unknown user: “user”)

Osassa tapauksissa sähköpostin lähettäminen ei onnistu osoitteeseen, joka on samalla domainilla kuin lähettävä. Eli jos kokeilen lähettää domainista eksis.one osoitteeseen jakke.lehtonen@eksis.one, niin saan bouncen tuntemattoman käyttäjän takia. Postfix yrittää olla fiksu ja kun se haistaa, että ollaan samassa domainissa, niin se ei käytäkään ulkoista SMTP-serveriä – vaikka on käsketty. Ja koska systeemissä ei ole käyttäjää jakke.lehtonen, niin tulee bounce.

Tuo taitaa kiusata niitä servereitä, joissa hostname on asetettu samaksi kuin domain. Silloin nopein tapa korjata on vaihtaa host-nimi (sen ei muutenkaan kuuluisi olla domain; se usein laitetaan vain sen takia domainiksi, että saadaan kauniimman informatiivinen alku SSH:n kehoitteeseen).

Voit myös kokeilla tätä.

nano /etc/postfix/main.cf

Muuta nämä kohdat tällaisiksi:

  • myhostname = localhost
  • $myhostname, localhost.$mydomain, localhost, $mydomain

Se pakottaa Postfixin käyttämään aian ulkoista palvelua.

Käynnistä Postfix uudelleen:

systemctl restart postfix

Connect ja disconnect koko ajan

Saatat löytää mail.log tiedostosta vastaavan tapaiset rivit toistumassa uudelleen ja uudelleen tasaisin väliajoin. Silti sähköpostit liikkuvat normaalisti ja lähetys näkyy logissa kuten kuuluukin:


Apr 22 16:27:38 backend postfix/smtpd[11535]: connect from localhost[127.0.0.1]
Apr 22 16:27:38 backend postfix/smtpd[11535]: disconnect from localhost[127.0.0.1] ehlo=1 quit=1 commands=2

Tuo ei ole virhe, vaan ilmoitus siitä, että jokin ohjelma käynnistää Postfixin localhostissa ja sammuttaa yhteyden samantien tekemättä mitään. Yleensä kyse on jonkin valvontaohjelman, kuten Monitin, pingi. Siinä ainoastaan tarkastetaan, että postipalvelin on pystyssä ja toimii.

Itselläni tuo tuli Monitin toimesta kerran minuutissa ja siitä ei ole sinällään mitään haittaa. Kyse on aivan samasta kuin että websivustoa pingataan, että tiedetään sen olevan toiminnassa. Ongelmanpoikasta on siinä, että se  täyttää login ja jos joutuu penkomaan jotain oikeaa virhetilannetta, niin halutun tiedon löytäminen voi olla tuskaa.

Monitin kanssa ongelman aiheutti tämä rivi postfixin seuranta-asetuksissa:

if failed host localhost port 25 with protocol smtp for 2 times within 3 cycles then restart

Koska virtuaaliserverillä ei ole mitään mieltä seurata porttia 25, joka on suurimmassa osassa, ellei kaikissa, suljettu, niin muutin sen selvittämään relay host osoitetta portin 587 kautta:


if failed host email-smtp.eu-west-1.amazonaws.com port 587
type tcp protocol smtp using tls
with timeout 15 seconds
then alert

Nyt testit eivät enää ilmaannu logiin.