On 27/07/2016 9:36 PM, Dr. Rolf Jansen wrote:
Am 26.07.2016 um 23:03 schrieb Julian Elischer <[email protected]>:
On 27/07/2016 3:06 AM, Dr. Rolf Jansen wrote:
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

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?
The format for using tables directly is the same as that used for routing 
tables.
…
table 5 add 1.1.1.0/32 1000
…
your application becomes an application for configuring the firewall.
(which you do by feeding commands down a pipe to ipfw, which is started as 
'ipfw -q /dev/stdin')
I finished adding a second usage form for the geoip tool, namely generation of 
ipfw table construction directives filtered by country codes.
wow, wonderful!

with that tool, and ipfw tables we have a fully functional geo blocking/munging solution in about 4 lines of shell script.


______________
$ geoip -h
geoip v1.0.1 (16), Copyright © 2016 Dr. Rolf Jansen

Usage:

1) look-up the country code belonging to an IPv4 address given by the last 
command line argument:

    geoip [-r bstfile] [-h] <dotted IPv4 address>
       <IPv4 address>    a dotted IPv4 address to be looked-up.

2) generate a sorted list of IPv4 address/masklen pairs per country code, 
formatted as ipfw table construction directives:

    geoip -t [CC:DD:EE:..] [-n table number] [-v table value] [-r bstfile] [-h]

       -t [CC:DD:EE:..]  output all IPv4 address/masklen pairs belonging to the 
listed countries, given by 2 letter
                         capital country codes, separated by colon. An empty CC 
list means any country code.
       -n table number   the ipfw table number between 0 and 65534 [default: 0].
       -v table value    the 32-bit unsigned value of the ipfw table entry 
[default: 0].

valid arguments in both usage forms:

       -r bstfile        the path to the binary file with the consolidated IP 
ranges that has been.
                         generated by the 'ipdb' tool [default: 
/usr/local/etc/ipdb/IPRanges/ipcc.bst].
       -h                show these usage instructions.
______________

With that, the ipfw configuration script may contain something alike:

     …
     # allow only web access from DE, BR, US:
     /usr/local/bin/geoip -t DE:BR:US -n 7 | /sbin/ipfw -q /dev/stdin
     /sbin/ipfw -q add 70 deny tcp from not table\(7\) to any 80,443 in recv 
WAN_if setup
     …

OR, the other way around:
     …
     # deny web access from certain disgraceful regions:
     /usr/local/bin/geoip -t KO:TR:SA:RU:GB -n 66 | /sbin/ipfw -q /dev/stdin
     /sbin/ipfw -q add 70 allow tcp from not table\(66\) to any 80,443 in recv 
WAN_if setup
     …
____________


Best regards

Rolf





_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ipfw
To unsubscribe, send any mail to "[email protected]"

Reply via email to