Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Jul 2016 16:06:14 -0300
From:      "Dr. Rolf Jansen" <rj@obsigna.com>
To:        freebsd-ipfw@freebsd.org
Cc:        Julian Elischer <julian@freebsd.org>
Subject:   Re: ipfw divert filter for IPv4 geo-blocking
Message-ID:  <9641D08A-0501-4AA2-9DF6-D5AFE6CB2975@obsigna.com>
In-Reply-To: <c2cd797d-66db-8673-af4e-552dfa916a76@freebsd.org>
References:  <61DFB3E2-6E34-4EEA-8AC6-70094CEACA72@cyclaero.com> <CAHu1Y739PvFqqEKE74BjzgLa7NNG6Kh55NPnU5MaA-8HsrjkFw@mail.gmail.com> <4D047727-F7D0-4BEE-BD42-2501F44C9550@obsigna.com> <c2cd797d-66db-8673-af4e-552dfa916a76@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
> Am 26.07.2016 um 13:23 schrieb Julian Elischer <julian@freebsd.org>:
> On 26/07/2016 1:41 AM, Dr. Rolf Jansen wrote:
>> Once a week, the IP ranges are compiled from original sources into a =
binary sorted table, containing as of today 83162 consolidated range/cc =
pairs. On starting-up, the divert daemon reads the binary file in one =
block and stores the ranges into a totally balanced binary search tree. =
Looking-up a country code for a given IPv4 address in the BST takes on =
average 20 nanoseconds on an AWS-EC2 micro instance. I don't know the =
overhead of diverting, though. I guess this may be one or two orders of =
magnitudes higher. Even though, I won't see any performance issues.
>=20
> yes the diversion to user space is not a fast operation. When we wrote =
it, fast was 10Mbits/sec.
> The firewall tables use a radix tree (*) and might be slower than what =
you have, but possibly it might be made up for by not having to do the =
divert logic. it's not entorely clear from your description why you look =
up  a country rather than just a pass/block result, but maybe different =
sources can access different countries?.

The basic idea was to develop a facility for ipfw for filtering IPv4 =
packets by country code - see: https://github.com/cyclaero/ipdb

I simply put into /etc/rc.conf:

   geod_enable=3D"YES"
   geod_flags=3D"-a DE:BR:US"

The -a flag tells, that source IP addresses only from these countries =
are allowed (i.e. passed through the filter). I added also a -d flag, =
which means deny (i.e. drop packets) from the given list of countries.

With that in place, I need to add a respective divert rule to the ipfw =
ruleset (the divert port of the geod daemon is 8669, remembering that =
8668 is the port of the natd daemon):

    ipfw -q add 70 divert 8669 tcp from any to any 80,443 in recv WAN_if =
setup

> I did similar once using ipfw tables but couldn't find a reliable =
source of data.

The IP/CC database is compiled from downloads of the daily published =
delegation statistics files of the 5 RIR's. I consider the RIR's being =
the authoritative source. Anyway, on my systems the IP/CC-database is =
updated only weekly, although, daily updating would be possible. I wrote =
a shell script for this, that can be executed by a cron job.

    https://github.com/cyclaero/ipdb/blob/master/ipdb-update.sh =
<https://github.com/cyclaero/ipdb/blob/master/ipdb-update.sh>;

There is another tool called geoip , that I uploaded to GitHub, and that =
I use for looking up country codes by IP addresses on the command line.

    https://github.com/cyclaero/ipdb/blob/master/geoip.c

This one could easily be extended to produce sorted IP ranges per CC =
that could be fed into tables of ipfw. I am thinking of adding a command =
line option for specifying CC's for which the IP ranges should be =
exported, something like:

   geoip -e DE:BR:US:IT:FR:ES=20

And this could print sorted IP-Ranges belonging to the listed countries. =
For this purpose, what would be the ideal format for directly feeding =
the produced output into ipfw tables?

>> Independent from the actual usage case (geo-blocking), let's talk =
about divert filtering in general. The original question which is still =
unanswered can be generalized to, whether "dropping/denying" a package =
simply means 'forget about it' or whether the divert filter is required =
to do something more involved, e.g. communicate the situation somehow to =
ipfw.
>=20
> there is no residual information about the packet in the kernel once =
it has been passed to the  user process.
> so just "forgetting to hand it back" is sufficient to drop it.

OK, many thanks, that just answers my original doubt. At least =
technically, my daemon handles package dropping correctly, although, =
more elegant ways can be imagined to do the same thing.

Best regards

Rolf=20=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9641D08A-0501-4AA2-9DF6-D5AFE6CB2975>