Chris Smith wrote:

> But with max-src-conn-rate aren't you actually allowing connections? The 
> first I want to do is block connections, not allow them. Will use of 
> max-src-conn-rate work with a block? With attempted connections that 
> never get allowed?

A "block" rule will just block all connections.  That's easy:

block in on $if proto tcp from any to ($if) port ssh

Done.  No SSH traffic is gonna get through that, that's fer-damned-
sure.  (I'll demonstrate first with my own SSH-scanner rule, that
being what I have at hand to work with.  Your requirements will be
covered below.)  However, if you want to trigger on something, you
need to use a "pass" rule first, to let those connections in:

pass in on $if proto tcp from any to ($if) port ssh \

EXCEPT for those originating from those thrice-damned SSH spam-scanners
(may their souls be rent with iron claws in the sulfur-pits of Gehenna)
which you want to consign to the Outer Darkness; we discover these after
their fifth (or third, or eighth, or however many-th) connection attempt
in a specified timeframe (here, 30 seconds), which is not "normal"
behavior for SSH:

        ( max-src-conn-rate 5/30, \

... and when that is triggered, you want to not only add them to the
"Outer Darkness" table, which you block with an earlier rule in pf.conf:

        overload <OuterDarknessTable> \

(referencing previous rule:
"block in quick on $if from <OuterDarknessTable> to any")

... you want to flush all states associated with that IP, preventing it
from using a previously-established connection for any nastiness:

        flush \

... and you want that to apply to states generated from any rule, to
boot:

        global )

Think of that "max-src-conn-rate" as an exception:  "Pass these in,
BUT, if the connection meets this criteria (#conns/time), add it to
this table and purge all states containing this address."  That is
necessary for the "triggering" behavior of which you speak.

For your purposes, I would *guess* that the following would work:

pass in on $net_if proto tcp from ($internal_net) to (! $mailhost) \
        port smtp \
        ( max-src-conn-rate 1/60, overload <InfectedTable>, \
        flush global )

with a corresponding rule:

block in on $net_if from <InfectedTable> to any

That should trigger the first time someone diddles an SMTP port that
doesn't belong to your mailserver (the behavior you're looking for),
chucking the unfortunate host onto a blacklist, which you are
presumably checking on a periodic basis (cronjob perhaps, run once
every minute or five, "pfctl -t InfectedHosts -Tshow" - that should
mail you only if there is output of that command, i.e. if a host has
been added to that table.)

Caveat:  these rules will have to be replicated for each internal
network interface you have.

Caveat #2:  unless there's one network interface on your pf box for
each host, the host will still be able to send traffic to anything on
its segment.  Restated:  you will only be able to quarantine your
network on a per-interface basis.

Hope that helps!

-- 
(c) 2005 Unscathed Haze via Central Plexus <[EMAIL PROTECTED]>
I am Chaos.  I am alive, and I tell you that you are Free.  -Eris
Big Brother is watching you.  Learn to become Invisible.
|-------- Your message must be this wide to ride the Internet. --------|

Reply via email to