PDA

Bekijk Volledige Versie : Exim4 + smtp limit (zonder DA)



Lekensteyn
10/07/10, 16:26
Beste WHT'ers,

Om te voorkomen dat mijn vps een spamserver wordt wil ik het aantal mailtjes dat een gebruiker kan sturen limiteren.
DirectAdmin heeft hiervoor SMTP Limiter:

Howto voor DA: http://help.directadmin.com/item.php?id=51
Configuratiebestand: http://files.directadmin.com/services/exim.conf
(Bijbehorend bestand: http://files.directadmin.com/services/exim.pl)

Deze wil ik nu ook implementeren op mijn server, die geen DA draait.
Ik heb alleen de functie nodig die het aantal mailtjes limiteert, geen filters voor spam of zo.
Tenzij dat wordt aangeraden :)

Exim wordt hier alleen gebruikt voor PHP mail().

Hoe kan ik dit het beste aanpakken?

Mvg,
Lekensteyn

marsipulami
10/07/10, 16:48
volgens mij kan je deze tut ook wel gebruiken voor een server zonder DA: http://help.directadmin.com/item.php?id=81

T. Verhaeg
10/07/10, 17:08
Kun je hier niets mee?

http://www.exim.org/exim-html-current/doc/html/spec_html/ch40.html#SECTratelimiting

Lekensteyn
11/07/10, 10:28
@marsipulami
In het readme-bestandje wordt vermeld dat je een nieuwere configuratiebestand nodig hebt.
Ik heb met diff vergeleken, maar stopte aangezien de standaardconfiguratie van Debian en die van DirectAdmin enorm verschilt.
Ook had ik ergens gelezen dat Debian een aparte versie van Exim onderhoudt, hoewel deze niet veel verschilt in de werking.

@T. Verhaeg
Die was volgens mij voor alle mails bij elkaar, ik wil het per gebruiker instellen.
Zo heb ik bijvoorbeeld een gebruiker "hoofdsite" (uid 501) die 200 mailtjes per dag mag versturen en een gebruiker "vriend" (uid 502) die 100 mailtjes per dag wilt versturen.

Mvg,
Lekensteyn

ju5t
12/07/10, 11:32
Dat is toch niet zo lastig? Je gebruikt het perl script van DA. Zet de volgende regel in je exim.conf:


perl_startup = do '/etc/exim.pl'

Of waar je het bestand ook kwijt wilt, als je het bijv. niet in /etc plaatst. Dan zoek je de router op die als eerste wordt geladen (dus na "begin routers") in je /etc/exim.conf file. Daar plaats je de volgende conditie in:


condition = "${perl{check_limits}}"

En that's it.

Lekensteyn
12/07/10, 16:38
Het ziet er niet zo moeilijk uit, maar in de configuratie en instructies zie ik veel directadmin-specifieke onderdelen.
Ik ben niet zo bekend met perl en weet ook niet waar die functies allemaal worden aangeroepen.
Alles wat ik nodig heb is het minimale om dat voor elkaar te krijgen.
...met als doel de veiligheid van de server te waarborgen.

Mvg,
Lekensteyn

Yourwebhoster
12/07/10, 16:53
Het ziet er niet zo moeilijk uit, maar in de configuratie en instructies zie ik veel directadmin-specifieke onderdelen.
Ik ben niet zo bekend met perl en weet ook niet waar die functies allemaal worden aangeroepen.
Alles wat ik nodig heb is het minimale om dat voor elkaar te krijgen.
...met als doel de veiligheid van de server te waarborgen.

Mvg,
Lekensteyn

In de uitleg van getUP maakt hij gebruik van de normale exim.conf, meer heb je niet nodig!!

Lekensteyn
12/07/10, 17:07
Sorry dat ik zo lastig ben :p

Is dit de 'normale' exim.conf van exim, of voldoet de 'standaard' meegeleverde configuratie van Debian ook?

Alvast bedankt.

Mvg,
Lekensteyn

Yourwebhoster
12/07/10, 17:29
Ookal kunnen de instellingen anders zijn, het blijft hetzelfde.

Lekensteyn
12/07/10, 17:51
Na wat verder gezoek kom ik hierop uit:
http://www.nobaloney.net/downloads/spamblocker/DirectAdminSpamBlocker3/
Daar staan de recenste versies van de configuratie van exim.
Ik ga het even lezen, maar kan iemand me vertellen waarom ik Dovecot nodig heb?
Ik was van plan om Google apps te gebruiken voor he ontvangen van mail.

Mvg,
Lekensteyn

ju5t
12/07/10, 18:58
Dovecot staat er los van. Je moet je ook niet richten op DirectAdmin. Ik heb je de aanwijzingen gegeven hoe je het kunt maken. Als je er echt niet uit komt kun je wel even contact opnemen, zoveel werk is het ook niet om voor je op te lossen. Maar het is altijd beter om het zelf te leren, lastig is het niet.

Lekensteyn
15/07/10, 18:25
Het werkt niet echt.
Ik heb het pl bestand geplaatst in /etc/exim.pl
Daarna exim4-daemon-heavy (exim4-daemon-light kon geen perl aan) geïnstalleerd.
Ik wist niet waar ik die condition moest toevoegen, aangezien er meerdere secties waren, dus heb ik het voorbeeld van DA gevolgd:
# added by Lekensteyn; for check_limits

lookuphost:
driver = dnslookup
domains = ! +local_domains
ignore_target_hosts = 127.0.0.1/8
condition = "${perl{check_limits}}"
transport = remote_smtp
no_more

Exim herstart en met PHP mail gestuurd.
Alle mailtjes komen aan, maar het limiet werkt niet.
Dit staat in /var/log/exim4/mainlog:

2010-07-15 18:18:58 1OZR9G-00062h-2O <= hidden@email U=usr P=local S=425
2010-07-15 18:18:58 1OZR9G-00062h-2O => hidden@email R=lookuphost T=remote_smtp H=gmail-smtp-in.l.google.com [74.125.39.27]
2010-07-15 18:18:58 1OZR9G-00062h-2O Completed
2010-07-15 18:19:02 1OZR9K-00062n-Ax <= hidden@email U=usr P=local S=425
2010-07-15 18:19:02 1OZR9K-00062n-Ax failed to expand condition "${perl{check_limits}}" for lookuphost router: You (usr) have reach your daily email limit of 1 mails
2010-07-15 18:19:02 1OZR9K-00062n-Ax => hidden@email R=dnslookup T=remote_smtp H=gmail-smtp-in.l.google.com [74.125.39.27]
2010-07-15 18:19:02 1OZR9K-00062n-Ax Completed

Wat doe ik mogelijk fout?

Mvg,
Lekensteyn

Yourwebhoster
15/07/10, 18:46
Het werkt niet echt.
Ik heb het pl bestand geplaatst in /etc/exim.pl
Daarna exim4-daemon-heavy (exim4-daemon-light kon geen perl aan) geïnstalleerd.
Ik wist niet waar ik die condition moest toevoegen, aangezien er meerdere secties waren, dus heb ik het voorbeeld van DA gevolgd:
# added by Lekensteyn; for check_limits

lookuphost:
driver = dnslookup
domains = ! +local_domains
ignore_target_hosts = 127.0.0.1/8
condition = "${perl{check_limits}}"
transport = remote_smtp
no_more

Exim herstart en met PHP mail gestuurd.
Alle mailtjes komen aan, maar het limiet werkt niet.
Dit staat in /var/log/exim4/mainlog:


Wat doe ik mogelijk fout?

Mvg,
Lekensteyn
Je doet niets fout, je hebt ingesteld in /var/virtual/limit dat je maar één e-mail per dag mag versturen en dat heb je al gedaan. De fout die je krijgt is heel normaal, maar waar het om gaat is dit stukje:

... You (usr) have reach your daily email limit of 1 mails ...

Lekensteyn
16/07/10, 10:56
Zou het programma de mail dan niet moeten weigeren?
Nou wordt ie namelijk gewoon verstuurd.

Mvg,
Lekensteyn

Yourwebhoster
16/07/10, 10:57
Zou het programma de mail dan niet moeten weigeren?
Nou wordt ie namelijk gewoon verstuurd.

Mvg,
Lekensteyn

De e-mail zou niet verstuurd mogen worden, als ik het goed begrijp komt de e-mail dus wel aan?

Lekensteyn
17/07/10, 09:52
Dat is juist, hij komt wél aan.
Dit is de relevante code (licht aangepast):

sub check_limits
{
my $notify = 'hidden@mail';
my $count = 0;
#find the curent user
my $uid = find_uid();
my $email_limit = 0;
my $name = getpwuid($uid);
if (open (LIMIT, "/etc/virtual/limit_$name"))
{
$email_limit = int(<LIMIT>);
close(LIMIT);
}
if ($email_limit == 0)
{
open (LIMIT, "/etc/virtual/limit");
$email_limit = int(<LIMIT>);
close(LIMIT);
}
if (uid_exempt($uid,$name)) { return "yes"; }
if ($email_limit == -1)
{
die("You ($name) are not allowed to send email\n");
}
if ($email_limit > 0)
{
$count = (stat("/etc/virtual/usage/$name.count"))[7];
if ($count > $email_limit)
{
open(MAIL, "|mail -s 'User $name have reached his daily email limit ($email_limit): $count' $notify");
print MAIL <<END;
User $name have reached his daily email limit ($email_limit): $limit.
------ This is initial part of the last message, including all the headers. ------
END
print MAIL Exim::expand_string('$message_headers'),"\n\n";
print MAIL Exim::expand_string('$message_body'),"\n";
close MAIL;
die("You ($name) have reach your daily email limit of $email_limit emails\n");
}

open(USAGE, ">>/etc/virtual/usage/$name.count");
print USAGE "1";
close(USAGE);
chmod (0660, "/etc/virtual/usage/$name.count");

}
my $sender_address = Exim::expand_string('$sender_address');
my $mid = Exim::expand_string('$message_id');
log_bandwidth($name,"$sender_address;$mid");
return "yes"
}

Het script stopt ook op die die() (log_bandwidth wordt niet meer aangeroepen), maar exim vind het wel nodig om mail te sturen.

Mvg,
Lekensteyn