> Am 03.08.2016 um 11:13 schrieb Julian Elischer <jul...@freebsd.org>:
> 
> On 2/08/2016 8:50 PM, Dr. Rolf Jansen wrote:
>>> Am 02.08.2016 um 05:08 schrieb Julian Elischer <jul...@freebsd.org>:
>>> 
>>> looking for thoughts from people who know the new IPFW features well..
>>> 
>>> 
>>> A recent addition to our armory is the geoip program that, given an address 
>>> can tell you what country it is in and given a country code, can give an 
>>> ipfw table that describes all the ip addresses in that country.
>>> 
>>> SO I was thinking how to use this, and the obvious way would be to have a 
>>> set of rules for each country, and use the "skipto tablearg" facility to 
>>> skip to the right rules for each country. But the trouble is that a 
>>> tablearg skipto is very inefficient. It's also a hard thing to set up with 
>>> a set of rules for each country (how many countries are there in the 
>>> internet allocation system?).
>> 
>> As of today a total of 236 country codes are in use for IPv4 delegations. If 
>> this helps for anything, a command line switch to the geoip tool could be 
>> added for letting it output the country code (as the hex encoded CC taken as 
>> a plain decimal integer) as the value for the given table entry. In the 
>> moment you can give one value for all entries generated by geoip, with this 
>> switch set, the output of geoip could look like:
>> 
>> $ geoip -t "DE:BR:US" -x
>> ...
>> table 0 add 93.157.48.0/21 4445
>> table 0 add 93.158.236.0/22 4252
>> table 0 add 93.159.96.0/19 4445
>> table 0 add 93.159.248.0/21 4445
>> table 0 add 93.180.72.0/21 4445
>> table 0 add 93.180.152.0/21 4445
>> table 0 add 93.181.0.0/18 4445
>> table 0 add 93.183.0.0/18 5553
>> ...
>> 
>> Given that ...
>> 0x4445 = 'DE'
>> 0x4252 = 'BR'
>> 0x5553 = 'US'
> 
> well it would have to be the decimal value so DE would be 6869, as while 4445 
> works 444F is a problem :-)

Yes, you're right, I was taken away by the wave of enthusiasm, before thinking 
about the subject up to the end.

> 0x444F would work but we waste even more address space.  You'd have to 
> multiply the numbers by some scaler, because adjacent numbers would not be 
> enough for one rule to do something and another rule to skip on to somewhere 
> else. (well, you could have multiple rules at the same number but that has 
> its limitations.
> The idea would certainly work. it would mean setting aside all  the rules  
> between 6565 and 9090 however.
> A more compact encoding could be something like ((name[0]-'A') * 
> 32)+(name[1]-'A')) multiplied by some 'step' (maybe 10 by default) and offset 
> by a given offset.
> 
> so AF (Afghanistan) would be the first 0*32+5  * 10 would give an offset of 
> 50.. plus a user supplied offset turns it into say, 15050..

I understand the reasons, however, any complicated encoding will defeat the 
idea of the value can be sort of numeric mnemonic for the country code – well, 
so it is. I elaborated on your idea and came-up with the following formula:  
val = (C1-60)*1000 + C2*10 + offset. The offset can be given as the parameter 
to the -x flag.

$ geoip -t "DE:BR:US" -4 -x 30000
...
table 0 add 93.157.48.0/21 38690
table 0 add 93.158.236.0/22 36820
table 0 add 93.159.96.0/19 38690
table 0 add 93.159.248.0/21 38690
table 0 add 93.180.72.0/21 38690
table 0 add 93.180.152.0/21 38690
table 0 add 93.181.0.0/18 38690
table 0 add 93.183.0.0/18 55830
...

The limits (without offset) are:
AA = 5650  -- actually AD = 5680
ZZ = 30900

With this formula, the offset must be less than 34735. Although, this wastes a 
considerable amount of rule number space, the advantage is that the numbers are 
still accessible by mental arithmetic, and the other constraint of having a 
step > 1 is fulfilled as well. Anyway, this one is not graved in stone, we can 
agree on another one.

> or there could be a translation into iso3166 numeric codes where Afghanistan 
> is 004, but then you have the worry of keeping the data up to date as they 
> add new country codes, which in my opinion makes it a bad solution.

Agreed, too much dependencies, let's forget the numeric iso codes.


BTW: The ipdb tools are now IPv6 aware.

$ geoip 2001:1900:2254:206a::50:5
2001:1900:2254:206a::50:5 in 2001:1900:0:0:0:0:0:0 - 
2001:1900:ffff:ffff:ffff:ffff:ffff:ffff in US

$ geoip -t "DE:BR:US" -p
...
...
217.194.64.0/20
217.194.224.0/20
217.195.0.0/20
217.195.32.0/20
217.197.80.0/20
217.198.128.0/20
217.198.240.0/20
217.199.64.0/20
217.199.192.0/20
217.224.0.0/11
2001:400:0:0:0:0:0:0/32
2001:408:0:0:0:0:0:0/32
2001:418:0:0:0:0:0:0/32
2001:420:0:0:0:0:0:0/32
2001:428:0:0:0:0:0:0/32
2001:430:0:0:0:0:0:0/32
2001:438:0:0:0:0:0:0/32
...
...

$ geoip -t "" -p | wc -l
  137097

For processing only IPv4 addresses, add the -4 switch (this reproduces the old 
behaviour)
$ geoip -4 -t "" -p | wc -l
  106637

For processing only IPv6 addresses, add the -6 switch
$ geoip -6 -t "" -p | wc -l
   30460

106637+30460 = 137097

After running 'make install' of the new version, the IP database needs to be 
updated using the ipdb-update.sh script. This will now generate two binary 
database files (*.v4 and *.v6).

Best regards

Rolf

_______________________________________________
freebsd-ipfw@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ipfw
To unsubscribe, send any mail to "freebsd-ipfw-unsubscr...@freebsd.org"

Reply via email to