Open-relay teszter

Írta: palacsint, http://palacsint.hu/

1.Felhasználói dokumentáció

1.1.Ismertető

A program egy open-relay (nyitott átjátszó, bárki által használható levéltovábbító szerver) tesztelő alkalmazás. A program a paraméterként megkapott hostot ellenőrzi, hogy fut-e rajta (alapértelmezett esetben a 25-ös TCP porton) SMTP kiszolgáló, s ha igen, akkor az továbbítja-e a program által küldött tesztlevelet a címzettnek. A program beállításai parancssori paraméterekkel szabadon konfigurálhatóak. Ilyen paraméter a már említett tesztelendő szerver IP címe vagy hostja, az SMTP szolgáltatás TCP portjának száma, valamint a tesztelésre használt levél feladója és címzettje is, de a programba beépített tesztlevélben megjegyzés elhelyezésére is van lehetőség.

1.2.Irányelvek

A program egy segédeszköz, amellyel saját SMTP szerverünk biztonsági beállításairól kaphatunk gyorsan és kényelmesen információt – anélkül, hogy saját magunknak közvetlenül kellene például telnettel az SMTP parancsokat begépelni, vagy a levelezőprogramunk beállításait módosítani a teszteléshez. Több számítógép vizsgálata esetén ezen utóbbi megoldások különösen nagy kényelmetlenséget jelenthetnek. Az alkalmazás azonban rossz célokra is felhasználható. A szerző nem vállal felelősséget semmilyen, a program által okozott kárért, mindenki csak a saját felelősségére használja.

1.3.Fordítás

A program forráskódját (és a dokumentációt is) az openrt.tar.gz fájl tartalmazza. Ezt kitömörítve, a létrejövő openrt könyvtárban a make parancsot kiadva fordítható le a forrásfájl, majd a ./openrt paranccsal futtatható az újonnan létrejött bináris állomány.

A program tesztelése SunOS/SPARC és Linux/x86 rendszereken történt, de valószínűleg más Unix-variánsokon is gond nélkül működik.

1.4.Futtatás

A programot paraméter nélkül meghívva kiírja a lehetséges paramétereket és kapcsolókat. Viselkedése ilyenkor megegyezik a -h kapcsoló által kiváltottal. A lehetőségek a következőek:

$ ./openrt
Usage:  openrt [-v] [-t timeout] -f sender_addr -u recipient_addr [-c comment] <hostname> <port>
       openrt -h
Options:
       -h                      this help
       -f sender_addr          sender-addr
       -u recipient_addr       to-addr
       -v                      verbose mode
       -c comment              extra comments to the mail
       -t timeout              timeout in second(s)

A paraméterezés használata:
  1. -h: ugyanezen súgóképernyőt eredményezi

  2. -f: a program által küldött tesztlevél feladójának e-mail címét kell ezzel a paraméterrel megadni. Szabályos e-mail cím megadása kötelező, a program ezt ellenőrzi is.

  3. -u: a tesztlevél címzettjének megadására szolgáló paraméter. Szabályos e-mail cím megadása itt is kötelező.

  4. -v: „verbose”, „beszédes” üzemmód bekapcsolása. Beállítása esetén a szabványos kimenetre kerül minden kommunikáció, amely a szerver és a kliens között zajlik.

  5. -c: Ezen kapcsoló után egy rövid kiegészítés lehet megadni, amely a tesztlevél végén fog megjelenni. Itt lehet esetleg megadni a tesztelés célját, egyéb elérhetőséget, vagy más üzenetet. Hasznos lehet olyan esetben, amikor nem tudjuk saját e-mail címünket használni a tesztlevél címzettjeként.

  6. -t: Időtúllépés másodpercben. Ha ennyi ideig nem jön válasz a szervertől egy-egy elküldött üzenetre, akkor a kliens bontja a kapcsolatot.

1.5.Visszatérési értékek

  1. 0: Nem open-relay a tesztelt szerver a megadott paraméterekre.

  2. 1: A tesztelt szerver nyitott levélátjáróként működik, azaz open-relay a programnak megadott paraméterekre.

  3. 3: Valamilyen hálózati hiba történt, például megszakadt a kapcsolat a szerverrel, nem felépíthető a kapcsolat, nem várt válasz érkezett a szervertől, lejárt az időkorlát, stb.

  4. 4: Hibás paraméterezés, egyértelműen felhasználói hiba.

  5. 5: Belső hiba: nincs elég szabad memória, könyvtári függvények (snprintf, stb.) hibája, stb.

1.6.Példák

A következő két példán látható, hogy a localhoston futó SMTP szerver elfogadja a tesztprogramtól a levelet, s továbbítja is azt. Az elsőn a teljes kommunikáció látható, míg a másodikon csak a program visszatérési értékéből derül ki, hogy a nyitott átjáróról van szó.

$ ./openrt -v -t 5 -f X@freemail.hu -u X@freemail.hu -c comment localhost 25
Connection to localhost...
Connection established.
<<< 220 kek ESMTP Exim 4.50 Thu, 13 Apr 2006 00:09:36 +0200
>>> HELO kek
<<< 250 kek Hello localhost [127.0.0.1]
>>> MAIL FROM: X@freemail.hu
<<< 250 OK
>>> RCPT TO: X@freemail.hu
<<< 250 Accepted
>>> DATA
<<< 354 Enter message, ending with "." on a line by itself
>>> To: X@freemail.hu
>>> From: X@freemail.hu
>>> Subject: open-relay test message
>>>
>>> This is a test message which checks your SMTP server as an
>>> open-relay server and tries to send a message with its.
>>>
>>> Please ignore this e-mail.
>>>
>>> comment
>>>
>>> EOF
>>> .
<<< 250 OK id=1FTnWq-0003K7-Qf
>>>
>>> QUIT
return code: 1
The host is an open-relay server.

 

$ ./openrt -t 5 -f X@freemail.hu -u X@freemail.hu -c comment localhost 25; echo $?
1

A következő két példán egy külső SMTP szerver vizsgálata szerepel, az előzőekhez hasonlóan először „verbose”, majd „verbose” nélküli üzemmódban.

$ ./openrt -v -t 5 -f X@freemail.hu -u X@freemail.hu -c comment mail.index.hu 25
Connection to mail.index.hu...
Connection established.
<<< 220 scully.index.hu ESMTP Exim 4.50 Thu, 13 Apr 2006 00:08:26 +0200
>>> HELO kek
<<< 250 scully.index.hu Hello kek.sch.bme.hu [152.66.214.82]
>>> MAIL FROM: X@freemail.hu
<<< 250 OK
>>> RCPT TO: X@freemail.hu
<<< 550 relay not permitted
>>>
>>> QUIT
return code: 0
The host is NOT an open-relay server

 

$ ./openrt -t 5 -f X@freemail.hu -u X@freemail.hu -c comment mail.index.hu 25; echo $?
0

 

1.7.Hibaüzenetek

Paraméterezési hibák
  1. Invalid sender address.
    Érvénytelen a -f kapcsoló után megadott e-mail cím.

  2. Invalid recipient address.
    Érvénytelen a -u kapcsoló után megadott e-mail cím.

  3. Invalid timeout: X (interpreted as Y)
    Érvénytelen a -t kapcsoló után megadott érték: vagy nem szám, vagy nem 0 és 60 közé esik. A program Y-ként értelmezte.

  4. Unknown option:
    Érvénytelen opció a parancssori kapcsolók között.

  5. Unknown option character
    Érvénytelen parancssori kapcsoló.

  6. Empty hostname.
    Nem lett megadva host paraméterként.

  7. Invalid port number: X (interpreted as Y)
    Érvénytelen a megadott portszám (X), a program Y-nak értelmezte. 1 és 65535 közé kell esnie.

  8. Unknown parameter:
    Felesleges a megadott paraméter.

Rendszerhibák
  1. Unknown getopt() action.
    Belső hiba, a getopt() függvény nem lekezelt értéket adott vissza.

  2. There is not enough memory (strdup).
    Nincs elég memória az strdup() függvény végrehajtásához.

  3. Invalid data? (print_message)
    Belső hiba, kiírandó adat nélkül lett meghívva a print_message()függvény. Gyakorlati jelentősége nincs.

  4. Couldn't get hostname (gethostname()).
    A programot futtató számítógép hálózati nevének lekérdezése nem sikerült.

  5. Internal error (snprintf).
    Az snprintf() függvény végrehajtása sikertelen.

  6. Internal error in the regular expression.
    A programban (az e-mail címek ellenőrzésére) használt reguláris kifejezést nem sikerült értelmezni.

  7. Don't use this program as root.
    Biztonsági megfontolásokból nem futtatható a program a root felhasználó jogaival.

  8. Invalid hostname.
    Érvénytelen a paraméterként megadott host, nem sikerült meghatározni a hozzá tartozó IP címet.

Hálózati hibák
  1. Connection reset by peer.
    A szerver bontotta a kapcsolatot.

  2. Invalid answer from the SMTP server.
    Az SMTP szerver a program számára értelmezhetetlen választ küldött: az üzenet eleje nem tartalmaz üzenetkódot, vagy az nem az RFC-nek illetve a vártnak megfelelő.

2.Programozói dokumentáció

2.1.Adatszerkezetek

struct param_t {
       int help; // "-h" paraméter
       int verbose; // "-v" paraméter - verbose üzemmód
       char *host;
       char *from;
       char *to;
       char *comment;
       int timeout;
int port;
};

A program a param_t struktúrában tárolja a szükséges ellenőrzések és feldolgozás után parancssorból kapott paramétereket. A help 1-es értéke esetén a program csak a súgót jeleníti meg. A verbose a bőbeszédű módra vált át (szintén 1-es érték esetén). A host, from, to és a comment mutatók egy-egy karaktersorozatra mutatnak, amely a tesztelendő SMTP szerver hostja, a tesztlevél feladója, címzettje, valamint az esetleges egyéb (tesztlevélbeli) megjegyzéseket tartalmazza. A timeout nevű egész az időtúllépés értéke másodpercben, míg a port a már említett SMTP szerver TCP portja (alapértelmezetten 25 az értéke).

2.2.Megjegyzések

A program „HELO”-val köszön az SMTP szervernek, ez a bejelentkező üzenet. Az RFC2821 alapján ezt is kezelnie kell minden szervernek, nem csak az újabb „EHLO” változatot (amely már fejlettebb, de a program szempontjából szükségtelen újításokat, kiterjesztéseket is elérhetővé tesz a kliensek számára). A szerző tapasztalatai szerint a „HELO” támogatását a szerverek be is tartják, amely nagy előnye, hogy a szerver minden parancsra csak egyetlen sornyi választ fog adni, így szekvenciális üzenet-válasz párokkal nagyszerűen kezelhető a kommunikáció a két fél között.

A program forráskódja el van látva megjegyzésekkel, amelyhez még automatikusan generált dokumentáció is készült a doxygen1 nevű programmal. Ezen HTML oldalak a doc könyvtárban találhatóak meg. Az egyes függvények működésének leírása, paraméterezései ezért itt nem kerül ismertetésre. Az említett programmal sok más formátumba is lehetséges a dokumentációt exportálni. Az ehhez szükséges beállításfájl (Doxyfile) szintén megtalálható programot tartalmazó tar.gz fájlban.

1 http://www.stack.nl/~dimitri/doxygen/