CSF custom Regex to *allow* IP's

Hello all,
i am looking for a way to whitelist IP addresses of users who successfully log into Dovecot..

i have too many cases of one user within an office who blocks the entire office's access to the server because their phone is configured with an erroneous login.
ideally, these IP addresses would be whitelisted (sort of like in csf.ignore), but only for 24 hours or so..

i can do the regex to find the IP, the part after '$line', but i can't figure out what to do with the IP once i have it..
i suppose it's in the 'return' section..

also, it seems like whatever you do in usr/local/csf/bin/regex.custom.pm is only to block; there seems to be no option to allow..

i'd be immensely grateful for any help as to where to go next..
Thank you all!

PS:
basically, looking at the log file '/var/log/maillog', the '$line' part would look something like this (super-simplified):
Perl:
$line =~ /^.*dovecot: imap-login: Login: user=<.*>, method=.*, rip=(\d+\.\d+\.\d+\.\d+)
where $1 is the IP to whitelist
but i've no idea what to do in the 'return' section, nor how to avoid having the same IP listed a million times, nor how to clear the list occasionally..

is it possible to 'include' a file in csf.allow or in csf.ignore?
 
Last edited:
You definitely want csf.ignore, not csf.allow. Allow will will whitelist the IP against closed ports, ignore will simply make LFD not trigger blocks on login failures. The latter is what you want.

It is possible to include a file into csf.ignore, it's quite easy actually. Ex:

Code:
Include /etc/csf/kh.ignore

I'd also recommend using a more specific matching rule for the IP. With regex more specific is always better so you are sure to only match what you intend:

Code:
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

I'm not aware of any built-in method to do a temporary ignore, only temporary allow, and my recommendation is still to use ignore in this case.
 
Thank you for the quick response!
how about using Fail2Ban to add lines to an ignore file?
or using Fail2Ban to issue csf command lines?

This issue is driving me bonkers..
i must get angry calls/texts at least twice a week from different clients because some noob intern mis-configured their email account, and suddenly the entire office is shut off from the server..
At the same time, i still want to block offenders' IPs -- even if any offender who knows what they're dong will do only 2 or 3 auth attempts per IP per day..

is it bad to use Fail2Ban on top of CSF?
 
additional question to my last post:
does all this log watching cost a lot in cpu?
if i install Fail2Ban and use it to watch maillog and issue commands to CSF, will i be putting extra strain on CPU or disk read bandwidth?
 
Hi petersconsult!

Maybe I'm missing something but I don't really see the point of allowing the IP numbers temporarily. IP addresses of business are not usually dynamic and even if they are they will still usually last months.

I'd say to simply scan through your maillog and manually add the IP addresses to your csf.ignore file and be done with it. Use an ID string after the IP so you know whose it is: 123.123.123.123 # <username> Office

However if you still want temporary there is a command to add an IP to the temporary allow list:
Code:
csf -ta, --tempallow ip ttl [-p port] [-d direction] [comment]
              Add an IP to the temp IP allow list (default:inout)
It doesn't specifically say it but I'd assume that the ttl is the time to live in seconds. So a command would look like 'csf -ta 123.123.123.132 86400' and that should allow the specified IP number for 24 hours.

Hope that helps and let us know what you come up with!

Dan
 
Hi all,

Just a quick (or not so much) follow-up on my question..
@Dan: sadly, the 2 most important clients to whom it happens all the time are on dynamic IPs, and i have, for way longer than i care to admit, done this manually pretty much as you say (though using the cPanel interface), but i just don't have either the time or patience to do it any more..

This solution is infinitely better!

i've got it working nearly exactly as i like -- i can't figure out how to capture and print the timestamp in human-readable format--

here it is for anyone curious:

First, the jail.local file:
INI:
[csf-my-allow]
enabled = true
bantime=86400
findtime=600
usedns = raw
filter=csf-my-allow-filter
action=csf-my-allow[name=%(__name__)s]
maxretry = 1
logpath = /var/log/maillog
backend = polling

Next, the filter (note that the timestamp does not work as of yet) called csf-my-allow-filter:
INI:
[Definition]
failregex = ^<F-TIMESTAMP>.*</F-TIMESTAMP> host dovecot: imap-login: Login: user=<<F-USER>\S+@\S+</F-USER>>, method=\S+, rip=<HOST>, lip=(\d{1,3}\.){3}\d{1,3}, mpid=\S+, \S+, session=<\S+>$
mode = normal
maxlines = 1
ignoreregex =

And, finally, the action, called csf-my-allow:
INI:
[Definition]
actionstart =
actionstop =
actioncheck =
actionban=csf --tempallow <ip> 86400 IMAP login <F-USER>
# eventually:
# actionban=csf --tempallow <ip> 86400 IMAP login <F-USER> - <F-TIMESTAMP>


PS: i am the only WHM admin on these servers, which is why i'm taking the liberty of reporting the email account along with the IP..
i suppose it might be better to do this, to just capture the domain name:
\S+@<F-USER>\S+</F-USER>
Also, @Jonathan: for what it's worth, i tried finding a solution involving ignore rather than allow, but i did not find a way, through the csf terminal command, to add temporary ignores..
 
Last edited:
@petersconsult

Since you're using WHM, there's a /etc/relayhosts file which is automatically updated by cPanel's antirelayd, which essentially adds IPs once a valid login is created in /var/log/maillog.

An easier, albeit possibly less secure (I'm not entirely sure how more insecure this would be, since I'd imagine it's more secure than temporarily adding CSF allows), would be to add

Code:
Include /etc/relayhosts

To /etc/csf/csf.ignore so that any recently authenticated IP is also ignored by LFD/CSF for a time.
 
Top