Original in de Stefan Blechschmidt
de to en Jürgen Pohl
en to nl Guus Snijders
Als een getrainde electricien, vond ik mezelf in 1990 voor een CAD werkstation om een schakel en controle station te ontwerpen. Ik ben toen geïnfecteerd geraakt met een toen onbekend 'virus', en dat is goed.
Wie gebruikt er niet die (enkele) diskette router van http://www.fli4l.de/ ? Waarschijnlijk zijn alle
gebruikers ervan bekend met het probleem als de router wordt gebruikt in
dial-on-demand mode in een bestaand netwerk systeem met een interne
mail server. Als de router een verbinding maakt, zou de mailserver hiervan
moeten weten, zodat deze mail kan ontvangen en versturen.
Dit artikel beschrijft een mogelijkheid om dit probleem op te lossen.
Onze illustratie geeft het concept het netwerk weer dat we gaan gebruiken als voorbeeld voor dit artikel. WS1 tot WS3 representeren de werkstations die zijn aangesloten op het WWW via de router. De service-host is verantwoordelijk voor de interne en de externe mail. Het versturen van mail wordt afgehandeld door de MTA. Het ontvangen gaat met behulp van Fetchmail en vervolgens gesorteerd door procmail. De mailboxen op de service host worden aan de clients aangeboden via POP3 of IMAP
Als een van de werkstations een verbinding naar het WWW opzet, merkt de service host hier normaal gesproken niks van. Het zou mogelijk zijn om de service host te vertellen op mail te ontvangen op specifieke tijden, met behulp van een cron job. Het zou eleganter zijn om de service host te informeren als een verbinding wordt opgezet, en zo deze in staat stellen zijn mail jobs af te handelen.
Daar de router draait vanaf een diskette, is er geen complex script of programma om de mail server vanaf de router te controleren.
Tijdens het informeren van de service host over de verbinding, zou het mogelijk moeten zijn om een aanvraag voor het verwerken van mail door te geven.
Voor fli4l is een programma genaamd wget beschikbaar, met een grootte van ongeveer 100 kB, zodat deze makkelijk op de diskette past. met wget kunnen we een verbinding opzetten naar de service host, op hetzelfde moment als er uitgebeld wordt. Dit is mogelijk doordat inetd een poort opent op de service host en wacht op een verbinding vanaf de router. Met de verbinding zal er een script worden gestart voor het versturen en ontvangen van mail.
Het script is geschreven in Perl en is hier (mailstart.pl.gz) te downloaden.
Inbellen activeert het bestand .../opt/etc/ppp/ip-up. Dit is de juiste plaats om een verbinding op te zetten met onze service host. Door deze regel op te nemen:
wget -t 1 --spider MAILSERVER:PORT/xyz &> /dev/null
doen we precies dat.
Met behulp van de super server inetd wordt het programma mailstart [1] geactiveerd. Om dit te laten gebeuren, dienen we de volgende bestanden te bewerken:
/etc/inetd.conf
/etc/services
In dit bestand wijzen we de poort toe, welke wget zal benaderen. De regel:
mailstart 4000/tcp # Mailstart
regelt dit.
/etc/inetd.conf
In dit bestand definiëren we welk programma gestart zou moeten worden. inetd monitort het uitvoeren en logt dit in /var/log/syslog.
De regel:
mailstart stream tcp nowait root /usr/sbin/tcpd /root/bin/mailstart
rondt deze stap af. De eerste naam dient hetzelfde te zijn zoals genoteerd in het bestand /etc/services.
Met behulp van variabelen kan het programma worden aangepast aan de bepaalde situatie.
$protokoll
Met de variabele $protokoll definiëren we of de calls gelogd moeten worden. Als deze variabele op 1 wordt gezet, zullen de calls gelogd worden in /var/log/mailstart.log. Als de variabele op 0 wordt gezet, zal er geen log worden aangelegd.
Default: 1 create log
$protokoll_ziel
Met deze variabele kunnen we het doel van het log aangeven.
Default: /var/log/mailstart.log
$mailholen
Hier geven we de naam op van het programma dat de mail ophaalt. Om het programma te starten dient de gebruiker root te zijn, of de naam die was opgegeven in /etc/inetd.conf. Als iemand anders het programma wil gebruiken, dient het programma gestart te worden met su USER -c \"COMMANDO PARAMETER\" . Als het commando meerdere woorden lang is, moet het tussen aanhalingstekens worden geplaatst, ook moet het beschermd worden met \.
Default (one line): su postmaster -c \"fetchmail -t 40 -a -L /var/log/fetchmail/fetchmail.log \ -f /home/postmaster/.fetchmailrc\"
$mailsenden
Dit is de plaats voor het programma dat gebruikt wordt voor het versturen van email. Om het programma te starten moet de user root zijn of de naam die was opgegeven in /etc/inetd.conf. Als iemand anders het programma wil gebruiken, dient deze gestart te worden met su USER -c \"COMMANDO PARAMETER\". Als het commando meerdere woorden lang is, moet het tussen aanhalingstekens worden geplaatst, ook moet het beschermd worden met \.
Default: sendmail -q
Overigens bestaat een deel van het programma uit een kleine POD documentatie, welke een korte beschrijving levert. Je kunt een beschrijving krijgen met perldoc mailstart.
Alvorens te testen, dient de super server opnieuw gestart te worden, /etc/init.d/inetd restart zou dit moeten doen. Nu kun je testen met telnet localhost mailstart. Als de server reageerd zou je een vergelijkbare output als hieronder moeten krijgen.
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. HTTP/1.1 220 OK Date: Sun, 20 Jul 2003 10:45:46 GMT Server: mailstart/perl (sbsbavaria) Last-Modified: Sun, 20 Jul 2003 10:45:46 GMT Content-Type: text/txt Content-Length: 11 1234567890 Connection closed by foreign host.
Dat is alles. Ik hoop dat je het verwachtte resultaat kreeg van mijn
beschrijving. Als dat niet het geval is, hebben we een probleem.
- Jij, want het werkt niet.
- Ik, omdat ik niet in staat was een adequate beschrijving te geven :-).