Testování služeb mailserveru telnetem

Článek vyšel 9.1. na serveru abclinuxu.cz.

Při instalaci služeb zajišťujících běh (nejen) poštovního serveru se často setkáte s potřebou snadné kontroly funkčnosti služby pomocí jednoduchého programu. Možnost ručně si zadat příkazy a sledovat při tom odezvu systému je většinou neocenitelná. V článku vám ukážu jak snadno testovat služby POP3, IMAP, SMTP a jejich varianty zabalené do SSL.

Použité nástroje

Pro otestování použijeme běžné nástroje dostupné snad v každé "normální" distribuci linuxu a to programy telnet a openssl. Telnet nám poslouží pro připojení na POP3, IMAP a SMTP server. Openssl využijeme pro ověření funkčnosti POP3s, IMAPs a SMTPs.

Jako SMTP server používám postfix, o POP3 a IMAP se stará dovecot. Výpisy zde uvedené se můžou mírně lišit podle toho jaké programy použijete.

Telnet

Program telnet je dostupný v Linuxu (a UNIXech) i v MS Windows, umožňuje interaktivní TCP spojení na server. Spouští se z příkazového řádku:

$ telnet SERVER PORT

SERVER můžete zapsat pomocí doménového jména nebo IP adresy. PORT je číslo TCP portu a lze ho zapsat buď jako číslo nebo jako textový název, který je danému číslu portu přiřazen v souboru /etc/services.

Program telnet (a navázané spojení) ukončíte pomocí stisku kombinace kláves ^] a ^d.

[tsunami@vodik]$ telnet tsunami.locnet pop3
Trying 192.168.0.10...
Connected to tsunami.locnet.
Escape character is '^]'.
+OK Dovecot ready.
^]
telnet> Connection closed.

Pokud má někdo odpor k aplikacím spouštěným z příkazového řádku, může použít například grafický program PuTTY (Linux, Windows), ale dle mého názoru je to zbytečné.

SMTP

SMTP protokol je relativně jednoduchý protokol založený na textové komunikaci, používá TCP port 25. Původní popis protokolu najdete v RFC821 (z r. 1982), aktualizovaný popis najdete v RFC2821 (z r. 2001). Pro kompletní popis protokolu tu není místo proto zde uvedu praktickou ukázku toho jak se přes telnet pošle email. Všechny tučně zapsané řádky jsou zaslané klientem (mnou naťukané do klávesnice).

Připojíme se telnetem na server na port 25 a počkáme si na odpověď od serveru.

[tsunami@vodik]$ telnet tsunami.locnet 25
Trying 192.168.0.10...
Connected to tsunami.locnet.
Escape character is '^]'.
220 tsunami ESMTP Postfix (Debian/GNU)

Nejprve se identifikujeme

EHLO vodik.locnet
250-tsunami
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250 8BITMIME

Uvedeme od koho email pochází

MAIL FROM: od.koho.ten@email.je
250 Ok

a komu ho zasíláme

RCPT TO: tsunami@tsunami.locnet
250 Ok

no a potom můžeme začít psát vlastní zprávu, psaní ukončíme pomocí tečky na samostatném řádku a “odentrování”.

DATA
354 End data with <CR><LF>.<CR><LF>
Subject: pozdrav od anonyma

Ahoj, jak se mas?
.
250 Ok: queued as 0AA3929FAA

Email byl zařazen do fronty a my můžeme ukončit svou práci:

QUIT
221 Bye

Jak vidíte, docela jednoduše můžete zasílat emaily i když nemáte vhodného emailovéh klienta jako je mozilla nebo outlook 🙂

POP3

Protokol pop3 slouží ke stažení pošty ze serveru ke klientovi. POP3 přístup k poště je vhodný pokud potřebujete rozumný přístup k poště přes pomalou linku případně nemůžete/nechcete uchovávat všechnu poštu na serveru. Pop3 je většinou dostupný na portu 110/tcp, je popsán v RFC1939, RFC2449 a RFC1734.

Připojíme se k serveru

[tsunami@vodik]$ telnet tsunami.locnet 110
Trying 192.168.0.10...
Connected to tsunami.locnet.
Escape character is '^]'.
+OK Dovecot ready.

Přihlásíme se jako uživatel k serveru

USER tsunami
+OK
PASS heslo
+OK Logged in.

Příkazem STAT můžeme zjisit počet zpráv a jejich velikost případně si je příkazem LIST vypíšeme.

STAT
+OK 3 1619
LIST
+OK 3 messages:
1 433
2 486
3 700
.

Rozhodl jsem se stáhnout zprávu číslo 2

RETR 2
+OK 486 octets
Return-Path: <od.koho.ten@email.je>
X-Original-To: tsunami@tsunami.locnet
Delivered-To: tsunami@tsunami.locnet
Received: from vodik.locnet (vodik [192.168.0.13])
        by tsunami (Postfix) with ESMTP id 0AA3929FAA
        for <tsunami@tsunami.locnet>; Sat,  7 Jan 2006 23:36:40 +0100 (CET)
Subject: pozdrav od anonyma
Message-Id: <20060107223653.0AA3929FAA@tsunami>
Date: Sat,  7 Jan 2006 23:36:40 +0100 (CET)
From: od.koho.ten@email.je
To: undisclosed-recipients:;

Ahoj, jak se mas?
.

Stažený email označím ke smazání

DELE 2
+OK Marked to be deleted.

Ukončení spojení zároveň znamená i smazání označených zpráv

QUIT
+OK Logging out, messages deleted.

IMAP

Další protokol, kterým se dostaneme ke své poště na serveru se jmenuje IMAP (Internet Message Access Protocol, aktuálně ve verzi 4v1). Protokol je složitější než POP3 a umožňuje o mnoho víc funkcí. První rozdíl, kterého si všimnete je, že pošta se nechává na serveru. Protokol je také navržen pro současné připojení více klientů k jednomu mailboxu. IMAP funguje přes TCP port 143. Protokol IMAP je popsán v RFC3501, zajímavé informace k IMAPu najdete také na webu www.imap.org

Připojíme se na server a přihlásíme se jako uživatel

[tsunami@vodik]$ telnet tsunami.locnet 143
Trying 192.168.0.10...
Connected to tsunami.locnet.
Escape character is '^]'.
* OK Dovecot ready.
. LOGIN tsunami heslo
. OK Logged in.

Každý příkaz musí být uveden unikátním idenitfikátorem v rámci daného sezení. Vypíšeme si co nám server nabízí za funkce s tím.

IDENT01 CAPABILITY
* CAPABILITY IMAP4rev1 SORT THREAD=REFERENCES MULTIAPPEND
UNSELECT LITERAL+ IDLE CHILDREN NAMESPACE LOGIN-REFERRALS
IDENT01 OK Capability completed.

Pro další ukázky raději použiju kratší identifikátory. Zkusíme si vypsat dostupné složky.

id01 LIST "" "*"
* LIST (\NoInferiors \UnMarked) "/" "Trash"
* LIST (\NoInferiors) "/" "Pracovni"
* LIST (\NoInferiors \UnMarked) "/" "Soukrome"
* LIST (\NoInferiors) "/" "Linux"
* LIST (\NoInferiors) "/" "Solaris"
* LIST (\NoInferiors) "/" "INBOX"
id01 OK List completed.

Z předchozího výpisu jsme zjistili, že na serveru existuje několik složek. “Přepneme” se do složky Linux.

id02 SELECT "Linux"
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 2 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1136680099] UIDs valid
* OK [UIDNEXT 4] Predicted next UID
id02 OK [READ-WRITE] Select completed.

Vypíšeme si seznam všech emailů ve složce

id03 FETCH 1:* FLAGS
* 1 FETCH (FLAGS (\Seen))
* 2 FETCH (FLAGS (\Seen))
id03 OK Fetch completed.

Stáhneme si email č. 2:

id04 FETCH 2 body[text]
* 2 FETCH (BODY[TEXT] {75}
mkdir: cannot create directory `/var/run/sendmail/msp': Permission denied
)
id04 OK Fetch completed.

Myslím, že to na ukázání stačilo, takže se odhlásíme

id05 logout
* BYE Logging out
id05 OK Logout completed.

SSL

Dnes je téměř samozřejmostí, že admin přehodí většinu veřejně dostupných služeb na jejich zabezpečenou variantu (zabalenou do SSL). Klasickým telnetem v tomto případě nic nevyzkoušíte, protože telnet neumí SSL. Pro připojení na server proto použijeme program openssl.

O programu openssl si spousta lidí myslí, že to je ta divná věc na generování certifikátů, ale on umí být i klientskou aplikací pro SSL spojení. Stačí ho spustit s parametrem s_client:

$ openssl s_client -host SERVER -port PORT

Openssl s_client umožňuje zadat spoustu dalších parametrů, například umožní využít certifikát certifikační autority případně zaslat serveru klientský certifikát. Seznam všech parametrů dostanete pokud zadáte jakýkoliv neznámí parametr:

[tsunami@vodik]$ openssl s_client -h
unknown option -h
usage: s_client args

 -host host     - use -connect instead
 ...

Když se připojíte k serveru pomocí openssl, na obrazovce se zobrazí informace o navazovaném SSL spojení:

[tsunami@vodik]$ openssl s_client -host tsunami.locnet -port 995
CONNECTED(00000003)
depth=1 /C=CZ/ST=-/L=Prag/O=Zdenek Burda/CN=Zdenek Burda/emailAddress=zdenda@
zdenda.com
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
 0 s:/C=CZ/ST=-/L=Prag/O=Zdenek Burda/CN=tsunami.locnet/emailAddress=zdenda@zdenda.com
   i:/C=CZ/ST=-/L=Prag/O=Zdenek Burda/CN=Zdenek Burda/emailAddress=zdenda@zdenda.com
 1 s:/C=CZ/ST=-/L=Prag/O=Zdenek Burda/CN=Zdenek Burda/emailAddress=zdenda@zdenda.com
   i:/C=CZ/ST=-/L=Prag/O=Zdenek Burda/CN=Zdenek Burda/emailAddress=zdenda@zdenda.com
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIC4jCCAcoCAQIwDQYJKoZIhvcNAQEFBQAweDELMAkGA1UEBhMCQ1oxCjAIBgNV
...
gBRJXBktFFaRCI+4pUiUi02o+pfkkgeGoVBRtycauOXZ7TVT97aihjk8Qxj98Bys
lDt47imjTMwwh8LSOz0M6OsmIupVTw==
-----END CERTIFICATE-----
subject=/C=CZ/ST=-/L=Prag/O=Zdenek Burda/CN=tsunami.locnet/emailAddress=zdenda@zdenda.com
issuer=/C=CZ/ST=-/L=Prag/O=Zdenek Burda/CN=Zdenek Burda/emailAddress=zdenda@zdenda.com
---
No client certificate CA names sent
---
SSL handshake has read 2016 bytes and written 340 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: EACB77B795913F22DC65CD867301E84913CDBEAA1FE89E5A90A32E2891297E58
    Session-ID-ctx: 
    Master-Key: F1480F1397A2A1DB995B4FB8AC720FEF6CFE77F02FBB95407576B3C023620
6736ABDE4FE2108AA936EC115B365CF70BA
    Key-Arg   : None
    Start Time: 1136712490
    Timeout   : 300 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)
---
+OK Dovecot ready.

Po připojení pomocí openssl můžete zadávat příkazy stejně jako při připojení telnetem. Openssl ukončíte pomocí ^d nebo ^c.

V případě mého spojení pomocí openssl se na ukázalo hlášení o self signed certifikátu. Bylo to způsobené tím, že openssl nezná certifikát certifikační autority, která podepsala certifikát serveru. Pokud openssl vnutíme certifikát CA (CA.crt), bude vše v pořádku.

[tsunami@vodik]$ openssl s_client -host tsunami.locnet \
 -port 995 -CAfile CA.crt
  

Docela zajímavou funkcí je, pokud server vyžaduje aby mu klient zaslal svůj certifikát jinak mu nedovolí připojení/přihlášení. OpenSSL tento certifikát předáme volbami -cert a -key.

[tsunami@vodik]$ openssl s_client -host tsunami.locnet \
 -port 995 -CAfile CA.crt -cert burda.crt -key burda.key

Nejčastěji používané porty pro SSL varianty běžných služeb:

  • imaps: 993
  • pop3s: 995
  • smtps: 465
  • https: 443

A to je vše přátelé…

Jednotlivé protokoly jsem zde nepopisoval, protože je vše pěkně vysvětlené v odkazovaných RFC. Uvedený způsob ovládání emailu se nehodí jen pro testování, ale někdy se dá využít i v normálním životě. Pokud máte ve schránce velký email, který nechcete/nemůžete stáhnout, tak jeho smazání přes pop3 telnetem je záležitost na chvilku. Telnet na SMTP server se hodí pokud zkoušíte jestli můžete přijímat poštu z venku a přitom ještě není správně nastavený DNS server (pokud byste si zkusili poslat email klasickým způsobem z nějakého freemailu, nepřijšel by protože neví kam má jít).

Comments are closed.